<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Guilherme Gomes</title>
    <description>The latest articles on Forem by Guilherme Gomes (@gguife).</description>
    <link>https://forem.com/gguife</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%2F1943310%2Fc3c8370e-3cd3-404b-8a77-e1f5b85aeb99.jpeg</url>
      <title>Forem: Guilherme Gomes</title>
      <link>https://forem.com/gguife</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gguife"/>
    <language>en</language>
    <item>
      <title>Primeiro mês usando Linux</title>
      <dc:creator>Guilherme Gomes</dc:creator>
      <pubDate>Sun, 16 Mar 2025 07:48:26 +0000</pubDate>
      <link>https://forem.com/gguife/primeiro-mes-usando-linux-4cc3</link>
      <guid>https://forem.com/gguife/primeiro-mes-usando-linux-4cc3</guid>
      <description>&lt;p&gt;Já se passou um mês desde que migrei para o Linux como meu sistema operacional. Então, decidi trazer alguns relatos sobre o porquê estou usando o Linux, qual distro utilizo neste meu início e o que mais estou gostando até agora.&lt;/p&gt;

&lt;p&gt;❓ Por que escolhi o Linux?&lt;br&gt;
Primeiramente, por curiosidade. Nós, que damos nossos primeiros passos na área de desenvolvimento, sempre ouvimos o quão vantajoso é usar o Linux.&lt;br&gt;
Mas, particularmente, sempre tive vontade de aprender Linux, até pelos meus interesses em cybersecurity, usando o próprio Kali Linux na minha VM.&lt;br&gt;
A minha vontade de migrar para o Linux sempre existiu; era só uma questão de tempo para isso acontecer.&lt;/p&gt;

&lt;p&gt;❓ Qual distro utilizo atualmente ?&lt;br&gt;
Atualmente, estou usando o Ubuntu como minha distro principal. Tenho vontade de migrar para outra distribuição futuramente (estou pensando no Arch), mas confesso que estou bem satisfeito e feliz com o Ubuntu, especialmente por ser meus primeiros dias com o Linux. Ele é bem simples e tem me ajudado muito neste começo.&lt;/p&gt;

&lt;p&gt;❤️ O que mais gostei no linux ?&lt;br&gt;
Minha jornada como desenvolvedor tem evoluído muito com o Linux, especialmente por estar 100% no terminal, o que torna tudo mais interessante e produtivo. Estou aprendendo a usar o Vim para aumentar minha produtividade (ainda apanhando bastante, kkkk) e aproveitando ao máximo o Docker e outras ferramentas.&lt;br&gt;
No meu lado de cybersecurity, o Linux oferece mais segurança e uma integração mais natural com os comandos do Kali Linux, além de facilitar o uso de VMs e containers para meus testes e simulações.&lt;/p&gt;

</description>
      <category>developers</category>
      <category>cybersecurity</category>
      <category>ubuntu</category>
      <category>linux</category>
    </item>
    <item>
      <title>Diretórios Linux: Entenda a Base do Sistema</title>
      <dc:creator>Guilherme Gomes</dc:creator>
      <pubDate>Mon, 13 Jan 2025 19:10:00 +0000</pubDate>
      <link>https://forem.com/gguife/o-basico-que-voce-precisa-saber-sobre-os-diretorios-linux-6kh</link>
      <guid>https://forem.com/gguife/o-basico-que-voce-precisa-saber-sobre-os-diretorios-linux-6kh</guid>
      <description>&lt;h2&gt;
  
  
  Estrutura de Diretórios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/&lt;/code&gt; (Diretório raiz)
&lt;/h3&gt;

&lt;p&gt;Diretório principal que contém todos os outros diretórios e arquivos do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/bin&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contém os comandos essenciais executáveis do sistema que podem ser utilizados por usuários. Exemplos:&lt;br&gt;
&lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;chgrp&lt;/code&gt;, &lt;code&gt;chmod&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;dd&lt;/code&gt;, &lt;code&gt;df&lt;/code&gt;, &lt;code&gt;echo&lt;/code&gt;, &lt;code&gt;hostname&lt;/code&gt;, &lt;code&gt;ln&lt;/code&gt;, &lt;code&gt;more&lt;/code&gt;, &lt;code&gt;mount&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;ps&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;rmdir&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;su&lt;/code&gt;, &lt;code&gt;uname&lt;/code&gt;, &lt;code&gt;umount&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/boot&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contém os arquivos para inicialização do sistema.&lt;br&gt;&lt;br&gt;
O &lt;code&gt;/boot&lt;/code&gt; inclui os setores de boot principal e arquivos de mapa de setor. Alguns exemplos:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kernel&lt;/strong&gt;: Componente central do sistema operacional, responsável por gerenciar os recursos do sistema. Serve como a ponte entre software e hardware.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grub&lt;/strong&gt;: Programa que carrega o sistema operacional quando o computador é ligado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/dev&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contém arquivos para dispositivos. Aqui, encontramos arquivos que correspondem ao hardware e podem ser configurados para alterar o funcionamento de um determinado dispositivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/etc&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Concentra arquivos de configuração do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/home&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Diretórios pessoais dos usuários, onde ficam os dados dos usuários comuns do sistema. Cada usuário possui um subdiretório próprio. Para usuários que não são root, a escrita é permitida apenas dentro de seus respectivos subdiretórios.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/lib&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contém as bibliotecas utilizadas pelos programas.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/mnt&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Diretório usado como ponto de montagem de dispositivos.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Equivalente:&lt;/strong&gt; &lt;code&gt;/media&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/media&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Diretório vazio utilizado para montar dispositivos como CD-ROMs, DVDs e pendrives.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/proc&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Armazena informações sobre o Kernel e processos. É um pseudo-sistema de arquivos, ou seja, não existe fisicamente no disco.&lt;br&gt;&lt;br&gt;
É possível ler dados e até alterar o comportamento do Kernel modificando o conteúdo de arquivos em &lt;code&gt;/proc&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/root&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Diretório home do superusuário (root). Dependendo da distribuição, pode ou não estar presente.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/sbin&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ferramentas de administração do sistema. Similar ao &lt;code&gt;/bin&lt;/code&gt;, armazena binários essenciais. O "S" no nome indica "system binaries". Esses programas são geralmente acessíveis apenas pelo administrador do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/tmp&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Diretório para arquivos temporários. Os arquivos armazenados aqui geralmente são apagados a cada reinicialização.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/usr&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contém arquivos pertencentes aos usuários. Alguns subdiretórios importantes:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/usr/bin&lt;/code&gt;&lt;/strong&gt;: Ferramentas auxiliares, como interpretadores de programação (Perl, Python, etc.).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/usr/include&lt;/code&gt;&lt;/strong&gt;: Cabeçalhos e bibliotecas da linguagem C.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/usr/local&lt;/code&gt;&lt;/strong&gt;: Hierarquia para instalação de aplicativos locais no sistema.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/usr/share&lt;/code&gt;&lt;/strong&gt;: Arquivos de leitura somente, independentes de arquitetura.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/usr/src&lt;/code&gt;&lt;/strong&gt;: Pode conter arquivos de código-fonte de programas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/var&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Diretório usado para armazenar informações variáveis sobre o sistema.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>sistema</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
    </item>
    <item>
      <title>HTTP Status Code</title>
      <dc:creator>Guilherme Gomes</dc:creator>
      <pubDate>Sun, 20 Oct 2024 18:23:27 +0000</pubDate>
      <link>https://forem.com/gguife/http-status-code-3n78</link>
      <guid>https://forem.com/gguife/http-status-code-3n78</guid>
      <description>&lt;p&gt;Quando um navegador faz uma solicitação a um serviço web, o servidor responde com um código de status HTTP, indicando o resultado da requisição. Para simplificar e automatizar o desenvolvimento da sua aplicação web, aqui está uma lista dos principais códigos de status HTTP que podem ser retornados.&lt;/p&gt;

&lt;h3&gt;
  
  
  1XX Information
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Código&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descrição&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Continue&lt;/strong&gt;: O servidor recebeu parte da requisição e o cliente pode continuar enviando o restante.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;101&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Switching Protocols&lt;/strong&gt;: O servidor está mudando o protocolo conforme solicitado pelo cliente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;102&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Processing&lt;/strong&gt;: O servidor recebeu a requisição e está processando, mas ainda sem resposta final.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;103&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Early Hints&lt;/strong&gt;: O servidor sugere pré-carregamento de recursos enquanto a resposta final ainda está sendo processada.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2XX Success
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Código&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descrição&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;OK&lt;/strong&gt;: A requisição foi bem-sucedida e o servidor retornou o conteúdo esperado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;201&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Created&lt;/strong&gt;: A requisição foi bem-sucedida e resultou na criação de um novo recurso.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;202&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Accepted&lt;/strong&gt;: A requisição foi aceita para processamento, mas não concluída.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;203&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Non-Authoritative Information&lt;/strong&gt;: O conteúdo devolvido é modificado de uma fonte original.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;204&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No Content&lt;/strong&gt;: A requisição foi bem-sucedida, mas não há conteúdo para enviar na resposta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;205&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Reset Content&lt;/strong&gt;: O servidor solicita que o cliente reinicie a exibição do documento sem conteúdo adicional.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;206&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Partial Content&lt;/strong&gt;: O servidor está enviando parte do conteúdo, conforme a solicitação do cliente (usado para downloads).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;207&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Multi-Status&lt;/strong&gt;: O corpo da mensagem contém informações sobre múltiplos recursos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;208&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Already Reported&lt;/strong&gt;: O recurso foi previamente mencionado em uma resposta anterior (usado em respostas WebDAV).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;226&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;IM Used&lt;/strong&gt;: O servidor completou a requisição usando uma instância do recurso com transformações.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  3XX Redirection
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Código&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descrição&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;300&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Multiple Choices&lt;/strong&gt;: Há várias opções para o recurso solicitado, e o cliente deve escolher uma.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;301&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Moved Permanently&lt;/strong&gt;: O recurso foi movido permanentemente para uma nova URL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;302&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Found&lt;/strong&gt;: O recurso foi temporariamente movido para outra URL, mas no futuro pode voltar para a original.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;303&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;See Other&lt;/strong&gt;: O cliente deve usar uma URL diferente para obter o recurso, geralmente após uma requisição POST.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;304&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Not Modified&lt;/strong&gt;: O recurso não foi modificado desde a última solicitação, então o cliente pode usar sua cópia em cache.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;305&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Use Proxy&lt;/strong&gt;: O recurso solicitado deve ser acessado por meio de um proxy (não recomendado para uso atual).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;306&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Switch Proxy&lt;/strong&gt;: Código não utilizado; reservado para uso futuro.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;307&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Temporary Redirect&lt;/strong&gt;: A solicitação deve ser repetida com uma URL diferente, mas o método HTTP não deve ser alterado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;308&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Permanent Redirect&lt;/strong&gt;: Similar ao 301, mas garante que o método HTTP não seja alterado durante o redirecionamento.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  4XX Client Error
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Código&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descrição&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Bad Request&lt;/strong&gt;: A requisição foi malformada ou inválida, e o servidor não pôde processá-la.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;401&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Unauthorized&lt;/strong&gt;: A requisição requer autenticação, e o cliente não a forneceu ou falhou ao se autenticar.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;403&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Forbidden&lt;/strong&gt;: O servidor entendeu a requisição, mas está recusando permissão para atendê-la.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;404&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Not Found&lt;/strong&gt;: O recurso solicitado não foi encontrado no servidor.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;405&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Method Not Allowed&lt;/strong&gt;: O método HTTP usado não é permitido para o recurso solicitado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;408&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Request Timeout&lt;/strong&gt;: O servidor demorou muito para receber a requisição e a encerrou.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;409&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Conflict&lt;/strong&gt;: A requisição não pode ser concluída devido a um conflito com o estado atual do recurso.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;410&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gone&lt;/strong&gt;: O recurso solicitado não está mais disponível e não será fornecido novamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;429&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Too Many Requests&lt;/strong&gt;: O cliente enviou muitas requisições em um curto período de tempo, resultando em rate limiting.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  5XX Server Error
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Código&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descrição&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;500&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Internal Server Error&lt;/strong&gt;: O servidor encontrou uma condição inesperada que o impediu de atender a requisição.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;501&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Not Implemented&lt;/strong&gt;: O servidor não suporta a funcionalidade necessária para atender a requisição.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;502&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Bad Gateway&lt;/strong&gt;: O servidor recebeu uma resposta inválida ao tentar atuar como gateway ou proxy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;503&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Service Unavailable&lt;/strong&gt;: O servidor está temporariamente indisponível, geralmente devido a manutenção ou sobrecarga.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;504&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gateway Timeout&lt;/strong&gt;: O servidor, atuando como gateway ou proxy, não recebeu uma resposta a tempo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;505&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;HTTP Version Not Supported&lt;/strong&gt;: O servidor não suporta a versão do protocolo HTTP usada na requisição.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>requestforpost</category>
      <category>backend</category>
      <category>statuscodes</category>
    </item>
    <item>
      <title>Padrões e Nomenclaturas no Git: Um Guia Prático</title>
      <dc:creator>Guilherme Gomes</dc:creator>
      <pubDate>Sun, 22 Sep 2024 20:16:35 +0000</pubDate>
      <link>https://forem.com/gguife/padroes-e-nomenclaturas-no-git-um-guia-pratico-3l2f</link>
      <guid>https://forem.com/gguife/padroes-e-nomenclaturas-no-git-um-guia-pratico-3l2f</guid>
      <description>&lt;p&gt;Quando falamos sobre padrões e nomenclaturas no Git, é um ponto importante, embora não seja essencial. No entanto, seguir boas práticas, como manter um padrão consistente e utilizar nomes claros e descritivos nas branches, pode facilitar bastante o desenvolvimento em equipe e a manutenção do projeto. &lt;/p&gt;

&lt;p&gt;Neste artigo, quero compartilhar um guia prático de versionamento e nomenclaturas que adotei e que tem sido útil no meu dia-a-dia!&lt;/p&gt;




&lt;h3&gt;
  
  
  Nomenclaturas para Commits
&lt;/h3&gt;

&lt;p&gt;O commit semântico possui os seguintes elementos estruturais, que informam a intenção do seu commit:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;feat:&lt;/code&gt; Indica que seu código está incluindo um novo recurso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat: adicionar funcionalidade de login com Google
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fix:&lt;/code&gt; Indica que seu commit está solucionando um problema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix: corrigir erro 500 na página de perfil`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;docs:&lt;/code&gt; Indica mudanças na documentação, como no README do seu repositório.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs: atualizar instruções de instalação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;test:&lt;/code&gt; Utilizado quando realizamos alterações em testes, seja criando, alterando ou excluindo testes unitários.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test: adicionar testes para a função de autenticação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;build:&lt;/code&gt;Usado para modificações em arquivos de build e dependências.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build: atualizar dependências no package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;perf:&lt;/code&gt; Identifica alterações de código relacionadas à performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;perf: otimizar consulta ao banco de dados
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;style:&lt;/code&gt; Para alterações relacionadas a aspectos visuais ou de formatação do código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;style: corrigir formatação do código
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;refactor:&lt;/code&gt; Para melhorias na qualidade interna do código, sem alterar sua funcionalidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;refactor: simplificar a lógica de validação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;chore:&lt;/code&gt; Indica atualizações de tarefas de build, configurações de administrador, pacotes, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chore: adicionar arquivo .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;remove:&lt;/code&gt; Indica a exclusão de arquivos, diretórios ou funcionalidades obsoletas ou não utilizadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;remove: remover código não utilizado da API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Nomenclaturas de Branch
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Branch main&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Esta branch contém a versão atual do software em produção. Ela está vinculada a uma pipeline que, a cada push, implementa automaticamente uma nova versão em produção.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Branch dev&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Aqui se concentra o maior fluxo de trabalho e colaboração da equipe. As alterações feitas aqui provavelmente farão parte da próxima versão de lançamento.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Branch release&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Esta branch é usada para preparar o lançamento de uma nova versão, contendo as funcionalidades desenvolvidas que serão implementadas em produção. O nome da branch geralmente segue o formato: &lt;code&gt;release/v2.0.0&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Branch feature&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Uma feature branch identifica o desenvolvimento de uma funcionalidade específica, como por exemplo: &lt;code&gt;feature/nova-funcionalidade&lt;/code&gt;. Ela é uma cópia da branch dev, e várias feature branches podem existir simultaneamente, cada uma dedicada a uma funcionalidade diferente. Após a conclusão do desenvolvimento, a branch é finalizada e o merge é feito com a branch dev.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Branch hotfix&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;A hotfix branch é usada para corrigir bugs urgentes que não podem esperar pela próxima versão. Ela é uma cópia da branch main e segue o formato &lt;code&gt;hotfix/v2.0.0-corrigir-falha-login&lt;/code&gt;. Após a correção, o merge é feito tanto na branch main quanto na dev para manter os repositórios atualizados.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Branch bugfix&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;A bugfix é usada para corrigir bugs de baixa urgência. Ela é uma cópia da branch dev e segue o formato &lt;code&gt;bugfix/ajustar-estilo-pagina-inicial&lt;/code&gt;. Após a correção, o merge é feito na branch dev, e a correção será incluída na próxima release.&lt;/p&gt;




&lt;p&gt;Seguir essas nomenclaturas e padrões não apenas melhora a organização do seu repositório, mas também facilita a colaboração e o entendimento das mudanças feitas ao longo do tempo. Espero que este guia prático ajude você!&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Arquitentando projeto backend</title>
      <dc:creator>Guilherme Gomes</dc:creator>
      <pubDate>Mon, 16 Sep 2024 20:18:44 +0000</pubDate>
      <link>https://forem.com/gguife/arquitentando-um-mini-projeto-38d9</link>
      <guid>https://forem.com/gguife/arquitentando-um-mini-projeto-38d9</guid>
      <description>&lt;h2&gt;
  
  
  Objetivo
&lt;/h2&gt;

&lt;p&gt;Desenvolver um encurtador de URL eficiente e gratuito, adequado para empresas de todos os tamanhos. O encurtador oferece vantagens como a exclusão automática de links maliciosos e de spam, além de fornecer estatísticas detalhadas sobre o desempenho dos links criados, o que permite um acompanhamento completo das interações e acessos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens de utilizar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Facilita o compartilhamento.&lt;/li&gt;
&lt;li&gt;Melhora a experiência do usuário.&lt;/li&gt;
&lt;li&gt;Acompanhamento de métricas -&amp;gt; Um encurtador de links pode registrar métricas de acesso. Como números de cliques, localização geo do usuário, dispositivo utilizado, etc.&lt;/li&gt;
&lt;li&gt;Estética e Organização.&lt;/li&gt;
&lt;li&gt;Prevenção contra quebras de link.&lt;/li&gt;
&lt;li&gt;Uso de nomes Personalizados.&lt;/li&gt;
&lt;li&gt;Redirecionamento Controlado -&amp;gt; URLs encurtadas podem ser redirecionadas a diferentes destinos conforme necessário. Podemos alterar o destino da URL encurtada sem alterar a URL original.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Arquitetando nosso projeto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requerimentos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dada uma URL longa gere uma URL curta única.&lt;/li&gt;
&lt;li&gt;A url gerada não pode ser adivinhada.&lt;/li&gt;
&lt;li&gt;Quando usuário acessa a url curta ele redireciona para a longa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Escopo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Não precisamos nos preocupar com cadastro ou autenticação de usuário.&lt;/li&gt;
&lt;li&gt;Considere usar um UUID para identificar um usuário.&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%2Fimg.notionusercontent.com%2Fs3%2Fprod-files-secure%252F14315d8e-93ff-4725-b525-b987e3ccd164%252F201af4f3-e963-403f-a9d6-89cd571f22ee%252Fimage.png%2Fsize%2Fw%3D2000%3Fexp%3D1726518670%26sig%3DgKDdTAwaI0T2mSUY5zy31EiZ7MnkMwGXG-u3yHS3CJQ" 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%2Fimg.notionusercontent.com%2Fs3%2Fprod-files-secure%252F14315d8e-93ff-4725-b525-b987e3ccd164%252F201af4f3-e963-403f-a9d6-89cd571f22ee%252Fimage.png%2Fsize%2Fw%3D2000%3Fexp%3D1726518670%26sig%3DgKDdTAwaI0T2mSUY5zy31EiZ7MnkMwGXG-u3yHS3CJQ" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vários servidores&lt;/strong&gt; (evita problemas quando algum servidor cair).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load balancer (&lt;/strong&gt;faz um gerenciamento das request feitas pelo usuário, escolhendo para qual servidor vai encaminhar).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Modelagem do nosso Banco de dados
&lt;/h3&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%2Fimg.notionusercontent.com%2Fs3%2Fprod-files-secure%252F14315d8e-93ff-4725-b525-b987e3ccd164%252F9e4ba306-744d-40f0-b345-87635489ae87%252Fimage.png%2Fsize%2Fw%3D2000%3Fexp%3D1726518609%26sig%3DA4EKeZ1TzuQ4gNyH4aGPpYSFiL0S_8C6Qmv4Hag5Axo" 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%2Fimg.notionusercontent.com%2Fs3%2Fprod-files-secure%252F14315d8e-93ff-4725-b525-b987e3ccd164%252F9e4ba306-744d-40f0-b345-87635489ae87%252Fimage.png%2Fsize%2Fw%3D2000%3Fexp%3D1726518609%26sig%3DA4EKeZ1TzuQ4gNyH4aGPpYSFiL0S_8C6Qmv4Hag5Axo" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;URL → Representa a URL original e a URL encurtada, incluindo suas informações, data de criação, data de expiração(opcional) e número de cliques.&lt;/p&gt;

&lt;p&gt;Click → Registra cada clique em uma URL encurtada, data do clique, incluindo endereço IP e o agente de usuário(software que o cliente está usando) para fins de análise.&lt;/p&gt;

&lt;p&gt;A relação entre as tabelas &lt;code&gt;urls&lt;/code&gt; e vé de um para muitos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;urls&lt;/code&gt; (1) -- (N) &lt;code&gt;clicks&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1 URL&lt;/strong&gt; pode ter &lt;strong&gt;N Cliques&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cada registro na tabela &lt;code&gt;clicks&lt;/code&gt; deve referenciar um registro na tabela &lt;code&gt;urls&lt;/code&gt; usando o &lt;code&gt;url_id&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Endpoints
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;**POST /urls&lt;/em&gt;*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;body:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"original_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://gguifedev.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Reponse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Body:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x743Y44"&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;💡Endpoint registra url original e retorna um hash → Código que identifica a url encurtada.&lt;/p&gt;

&lt;p&gt;*GET   /:hash&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="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"original_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://gguifedev.com"&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;💡Redirect / Endpoint para redirecionar URLs encurtadas para seus destinos originais.&lt;/p&gt;

&lt;p&gt;*POST /clicks&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="err"&gt;Request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;body:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ip_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user_agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;BIGINT&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"clicked_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-09-10T12:34:56Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ip_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user_agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡Endpoint usado para registrar um novo clique em uma URL encurtada.&lt;/p&gt;

&lt;p&gt;*GET /clicks/:id&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"clicked_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-09-10T12:34:56Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ip_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user_agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"&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;💡Endpoint que permite obter informações sobre um clique específico.&lt;/p&gt;

&lt;p&gt;*GET /urls/clicks&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"clicked_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-09-10T12:34:56Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ip_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"user_agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mais&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cliques&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;💡Endpoint lista todos os cliques associados a uma URL encurtada específica.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reinicio automático de uma aplicação Nodejs com Docker</title>
      <dc:creator>Guilherme Gomes</dc:creator>
      <pubDate>Mon, 09 Sep 2024 22:46:07 +0000</pubDate>
      <link>https://forem.com/gguife/reiniciando-automaticamente-uma-aplicacao-nodejs-com-docker-usando-nodemon-1dlk</link>
      <guid>https://forem.com/gguife/reiniciando-automaticamente-uma-aplicacao-nodejs-com-docker-usando-nodemon-1dlk</guid>
      <description>&lt;p&gt;Este Artigo tem objetivo agilizar o desenvolvimento de uma aplicação Nodejs sem ter a necessidade de subir o container a cada alteração feita no código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nodemon
&lt;/h2&gt;

&lt;p&gt;Nodemon é uma ferramenta para Node.js que reinicia automaticamente a aplicação sempre que detecta alterações nos arquivos do projeto, facilitando o desenvolvimento. Para usá-lo, podemos instalar o nodemon como uma dependência global ou localmente no projeto. Depois, basta ajustar o script no &lt;code&gt;package.json&lt;/code&gt;, trocando o comando &lt;code&gt;node&lt;/code&gt; por &lt;code&gt;nodemon&lt;/code&gt; para que ele gerencie a execução da aplicação automaticamente. &lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação Global
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g nodemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalação Local
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev nodemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  package.json
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "scripts": {
    "start": "nodemon index.js"
  }
}

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  DockerFile
&lt;/h2&gt;

&lt;p&gt;O Dockerfile é um arquivo de configuração onde definimos todas as intruções para criar uma imagem Docker. Essa imagem servirá como modelo para criação de containers.&lt;br&gt;
Vamos realizar a criação de uma imagem do Docker onde será executado na aplicação, que irá seguir as definições do nosso Dockerfile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Usar a imagem base node:16-alpine
FROM node:16-alpine

# Definir o diretório de trabalho dentro do container
WORKDIR /app

# Copiar o arquivo package.json para o diretório de trabalho
COPY package*.json ./

# Instalar as dependências da aplicação
RUN npm install

# Copiar o restante dos arquivos da aplicação para o diretório de trabalho
COPY . .

# Expor a porta que a aplicação irá rodar (ex: 3000)
EXPOSE 3000

# Comando para iniciar a aplicação
CMD ["npm", "start"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Docker-compose
&lt;/h2&gt;

&lt;p&gt;Docker-compose é uma ferramenta que ajuda a definir e compartilhar aplicativos entre vários containers. Com o docker-compose, você pode definir todos os serviços que compõem a sua aplicação como (Servidores web, banco de dados, cache) em um único arquivo &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos criar um arquivo &lt;code&gt;docker-compose.yml&lt;/code&gt; para definir esses serviços e gerenciar eles com mais facilidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.8'  

services:
  app:
    image: node:16-alpine  
    working_dir: /app  
    volumes:
      - .:/app  
    ports:
      - "3000:3000"  
    environment:
      - NODE_ENV=development  
    depends_on:
      - db  
    command: npm start 

  db:
    image: mysql:8.0  
    environment:
      MYSQL_ROOT_PASSWORD: example  
      MYSQL_DATABASE: my_database  
    volumes:
      - db_data:/var/lib/mysql  

volumes:
  db_data:

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;version: '3.8'&lt;/code&gt;&lt;/strong&gt;: Especifica a versão do Docker Compose.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;services:&lt;/code&gt;&lt;/strong&gt;: Define os serviços da aplicação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;app:&lt;/code&gt;&lt;/strong&gt;: Serviço Node.js.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;image:&lt;/code&gt;&lt;/strong&gt;: Usa a imagem &lt;code&gt;node:16-alpine&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;working_dir:&lt;/code&gt;&lt;/strong&gt;: Define o diretório de trabalho no container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;volumes:&lt;/code&gt;&lt;/strong&gt;: Sincroniza o diretório atual com o container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ports:&lt;/code&gt;&lt;/strong&gt;: Mapeia a porta &lt;code&gt;3000&lt;/code&gt; do host para o container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;environment:&lt;/code&gt;&lt;/strong&gt;: Define variáveis de ambiente, como &lt;code&gt;NODE_ENV&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;depends_on:&lt;/code&gt;&lt;/strong&gt;: Estabelece dependência do serviço &lt;code&gt;db&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;command:&lt;/code&gt;&lt;/strong&gt;: Executa o comando &lt;code&gt;npm start&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;db:&lt;/code&gt;&lt;/strong&gt;: Serviço MySQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;image:&lt;/code&gt;&lt;/strong&gt;: Usa a imagem &lt;code&gt;mysql:8.0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;environment:&lt;/code&gt;&lt;/strong&gt;: Configura a senha do MySQL e o banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;volumes:&lt;/code&gt;&lt;/strong&gt;: Monta um volume para persistência dos dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;volumes:&lt;/code&gt;&lt;/strong&gt;: Define o volume para armazenar dados do banco de dados.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Por fim, executamos o comando:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Rodamos uma aplicação em Nodejs em um container Docker e, com a ajuda do nodemon, somo capazes de desenvolver nossa aplicação executada dentro do container sem a necessidade de subir o container toda vez que é feita alguma alteração.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>LocalStorage, SessionStorage e Cookies</title>
      <dc:creator>Guilherme Gomes</dc:creator>
      <pubDate>Mon, 02 Sep 2024 00:48:35 +0000</pubDate>
      <link>https://forem.com/gguife/localstorage-sessionstorage-e-cookies-como-funcionam-e-quando-utiliza-los-51fp</link>
      <guid>https://forem.com/gguife/localstorage-sessionstorage-e-cookies-como-funcionam-e-quando-utiliza-los-51fp</guid>
      <description>&lt;p&gt;No desenvolvimento web, é de grande importância ter conhecimento e habilidade ao gerenciar os dados do lado do cliente. Muitos desenvolvedores utilizam &lt;strong&gt;localStorage&lt;/strong&gt;, &lt;strong&gt;sessionStorage&lt;/strong&gt; e &lt;strong&gt;cookies&lt;/strong&gt; para armazenar esses dados no navegador do usuário. Embora esses três mecanismos tenham propósitos semelhantes, há diferenças em termos de capacidade, durabilidade e seus casos de uso. Neste artigo, vamos explorar essas diferenças.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. LocalStorage: Armazenamento persistente no lado do cliente&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Propósito:&lt;/strong&gt; É usado para armazenar dados no cliente que persistem mesmo após o fechamento do navegador, sendo ideal para os dados que precisam ser mantidos entre múltiplas sessões.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacidade:&lt;/strong&gt; Oferece um espaço de armazenamento considerável, geralmente 10MB por domínio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durabilidade:&lt;/strong&gt; Os dados armazenados permanecem disponíveis até serem excluídos pelo usuário ou pela aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo:&lt;/strong&gt;  Suponha que você tenha um aplicativo de notas. Você pode usar o localStorage para salvar as notas do usuário para que elas sejam preservadas em todas as visitas.&lt;/li&gt;
&lt;/ul&gt;

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




&lt;p&gt;&lt;strong&gt;2. SessionStorage: Armazenamento temporário com base na sessão&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Propósito:&lt;/strong&gt; Também armazena os dados do cliente, porém, a duração da sessão da página é limitada. Isso significa que os dados são apagados quando o usuário fecha a aba ou o navegador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacidade:&lt;/strong&gt; Oferece cerca de 5MB de armazenamento por domínio, suficiente para dados temporários.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durabilidade:&lt;/strong&gt; Os dados estão disponíveis apenas durante a sessão atual, torna-se perfeito para armazenar informações que não precisam persistir além da sessão atual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo:&lt;/strong&gt; Imagine um site de e-commerce que precisa armazenar temporariamente os itens adicionados ao carrinho de compras durante a navegação. Você pode usar o sessionStorage para garantir que, se o usuário navegar para outra página, os itens do carrinho não sejam perdidos.&lt;/li&gt;
&lt;/ul&gt;

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




&lt;p&gt;&lt;strong&gt;3. Cookies: Armazenamento de pequenas porções de dados com interação ao servidor&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Propósito:&lt;/strong&gt; Cookies são usados para armazenar pequena porções de dados que precisam ser enviados para o servidor com solicitações HTTP. Eles são frequentemente usados para rastrear sessões de usuários, armazenar tokens de autenticação e lembrar configurações de usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacidade:&lt;/strong&gt; Limitado a 4KB por cookie, mas é possível armazenar múltiplos tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durabilidade:&lt;/strong&gt; Cookies podem expirar ao final de uma sessão ou persistir por uma duração específica, o que torna eles versáteis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo:&lt;/strong&gt; Para implementar uma notificação de consentimento de cookies que só aparece uma vez, você pode usar cookies para armazenar a preferência do usuário.&lt;/li&gt;
&lt;/ul&gt;

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




&lt;p&gt;&lt;strong&gt;Quando usar cada um desses mecanismos de armazenamento ?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;LocalStorage:&lt;/strong&gt; Use quando precisar armazenar grande quantidade de dados que devem persistir em várias sessões.&lt;br&gt;
&lt;strong&gt;SessionStorage:&lt;/strong&gt; Ideal para dados temporários que devem persistir apenas durante a sessão do usuário.&lt;br&gt;
&lt;strong&gt;Cookies:&lt;/strong&gt; Melhor para armazenar pequenas porções de dados que precisam ser enviados para o servidor com solicitações HTTP.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;br&gt;
Entender as diferenças entre eles irá te ajudar muito na escolha certa para o uso em suas aplicações. Cada um tem suas próprias vantagens e limitações, tendo o conhecimento das diferenças irá ajudar você a construir aplicações mais eficientes para o usuário.&lt;br&gt;
Tendo o conhecimento e dominando está ferramentas, você estará preparado para gerenciar o armazenamento de dados do lado do cliente em seu próximo projeto, trazendo uma experiência mais fluída para os seus usuários.&lt;/p&gt;

&lt;p&gt;Linkedin Profile: &lt;a href="https://www.linkedin.com/in/gguife/" rel="noopener noreferrer"&gt;Guilherme Gomes&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
