<?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: Starch1</title>
    <description>The latest articles on DEV Community by Starch1 (@starch1).</description>
    <link>https://dev.to/starch1</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%2F1256628%2Fdb15b522-2768-47f2-b08c-66930a896068.jpg</url>
      <title>DEV Community: Starch1</title>
      <link>https://dev.to/starch1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/starch1"/>
    <language>en</language>
    <item>
      <title>Easy setup Elixir / Erlang OTP using mise</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Mon, 17 Feb 2025 15:22:01 +0000</pubDate>
      <link>https://dev.to/starch1/easy-setup-elixir-erlang-otp-using-mise-5ffm</link>
      <guid>https://dev.to/starch1/easy-setup-elixir-erlang-otp-using-mise-5ffm</guid>
      <description>&lt;h2&gt;
  
  
  First, what is &lt;a href="https://github.com/jdx/mise" rel="noopener noreferrer"&gt;mise&lt;/a&gt;?
&lt;/h2&gt;

&lt;p&gt;Straight to the point, &lt;strong&gt;mise-en-place&lt;/strong&gt; (or simply mise) is a modern dev-tool manager that simplifies managing multiple versions of programming languages and development tools.&lt;/p&gt;

&lt;p&gt;Just like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;asdf&lt;/strong&gt; manages versions of development tools,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;direnv&lt;/strong&gt; manages environment variables dynamically,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;make&lt;/strong&gt; automates development tasks,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;mise&lt;/strong&gt; combines version management with a seamless experience for developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why should I use mise instead of ASDF (or others)?
&lt;/h3&gt;

&lt;p&gt;While &lt;strong&gt;asdf&lt;/strong&gt; is a well-known tool, &lt;strong&gt;mise&lt;/strong&gt; offers some advantages that might make it a better fit for your workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;All-in-One Solution:&lt;/strong&gt; mise provides a unified experience, reducing the need for additional plugins and manual setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Performance:&lt;/strong&gt; It’s optimized for speed, making tool switching and environment loading faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compatibility:&lt;/strong&gt; It supports &lt;code&gt;.tool-versions&lt;/code&gt; files (used by asdf), making migration easy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Configuration:&lt;/strong&gt; Unlike asdf, mise is designed with sane defaults and minimal configuration hassle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declarative &amp;amp; Reproducible Environments:&lt;/strong&gt; Define tools per project with a single file, making onboarding and collaboration smoother.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How does mise work?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;mise&lt;/strong&gt; works by reading configuration files (like &lt;code&gt;.tool-versions&lt;/code&gt; or &lt;code&gt;.mise.toml&lt;/code&gt;) and ensuring that the correct versions of tools are available in your shell environment. It integrates seamlessly with popular shells like &lt;strong&gt;bash, zsh, and fish&lt;/strong&gt;, making it easy to use across different systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation &amp;amp; First Steps
&lt;/h3&gt;

&lt;p&gt;To install &lt;strong&gt;mise&lt;/strong&gt;, simply run:&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;-fsSL&lt;/span&gt; https://mise.run/install.sh | sh &lt;span class="c"&gt;#On linux OS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you are using Homebrew&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;After installation, you can add it to your shell profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eval "$(mise activate zsh)" #Replace `zsh` with your shell if needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And last, activate:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Check if everything is right:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Install a tool (e.g., Elixir, because Elixir is great):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise use &lt;span class="nt"&gt;--global&lt;/span&gt; elixir@latest erlang@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the installed tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you might have something 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;Tool    Version        Source                      Requested
elixir  1.18.2-otp-27  ~/.config/mise/config.toml  latest
erlang  27.2.2         ~/.config/mise/config.toml  latest
node    22.14.0        ~/.config/mise/config.toml  22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;strong&gt;mise&lt;/strong&gt;, managing development environments becomes faster, easier, and more efficient.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>erlang</category>
      <category>productivity</category>
    </item>
    <item>
      <title>DeepSeek e a Descentralização</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Tue, 28 Jan 2025 11:45:37 +0000</pubDate>
      <link>https://dev.to/starch1/deepseek-e-a-descentralizacao-1fmf</link>
      <guid>https://dev.to/starch1/deepseek-e-a-descentralizacao-1fmf</guid>
      <description>&lt;h3&gt;
  
  
  O que é a DeepSeek?
&lt;/h3&gt;

&lt;p&gt;Se você têm estado online ou na bolha dev, deve ter visto alguém falar sobre a nova corrida espacial(Só que dessa vez, de IAs) da geração atual, então, DeepSeek veio para desbancar qualquer oponente até então.&lt;/p&gt;

&lt;p&gt;DeepSeek é uma IA que está revolucionando a forma como pensamos sobre o poder computacional e o processamento de dados. Diferente dos modelos tradicionais de IA, que dependem de servidores centralizados e grandes corporações, a DeepSeek opera em uma rede descentralizada. Isso significa que o poder de processamento e os dados são distribuidos entra vários nós na rede, eliminando a necessidade de controle centralizado.&lt;br&gt;
Em outro artigo eu expliquei  &lt;a href="https://dev.to/starch1/como-redes-peer-to-peer-funcionam-3hai"&gt;Como redes P2P funcionam&lt;/a&gt;, se você ainda não sabe, dá uma conferida&lt;/p&gt;

&lt;h3&gt;
  
  
  Como funciona essa descentralização na DeepSeek?
&lt;/h3&gt;

&lt;p&gt;Para entender a descentralização da DeepSeek, vamos comparar com o modelo tradicional de IA:&lt;/p&gt;

&lt;h6&gt;
  
  
  Modelo Tradicional
&lt;/h6&gt;

&lt;p&gt;No modelo centralizado, os dados e o processamento são controlados por um servidor principal. Por exemplo, quando você faz uma pergunta a um assistente virtual, a requisição é enviada para um servidor central, que processa a informação e retorna a resposta.&lt;/p&gt;

&lt;h6&gt;
  
  
  Modelo Descentralizado
&lt;/h6&gt;

&lt;p&gt;Na DeepSeek, não há um servidor central. Em vez disso, a rede é composta por vários nós (peers), onde cada nó pode atuar tanto como cliente quanto como servidor. Quando você faz uma requisição, ela é processada por múltiplos nós na rede, que trabalham juntos para fornecer a resposta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens da descentralização.
&lt;/h3&gt;

&lt;h6&gt;
  
  
  Segurança e privacidade
&lt;/h6&gt;

&lt;p&gt;Como os dados são distribuídos, não há um único ponto de falha ou um repositório central que possa ser hackeado. Isso reduz significativamente os riscos de vazamentos de dados e aumenta a privacidade dos usuários.&lt;/p&gt;

&lt;h6&gt;
  
  
  Resistencia a falhas
&lt;/h6&gt;

&lt;p&gt;Se um nó da rede falhar, outros nós continuam operando. Isso torna a DeepSeek muito mais resiliente do que sistemas centralizados, que podem falhar completamente se o servidor principal cair.&lt;/p&gt;

&lt;h6&gt;
  
  
  Transparência e confiança
&lt;/h6&gt;

&lt;p&gt;A DeepSeek democratiza o acesso à IA, permitindo que mais pessoas e organizações participem da rede. Isso é especialmente importante para comunidades ou regiões que antes não tinham recursos para investir em tecnologia de ponta.&lt;/p&gt;

&lt;h6&gt;
  
  
  Acesso democratico
&lt;/h6&gt;

&lt;p&gt;A DeepSeek democratiza o acesso à IA, permitindo que mais pessoas e organizações participem da rede. Isso é especialmente importante para comunidades ou regiões que antes não tinham recursos para investir em tecnologia de ponta.&lt;/p&gt;

&lt;h6&gt;
  
  
  Inovação contínua
&lt;/h6&gt;

&lt;p&gt;A natureza descentralizada da DeepSeek incentiva a colaboração e a inovação. Desenvolvedores e pesquisadores de todo o mundo podem contribuir para o ecossistema, criando soluções personalizadas e impulsionando o avanço da tecnologia.&lt;/p&gt;

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

&lt;p&gt;A DeepSeek representa um avanço significativo no mundo da inteligência artificial, mostrando que a descentralização não é apenas uma tendência, mas uma necessidade para um futuro mais seguro, transparente e inclusivo. Com sua abordagem inovadora, a DeepSeek está abrindo caminho para uma nova era de tecnologia, onde o poder da IA está ao alcance de todos.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deepseek</category>
      <category>programming</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Como redes peer-to-peer funcionam?</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Tue, 14 Jan 2025 19:24:25 +0000</pubDate>
      <link>https://dev.to/starch1/como-redes-peer-to-peer-funcionam-3hai</link>
      <guid>https://dev.to/starch1/como-redes-peer-to-peer-funcionam-3hai</guid>
      <description>&lt;h2&gt;
  
  
  O que é peer-to-peer?
&lt;/h2&gt;

&lt;p&gt;O modelo &lt;strong&gt;peer-to-peer&lt;/strong&gt; (P2P) é uma arquitetura de rede que permite a troca direta de dados entre dispositivos, eliminando a necessidade de servidores centralizados. Essa abordagem descentralizada tem sido amplamente utilizada em diversas áreas, como compartilhamento de arquivos, sistemas financeiros, e até mesmo em aplicações de comunicação. &lt;br&gt;
Vale pontuar que em arquiteturas baseadas em servidores, o ciclo é: Cliente faz uma requisição &amp;gt; Servidor responde. E a rede precisa de um servidor principal. &lt;br&gt;
Enquanto em uma conexão P2P, todos os peers trabalham como clientes e servidores e a conexão é organizada de forma descentralizada. &lt;/p&gt;

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

&lt;h3&gt;
  
  
  Como Funciona o P2P?
&lt;/h3&gt;

&lt;p&gt;Primeiro, vamos pontuar como uma conexão baseada em servidores trabalha.&lt;br&gt;
Quando estamos acessando algum conteúdo, como uma stream na Twitch, por exemplo, o seu celular(Ou PC) trabalha como o Cliente, então você abre o app escolhe o streamer que quer assistir e o app faz uma requisição pro servidor, o servidor recebe esta requisição e responde com o conteúdo que você quer assistir no seu dispositivo. &lt;/p&gt;

&lt;p&gt;Em uma rede P2P, cada dispositivo conectado à rede  – conhecido como &lt;em&gt;peer&lt;/em&gt; (ou par) – pode atuar tanto como cliente quanto como servidor. Isso significa que os &lt;em&gt;peers&lt;/em&gt; podem tanto consumir quanto fornecer recursos, como dados, armazenamento e poder de processamento. Essa caracterização contrasta com o modelo tradicional cliente-servidor, em que o cliente solicita serviços de um servidor central.&lt;/p&gt;

&lt;p&gt;Mas se nós quisermos fazer a mesma request em uma arquitetura P2P, ao invés de enviar a requisição pro servidor central, seu celular(Ou PC) vai simultaneamente enviar requisições para vários outros dispositivos (Outros peers) dentro da rede. &lt;/p&gt;

&lt;p&gt;Então, cada peer vai responder com parte do video. Isso significa que ao invés de fazer o download do video inteiro de uma única fonte você vai receber diferentes partes de várias fontes da rede&lt;/p&gt;

&lt;p&gt;Ao mesmo tempo que o seu dispositivo recebe partes do vídeo, ele vai começar a compartilhar estas partes com outros clientes que estiverem buscando o mesmo conteúdo.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Tipos de rede P2P
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Rede estruturada
&lt;/h4&gt;

&lt;p&gt;As informações são guardadas em um DHT (Distributed Hash Table), permitindo pesquisas específicas e respostas baseadas em índices. Geralmente, essas redes são mais eficientes e escaláveis para ambientes com um grande número de nós.&lt;/p&gt;

&lt;h4&gt;
  
  
  Redes não estruturadas
&lt;/h4&gt;

&lt;p&gt;As redes P2P não estruturadas não possuem uma organização pré-definida entre os nós. Qualquer nó pode atuar como cliente ou servidor, conectando-se de maneira arbitrária. Essas redes são mais simples de configurar, mas podem enfrentar dificuldades em localizar recursos específicos em grandes redes, especialmente sob alta carga de tráfego.&lt;/p&gt;

&lt;h4&gt;
  
  
  Redes híbridas
&lt;/h4&gt;

&lt;p&gt;Redes híbridas combinam características de redes estruturadas e não estruturadas. Elas geralmente contam com nós superpoderosos (supernós) que desempenham papéis de coordenação, como indexação de conteúdo ou gerenciamento de conexões. Essa abordagem busca aproveitar a eficiência das redes estruturadas e a simplicidade das não estruturadas, oferecendo uma solução equilibrada entre desempenho e flexibilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beleza, mas por que usar P2P, quais as vantagens?
&lt;/h3&gt;

&lt;p&gt;Se eu ainda não te convenci, continua lendo.&lt;/p&gt;

&lt;h6&gt;
  
  
  Segurança
&lt;/h6&gt;

&lt;p&gt;Como redes P2P não possuem um servidor principal(Na maioria dos casos), elas não podem ser hackeadas facilmente, mesmo se um dos peers for atacado, o impacto no sistema é minimo&lt;/p&gt;

&lt;h6&gt;
  
  
  Escalabilidade
&lt;/h6&gt;

&lt;p&gt;Quanto mais peers interagirem com nossa rede, mais peers trabalham como servidores. Considerando isto, a capacidade de uma rede P2P é ilimitada.&lt;/p&gt;

&lt;h6&gt;
  
  
  Flexibilidade
&lt;/h6&gt;

&lt;p&gt;Como mencionei, existem vários tipos de rede P2P, dependendo dos nossos requisitos nós podemos escolher e implementar uma estrutura que cabe melhor na nossa aplicação.&lt;/p&gt;

&lt;p&gt;E eu acho que é isso :). Espero que eu tenho te ajudado a entender melhor sobre redes P2P. Se em algum momento eu errei, pode me corrigir, se precisar de ajuda para entender algo melhor, sinta-se livre para entrar em contato :)&lt;/p&gt;

</description>
      <category>p2p</category>
      <category>programming</category>
      <category>backend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Genserver e OTP</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Fri, 20 Sep 2024 20:03:45 +0000</pubDate>
      <link>https://dev.to/starch1/genserver-e-otp-3d7h</link>
      <guid>https://dev.to/starch1/genserver-e-otp-3d7h</guid>
      <description>&lt;h3&gt;
  
  
  Elixir e seus processos
&lt;/h3&gt;

&lt;p&gt;Elixir é uma linguagem de programação funcional que roda na Erlang VM, a BEAM, conhecida pela capacidade de construir sistemas distribuídos, concorrentes e bastante resilientes. Um dos conceitos em Elixir pra lidar com concorrência e estado é o GenServer. &lt;/p&gt;

&lt;p&gt;Nesse artigo vamos destrinchar o GenServer, entender por que ele é útil e como implementá-lo. &lt;/p&gt;

&lt;p&gt;Se você não sabe o que é &lt;a href="https://dev.to/starch1/iniciando-na-programacao-funcional-1o5p"&gt;Programação funcional&lt;/a&gt; ou &lt;a href="https://dev.to/starch1/embarcando-no-elixir-mix-e-ecto-2eg4"&gt;Elixir&lt;/a&gt;, eu já escrevi um pouco sobre ambos, dá uma lida, medita um pouco e depois vem aqui. &lt;/p&gt;

&lt;h4&gt;
  
  
  Processos em Elixir
&lt;/h4&gt;

&lt;p&gt;Antes de entrar em outros tópicos eu quero falar um pouco sobre os processos em Elixir a fim de facilitar a leitura sobre os outros tópicos. &lt;/p&gt;

&lt;p&gt;Processos em Elixir são parecidos com &lt;a href="https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html" rel="noopener noreferrer"&gt;threads virtuais&lt;/a&gt; onde a VM da linguagem é quem gerencia os processos, a BEAM cria e gerencia os processos Elixir, que são internamente mapeados para um thread do sistema operacional, mas os processos em Elixir não estão vinculados a nenhum thread do sistema operacional e são completamente gerenciados pela BEAM. Cada processo inicialmente ocupa um espaço pequeno  e com isso criar um processo é muito rápido porque não requer 'intervenção' direta do sistema operacional. &lt;/p&gt;

&lt;p&gt;isso significa que você pode criar milhares ou até mesmo milhões de processos simultaneamente sem sobrecarregar significativamente o sistema. &lt;/p&gt;

&lt;h3&gt;
  
  
  Genserver
&lt;/h3&gt;

&lt;p&gt;Basicamente GenSever (Ou Generic Server) é um processo em Erlang/Elixir que executa em um loop infinito que pode receber, enviar mensagens e gerenciar estados.&lt;/p&gt;

&lt;p&gt;Ele é construído em cima de vários conceitos relacionados ao primitivo de concorrência, os processos, como criação de processos, registro de processos, vinculação de processos, passagem de mensagens, envio de mensagens síncronas, gerenciamento de estado usando recursão do bloco de recebimento, etc. Algumas das principais aplicações do GenServer são a criação de processos de servidor de longa duração que gerenciam estado, respondem a solicitações de forma síncrona e assíncrona, suportam resiliência via supervisores, fornecem rastreamento, depuração, monitoramento, atualização de estado durante troca de código em execução e capacidades de relatório de erros.&lt;/p&gt;

&lt;p&gt;Erlang tem um modulo chamado &lt;code&gt;:gen_server&lt;/code&gt; que define um numero de funções que devem ser implementadas pelo módulo "generic server". Se você estiver familiarizado com outras linguagens de programação, &lt;code&gt;:gen_server&lt;/code&gt; é como uma interface, em Erlang, um módulo define quais funções devem ser implementadas por outros módulos, e isso é chamado de &lt;em&gt;behavior&lt;/em&gt; ou comportamento. &lt;/p&gt;

&lt;p&gt;Em Elixir temos o módulo &lt;code&gt;GenServer&lt;/code&gt; que diferente do módulo&lt;code&gt;:gen_server&lt;/code&gt; do Erlang, o &lt;code&gt;GenServer&lt;/code&gt; é um módulo que você implementa através da macro &lt;code&gt;use&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;SomeGenericModule&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basicamente quando você usa &lt;code&gt;use GenServer&lt;/code&gt;, o Elixir trás por padrão várias implementações do módulo &lt;code&gt;:gen_server&lt;/code&gt;, isso permite que você implementa apenas as funções necessárias no seu módulo, enquanto pode deixar o restante das funções retornar os padrões do &lt;code&gt;GenServer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Algumas das características mais importantes do GenServer são:&lt;/p&gt;

&lt;h6&gt;
  
  
  Comunicação síncrona e assíncrona:
&lt;/h6&gt;

&lt;p&gt;Processos podem se comunicar através de mensagens síncronas, enviando uma mensagem e esperando a resposta, ou assíncrona enviando mensagens, independente de ter um retorno ou não. &lt;/p&gt;

&lt;h6&gt;
  
  
  Supervisão e tolerância a erros:
&lt;/h6&gt;

&lt;p&gt;Processos GenServer são frequentemente usados com árvores de supervisores, permitindo que eles possam ser supervisionados e reiniciados quando necessário.&lt;/p&gt;

&lt;h6&gt;
  
  
  Tratamento de mensagens:
&lt;/h6&gt;

&lt;p&gt;Os processos recebem mensagens de forma assíncrona e as tratam usando correspondência de padrões no conteúdo da mensagem. O comportamento do servidor pode ser definido com base na mensagem recebida.&lt;/p&gt;

&lt;h3&gt;
  
  
  OTP
&lt;/h3&gt;

&lt;p&gt;A sigla significa 'Open Telecom Platform', mas hoje em dia OTP não é mais algo exclusivo da Telecom.  OTP é basicamente uma coleção de bibliotecas padrões de projeto e diretrizes de arquitetura para o desenvolvimento de sistemas em Erlang e Elixir. OTP oferece uma abordagem estruturada para construir sistemas distribuídos e concorrentes, incorporando conceitos como processos leves (também conhecidos como "processos Erlang")&lt;/p&gt;

&lt;h3&gt;
  
  
  Modelo de ator
&lt;/h3&gt;

&lt;p&gt;Em Elixir, cada ator é um processo isolado(Nesse ponto você já deve ter notado que em Elixir tudo é função / processo) e independente que executa sua lógica de forma concorrente em relação a outros atores. Essa abordagem é altamente escalável, já que permite que centenas, milhares ou até mesmo milhões de atores coexistam e cooperem em um sistema, sem a necessidade de preocupação com a sincronização manual de threads ou locks.&lt;/p&gt;

&lt;p&gt;Cada ator possui um identificador único, o PID (identificador de processo), que permite enviar mensagens para ele de forma direta. As mensagens são enfileiradas em uma 'mailbox' associada a cada ator, garantindo que as mensagens sejam processadas de forma sequencial e na ordem em que foram recebidas. Isso promove uma comunicação assíncrona entre os atores, evitando bloqueios desnecessários e melhorando a eficiência do sistema.&lt;/p&gt;

&lt;p&gt;Além disso, o modelo de ator em Elixir é construído sobre o conceito de imutabilidade e isolamento de estado. Cada ator possui seu próprio estado interno, que só pode ser modificado através do processamento de mensagens. Isso simplifica a construção de sistemas concorrentes, reduzindo a necessidade de compartilhamento de estado e eliminando condições de corrida e problemas de concorrência.&lt;/p&gt;

&lt;p&gt;Vamos brincar um pouco.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GenericActor1&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start_link&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__MODULE__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;name:&lt;/span&gt; &lt;span class="bp"&gt;__MODULE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;GenericActor2&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="ss"&gt;name:&lt;/span&gt; &lt;span class="no"&gt;GenericActor2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;schedule_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;handle_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;io_pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&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="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Actor 1 received from &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;io_pid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;schedule_message&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="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:noreply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;schedule_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;Process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:send_ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GenericActor2&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;GenServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__MODULE__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;name:&lt;/span&gt; &lt;span class="bp"&gt;__MODULE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;schedule_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;handle_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send_ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;io_pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&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="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Actor 2 received from &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;io_pid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;schedule_message&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="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:noreply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;schedule_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;Process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:send_ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima eu criei dois atores que dentro de um intervalo de tempo enviam &lt;code&gt;:ok&lt;/code&gt;  e só respondem um ao outro após receber o &lt;code&gt;:ok&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;"Tá, mas como eu vejo isso acontecendo?"&lt;/p&gt;

&lt;p&gt;Inicia o iex interativo com &lt;code&gt;iex -S mix&lt;/code&gt;&lt;br&gt;
Depois inicie um dos atores com &lt;code&gt;iex&amp;gt; GenericActor1.start_link&lt;/code&gt;&lt;br&gt;
E veja a mágica acontecendo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;iex&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt; GenericActor1.start_link
&lt;span class="o"&gt;{&lt;/span&gt;:ok, &lt;span class="c"&gt;#PID&amp;lt;0.152.0&amp;gt;}&lt;/span&gt;
Actor 1 received from &lt;span class="c"&gt;#PID&amp;lt;0.152.0&amp;gt;&lt;/span&gt;
Actor 2 received from &lt;span class="c"&gt;#PID&amp;lt;0.153.0&amp;gt;&lt;/span&gt;
Actor 1 received from &lt;span class="c"&gt;#PID&amp;lt;0.152.0&amp;gt;&lt;/span&gt;
Actor 2 received from &lt;span class="c"&gt;#PID&amp;lt;0.153.0&amp;gt;&lt;/span&gt;
Actor 1 received from &lt;span class="c"&gt;#PID&amp;lt;0.152.0&amp;gt;&lt;/span&gt;
Actor 2 received from &lt;span class="c"&gt;#PID&amp;lt;0.153.0&amp;gt;&lt;/span&gt;
Actor 1 received from &lt;span class="c"&gt;#PID&amp;lt;0.152.0&amp;gt;&lt;/span&gt;
Actor 2 received from &lt;span class="c"&gt;#PID&amp;lt;0.153.0&amp;gt;&lt;/span&gt;
Actor 1 received from &lt;span class="c"&gt;#PID&amp;lt;0.152.0&amp;gt;&lt;/span&gt;
Actor 2 received from &lt;span class="c"&gt;#PID&amp;lt;0.153.0&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É um exemplo super básico, mas tendo processos independentes dessa forma torna as possibilidades infinitas. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>O que é Blochchain e como a tecnologia funciona?</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Sat, 22 Jun 2024 16:35:24 +0000</pubDate>
      <link>https://dev.to/starch1/o-que-e-blochchain-e-como-a-tecnologia-funciona-24b0</link>
      <guid>https://dev.to/starch1/o-que-e-blochchain-e-como-a-tecnologia-funciona-24b0</guid>
      <description>&lt;h3&gt;
  
  
  Como Blockchain Funciona?
&lt;/h3&gt;

&lt;p&gt;Blockchain é uma tecnologia que trabalha como um sistema de registro distribuído e descentralizado. A tecnologia fundamentalmente cria um registro digital de transações compartilhado por uma rede de computadores. Cada transação é agrupada em blocos, que são conectados ao bloco anterior, formando uma cadeia contínua de blocos, daí o nome "blockchain". Essa estrutura permite a manutenção de um histórico imutável de transações, proporcionando transparência e confiança sem a necessidade de intervenção de autoridades superiores(Como bancos).&lt;/p&gt;

&lt;h3&gt;
  
  
  Descentralização
&lt;/h3&gt;

&lt;p&gt;Uma das grande vantagens do blockchain é a descentralização. Ao contrário dos sistemas tradicionais que dependem de uma entidade central para validar transações, o blockchain permite que múltiplos participantes na rede verifiquem e registrem transações. Isso melhora a segurança e a transparência, já que não há um único ponto de falha que possa comprometer toda a rede. A descentralização também promove a democratização do controle, onde todos os participantes têm acesso igual à informação e ao poder de validação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redes Peer-to-Peer (P2P)
&lt;/h3&gt;

&lt;p&gt;Blockchain funciona em redes peer-to-peer (P2P), onde cada nó possui uma cópia completa do registro digital. Isso elimina a necessidade de uma autoridade central e permite que transações sejam conduzidas diretamente entre os participantes da rede. As redes P2P são fundamentais para a descentralização e a resistência do blockchain, pois distribuem o poder computacional e os dados entre todos os participantes, tornando a rede mais robusta e menos suscetível a ataques.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proof of Work
&lt;/h3&gt;

&lt;p&gt;O Proof of Work é um mecanismo usado por algumas blockchains, como o Bitcoin, para validar e processar transações. Neste processo, os nós da rede competem pra resolver problemas matemáticos complexos. O primeiro nó a resolver o problema é recompensado com criptomoedas e adiciona um novo bloco à blockchain. Esse método intensivo em recursos computacionais garante a segurança da rede. Contudo, ele também é criticado por seu alto consumo de energia e por contribuir para a centralização da mineração em áreas com eletricidade barata.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proof of Stake
&lt;/h3&gt;

&lt;p&gt;Em resposta às limitações do Proof of Work, algumas blockchains adotaram o Proof of Stake  como mecanismo de consenso. No Proof of Stake, os validadores são escolhidos com base na quantidade de criptomoeda que possuem e estão dispostos a "apostar" como garantia de seu compromisso com a rede. Esse método é mais eficiente em termos energéticos e reduz o risco de centralização, já que não depende de poder computacional para validar transações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Funções de Criptografia Hash
&lt;/h3&gt;

&lt;p&gt;As funções de criptografia hash atual na segurança de redes blockchain. Elas transformam dados de tamanho variável em uma sequência de comprimento fixo, conhecida como hash. Isso garante que cada bloco na blockchain seja único e identificável, proporcionando integridade e segurança aos dados. Exemplo de algoritmo hash bastante usado SHA-256. Os hashes são fundamentais para a estrutura de dados do blockchain, garantindo que qualquer alteração em um bloco seja facilmente detectável.&lt;/p&gt;

&lt;h3&gt;
  
  
  SHA-256 Hash
&lt;/h3&gt;

&lt;p&gt;SHA-256 é um algoritmo de hash criptográfico essencial em várias blockchains, incluindo o Bitcoin. Ele gera hashes de 256 bits e é vital para garantir a segurança e a integridade da blockchain. Qualquer modificação nos dados de um bloco resulta em um hash completamente diferente, facilitando a detecção de fraudes ou alterações não autorizadas. O uso do SHA-256 contribui para a robustez do sistema, tornando as transações seguras contra tentativas de falsificação e corrupção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart Contracts
&lt;/h3&gt;

&lt;p&gt;Smart contracts, são programas que executam automaticamente os termos de um contrato quando certas condições são atendidas. Eles são armazenados e executados no blockchain, o que garante transparência e imutabilidade. Os smart contracts tem potencial para revolucionar várias indústrias ao automatizar processos que tradicionalmente requerem intermediários, reduzindo custos e aumentando a eficiência.&lt;/p&gt;

&lt;h3&gt;
  
  
  Casos de Uso
&lt;/h3&gt;

&lt;p&gt;Além das criptomoedas, o blockchain possui uma ampla gama de aplicações potenciais. Exemplos incluem registros médicos eletrônicos que garantem privacidade e acessibilidade, cadeias de suprimentos transparentes que rastreiam produtos desde a origem até o consumidor final, e sistemas de votação eletrônica seguros que aumentam a confiança pública. A capacidade do blockchain de oferecer segurança sem intermediários tem o potencial de transformar vários segmentos. No setor financeiro, contratos inteligentes podem automatizar processos como empréstimos e seguros, enquanto em governos, podem garantir a integridade dos processos eleitorais e da administração pública.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>begginer</category>
      <category>programmers</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Embarcando no Elixir, Mix e Ecto.</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Mon, 08 Apr 2024 08:53:03 +0000</pubDate>
      <link>https://dev.to/starch1/embarcando-no-elixir-mix-e-ecto-2eg4</link>
      <guid>https://dev.to/starch1/embarcando-no-elixir-mix-e-ecto-2eg4</guid>
      <description>&lt;p&gt;Escrevo este artigo supondo que você, leitor tem noções básicas de programação. Pretendo manter a leitura simples , mas se sua primeira linguagem de programação for Elixir, talvez fique confuso. &lt;/p&gt;

&lt;h3&gt;
  
  
  Elixir
&lt;/h3&gt;

&lt;p&gt;Elixir é uma linguagem de programação funcional que roda em cima da máquina virtual do ERlang a BEAM. &lt;br&gt;
Elixir é mundialmente usado principalmente em outros países e grandes produtos como Brex, Discord, Pinterest e vários outros, mas é um orgulho nacional.&lt;/p&gt;

&lt;p&gt;O diferencial do Elixir é que seu código é executado em processos isolados, esse isolamento permite que o retorno de cada processo possa ser coletado de forma independente, utilizando da melhor forma os recursos da maquina.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tipos de dados em Elixir
&lt;/h3&gt;

&lt;p&gt;Em Elixir existem tipos de dados que são utilizados para representar diferentes tipos de informações, como:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;int&lt;/code&gt; Inteiros que podem ser positivos ou negativos&lt;br&gt;
&lt;code&gt;float&lt;/code&gt; Pontos flutuantes que representam números decimais.&lt;br&gt;
&lt;code&gt;string&lt;/code&gt; Que representam uma sequencia de caracteres escritos entre aspas duplas&lt;br&gt;
&lt;code&gt;boolean&lt;/code&gt; Representa valores verdadeiros ou falsos / &lt;code&gt;true&lt;/code&gt; &lt;code&gt;false&lt;/code&gt;&lt;br&gt;
&lt;code&gt;atom&lt;/code&gt; Que são constantes onde o próprio valor é equivalente ao próprio nome, por exemplo &lt;code&gt;:true, :heyThere, :barco&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Sintaxe e Módulos
&lt;/h5&gt;

&lt;p&gt;Vamos começar um Hello World pra dar boa sorte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="n"&gt;helloModule&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#Output =&amp;gt; Hello World&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui já é possível notar algumas 'peculiaridades do Elixir' que são os &lt;code&gt;módulos&lt;/code&gt;.&lt;br&gt;
Módulos no Elixir são unidades de organização de código e são usados pra agrupar funcionalidades relacionadas. Módulos também podem conter valores, constantes e até outros módulos. &lt;br&gt;
Você também pode criar uma função sem encapsular com um módulo, mas em Elixir é uma prática recomendada encapsular funções em módulos para organizar e estruturar seu código de forma mais clara e modular.&lt;br&gt;
Módulos em Elixir também são átomos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;is_atom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;helloModule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#Output =&amp;gt; true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como citei, em Elixir é possível criar módulos dentro de módulos, mas por convenção, é recomendado criar apenas um módulo por arquivo. (A não ser que situação peça o contrário) &lt;/p&gt;

&lt;p&gt;Além disso também temos duas extensões principais dentro do Elixir, sendo &lt;code&gt;.ex&lt;/code&gt; e &lt;code&gt;.exs&lt;/code&gt;.&lt;br&gt;
os arquivos &lt;code&gt;.ex&lt;/code&gt; são usados para código compilado que faz parte do aplicativo ou biblioteca, enquanto os arquivos &lt;code&gt;.exs&lt;/code&gt; são usados para scripts Elixir executados diretamente pelo interpretador, principalmente para tarefas de automação, experimentação e prototipagem.&lt;/p&gt;
&lt;h4&gt;
  
  
  Supervisão e Supervisores
&lt;/h4&gt;

&lt;p&gt;Os conceitos de supervisão e supervisores vem do sistema ERlang. Em Elixir os supervisores são responsáveis pelo monitoramento do ciclo de vida de um processo filho e reinicialização dos mesmos quando necessário. &lt;br&gt;
O supervisor garante que, se o processo falhar, ele seja reiniciado de acordo com a estratégia definida. Isso ajuda a criar sistemas tolerantes a falhas. &lt;/p&gt;

&lt;p&gt;Existe alguns tipos de supervisores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supervisor Simples:  Tipo mais básico, supervisiona processos e os reinicia se falharem.&lt;/li&gt;
&lt;li&gt;Supervisor Dinâmico: Com este é possível adicionar e remover processos filhos dinamicamente durante a execução do sistema.&lt;/li&gt;
&lt;li&gt;Supervisor de Tarefa: Este supervisor supervisiona tarefas assíncronas, como operações de  E/S .(Entrada e Saída)&lt;/li&gt;
&lt;li&gt;Supervisor de Grupo: Permite agrupar processos filhos para gerenciar em conjunto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de um supervisor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GenericSupervisor&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Supervisor&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start_link&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="no"&gt;Supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__MODULE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;GenericWorker&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[]]&lt;/span&gt;
        &lt;span class="no"&gt;Supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;strategy:&lt;/span&gt; &lt;span class="ss"&gt;:one_for_one&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo o &lt;code&gt;GenericSupervisor&lt;/code&gt; supervisiona um único processo que, se falhar, será reiniciado, de acordo com a estratégia &lt;code&gt;:one_for_one&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Mix
&lt;/h3&gt;

&lt;p&gt;Mix é uma para ajudar no desenvolvimento de aplicações Elixir. Ela é responsável por criar, compilar e gerenciar projetos, bem como tarefas de automação e teste.&lt;/p&gt;

&lt;p&gt;Com Mix, você pode facilmente iniciar um novo projeto Elixir usando o comando &lt;code&gt;mix new projeto&lt;/code&gt;. Isso criará uma estrutura de diretórios padrão para o seu projeto, com arquivos de configuração, testes e o esqueleto básico do código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── README.md
├── lib
│   └── projeto.ex
├── mix.exs
└── &lt;span class="nb"&gt;test&lt;/span&gt;
    ├── projeto_test.exs
    └── test_helper.exs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Estrutura de um projeto Mix
&lt;/h6&gt;

&lt;p&gt;&lt;code&gt;lib&lt;/code&gt; É neste diretório onde fica o código fonte do seu projeto e os arquivos &lt;code&gt;.ex&lt;/code&gt; aqui dentro serão compilados.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mix.exs&lt;/code&gt; Este é o arquivo de configuração principal do seu projeto. É aqui onde você define metadados do projeto, dependências, tarefas personalizadas e outras configurações.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;test&lt;/code&gt; Neste diretório ficam os arquivos de testes do seu projeto. Os arquivos de teste são escritos usando o ExUnit e têm a extensão &lt;code&gt;.exs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Além disso, Mix é usado para compilar e executar seu código. Por exemplo, você pode usar &lt;code&gt;mix compile&lt;/code&gt; para compilar seu projeto e &lt;code&gt;mix run&lt;/code&gt; para executá-lo.&lt;/p&gt;

&lt;p&gt;Mix também suporta a criação de tarefas personalizadas, que podem ser usadas para automatizar tarefas comuns de desenvolvimento, como a execução de testes ou a geração de documentação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ecto
&lt;/h3&gt;

&lt;p&gt;Ecto é uma biblioteca de persistência de dados para o Elixir, projetada para trabalhar com bancos de dados relacionais. Ela fornece uma maneira limpa e elegante de interagir com o banco de dados, usando uma abordagem baseada em modelos e consultas.&lt;/p&gt;

&lt;p&gt;(Persistência de dados é o conceito de armazenar informações de forma duradoura, de modo que elas possam ser recuperadas e utilizadas posteriormente, mesmo após o encerramento da aplicação que as gerou )&lt;/p&gt;

&lt;p&gt;Com Ecto, você pode definir modelos para representar suas tabelas de banco de dados e usar esses modelos para criar, atualizar, excluir e consultar registros no banco de dados.&lt;/p&gt;

&lt;p&gt;Além disso, Ecto fornece um mecanismo de migração que permite gerenciar o esquema do banco de dados ao longo do tempo. Com migrações, você pode criar e modificar tabelas, índices e restrições de chave estrangeira de forma controlada e reversível.&lt;/p&gt;

&lt;p&gt;Ecto também suporta consultas usando a linguagem de consulta Ecto.Query. Com Ecto.Query, você pode construir consultas SQL de forma programática, tornando mais fácil e seguro gerar consultas dinâmicas com base em variáveis de entrada.&lt;/p&gt;

&lt;p&gt;Ecto também oferece suporte a transações, permitindo que você execute várias operações de banco de dados como uma única unidade atômica. Isso garante que todas as operações sejam bem-sucedidas ou que nenhuma delas seja aplicada, mantendo a consistência dos dados.&lt;/p&gt;

&lt;p&gt;Se você se interessou por Elixir, considere checar a incrível documentação. &lt;br&gt;
&lt;a href="https://elixir-lang.org/docs.html"&gt;https://elixir-lang.org/docs.html&lt;/a&gt;&lt;br&gt;
E o tutorial em PT-BR, claro&lt;br&gt;
&lt;a href="https://elixirschool.com/pt"&gt;https://elixirschool.com/pt&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Processos, paralelismo e concorrência</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Sat, 30 Mar 2024 22:11:42 +0000</pubDate>
      <link>https://dev.to/starch1/processos-paralelismo-e-concorrencia-iom</link>
      <guid>https://dev.to/starch1/processos-paralelismo-e-concorrencia-iom</guid>
      <description>&lt;p&gt;Atualmente a demanda por sistemas eficientes e escaláveis é cada vez mais alta, com isto, paradigmas como processamento paralelo e concorrente ganharam muito mais visibilidade como pilares fundamentais. A grande ideia por trás destes paradigmas é otimizar a utilização de recursos computacionais, maximizando a eficiência dos sistemas. Hoje eu vou falar um pouco sobre conceitos, diferenças e aplicações de processamento paralelo e concorrente. &lt;/p&gt;

&lt;h2&gt;
  
  
  Processos e Threads
&lt;/h2&gt;

&lt;h4&gt;
  
  
  O que é um processo?
&lt;/h4&gt;

&lt;p&gt;Processo é uma entidade ativa dentro de um sistema operacional que executa uma tarefa especifica. Veja os processos como instancias de um programa em execução.&lt;/p&gt;

&lt;p&gt;Cada processo é isolado dos outros o que significa que eles não podem interagir com outros processos, acessando memoria ou espaço uns dos outros, mas podem conversar entre si através de pipes, sockets ou sinais. &lt;/p&gt;

&lt;h4&gt;
  
  
  O que é uma thread?
&lt;/h4&gt;

&lt;p&gt;Threads ou linhas de execução? São unidades de execução em um software, elas são sequencias de instruções que podem ser executadas por um processador. Em sistemas que suportam o multi threading, cada thread representa um fluxo de controle separado dentro de um processo que aguarda por &lt;/p&gt;

&lt;p&gt;As threads podem ser usadas pra realizar tarefas simultâneas em um software, aproveitando os recursos do processador e melhorando a capacidade de resposta do sistema. Por exemplo, em um software de processamento de texto, uma thread pode ser ser responsável por lidar com a entrada do usuário enquanto outra está formatando texto em segundo plano. &lt;/p&gt;

&lt;h5&gt;
  
  
  Por que usar threads?
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Threads simplificam o uso de multi-tarefas em projetos com várias entidades independentes.&lt;/li&gt;
&lt;li&gt;Threads tem vantagens em sistemas com múltiplos processadores.&lt;/li&gt;
&lt;li&gt;Threads ajudam na performance em 'segundo plano' e processos assíncronos 
## Processamento paralelo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basicamente o processamento paralelo é a execução simultânea de várias tarefas. (É isso, já pode ir pro próximo sub tópico. Brincadeira)&lt;br&gt;
A ideia é dividir as tarefas em partes menores pra poderem ser executadas de forma independente, a abordagem visa explorar o potencial dos sistemas que comumente possuem limites de processamento.&lt;/p&gt;

&lt;p&gt;Por exemplo processamento paralelo é comumente usado para renderização de gráficos e animações e processamentos de dados em grandes conjuntos, onde é necessário que os dados sejam divididos em partes menores para então serem processados simultaneamente por vários nós de computação em um &lt;a href="https://pt.wikipedia.org/wiki/Cluster"&gt;cluster&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Aplicações e tendências
&lt;/h3&gt;

&lt;h5&gt;
  
  
  Balanceamento de carga
&lt;/h5&gt;

&lt;p&gt;Balanceamento de carga é uma técnica onde a ideia é distribuir as tarefas entre os recursos de processamento, como &lt;a href="https://pt.wikipedia.org/wiki/Unidade_central_de_processamento"&gt;CPUs&lt;/a&gt; e &lt;a href="https://pt.wikipedia.org/wiki/Unidade_de_processamento_gr%C3%A1fico"&gt;GPUs&lt;/a&gt;. O objetivo é evitar sobrecargas em alguns recursos enquanto outros estão ociosos para maximizar a eficiência do sistema. &lt;/p&gt;

&lt;h2&gt;
  
  
  Processamento concorrente
&lt;/h2&gt;

&lt;p&gt;O processamento concorrente refere-se à execução coordenada de múltiplas tarefas, permitindo que diferentes partes de um sistema avancem simultaneamente. Ao contrário do paralelismo, que se concentra na execução efetiva de múltiplas tarefas ao mesmo tempo, a concorrência trata mais da estruturação e organização das tarefas.&lt;/p&gt;

&lt;p&gt;Já o processamento concorrente é comumente usado em servidores web e sistemas de bancos de dados, onde é necessário que acessar e modificar dados, garantindo que várias partes do sistema possam operar de forma independente e eficiente&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferenças e Complementaridade
&lt;/h2&gt;

&lt;p&gt;Embora o processamento paralelo e concorrente tenham abordagens distintas, eles frequentemente se complementam na implementação de sistemas modernos. Enquanto o processamento paralelo busca otimizar a utilização de recursos computacionais, permitindo a execução simultânea de tarefas intensivas, o processamento concorrente lida com a estruturação e coordenação de múltiplas atividades, garantindo a eficiência e a responsividade dos sistemas.&lt;/p&gt;

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

&lt;p&gt;Embora o processamento paralelo e concorrente tenham abordagens diferentes, eles se complementam na implementação de sistemas modernos. Enquanto o processamento paralelo busca otimizar a utilização de tarefas intensivas, o processamento concorrente lida com a estruturação e coordenação de múltiplas atividades, garantindo a eficiência e a responsividade dos sistemas. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Iniciando na Programação funcional.</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Wed, 21 Feb 2024 17:27:13 +0000</pubDate>
      <link>https://dev.to/starch1/iniciando-na-programacao-funcional-1o5p</link>
      <guid>https://dev.to/starch1/iniciando-na-programacao-funcional-1o5p</guid>
      <description>&lt;h1&gt;
  
  
  O que é programação funcional
&lt;/h1&gt;

&lt;p&gt;Contextualizando, Programação funcional é um paradigma de programação, ou seja uma forma de abordar a resolução de problemas no mundo da tecnologia, diferente de outros paradigmas como POO. Como o nome sugere, Programação funcional trata programação como funções matemáticas, visando evitar a criação de  estados e dados mutáveis, promovendo a ideia de &lt;code&gt;stateless&lt;/code&gt; e &lt;code&gt;immutable&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Stateless e Immutable
&lt;/h4&gt;

&lt;h6&gt;
  
  
  Immutable
&lt;/h6&gt;

&lt;p&gt;Significa que depois que um dado é criado ele &lt;strong&gt;nunca&lt;/strong&gt; deverá ser alterado. Com isto evitamos retornos inesperados. &lt;/p&gt;

&lt;h6&gt;
  
  
  Stateless
&lt;/h6&gt;

&lt;p&gt;Trata das funções que devem se comportar sem estado, isso significa que ela deve retornar algo como se fosse sua primeira chamada, tudo que rodou antes da função não deve ter nenhuma influência no seu retorno.&lt;/p&gt;

&lt;h4&gt;
  
  
  Regras / convenções
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Funções devem ser independentes.&lt;/li&gt;
&lt;li&gt;Sempre ter pelo menos um argumento: Isso ajuda a evitar dependências de estados globais.&lt;/li&gt;
&lt;li&gt;Funções sempre devem retornar algo.&lt;/li&gt;
&lt;li&gt;Dados, informações ou até outras funções: Isso promove a transparência e clareza nas operações. Não existem loops&lt;/li&gt;
&lt;li&gt;Loops devem ser criados através de recursividade: Isso favorece a imutabilidade e a clareza do código. Funções devem ser puras&lt;/li&gt;
&lt;li&gt;Não depender de nenhum dado externo: Isso garante que uma função produza o mesmo resultado para as mesmas entradas, facilitando o teste e a compreensão do código&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Funções impuras
&lt;/h2&gt;

&lt;p&gt;Funções impuras nem sempre retornam o valor esperado, isso acontece quando a função tem variáveis mutáveis, permitindo a mudança de estado.  Que é o que por construção não acontece na programação funcional. &lt;br&gt;
Um exemplo de função impura:&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;def&lt;/span&gt; &lt;span class="nf"&gt;remove_last_from_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&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;Lucas&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;Tsugami&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;Rafa&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="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#Output: ['Lucas', 'Tsugami']
&lt;/span&gt;&lt;span class="nf"&gt;remove_last_from_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&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="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#Output: ['Lucas']
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Diferenças de Imperativo e POO
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Imperativo
&lt;/h4&gt;

&lt;p&gt;No paradigma imperativo, a ideia está na execução de instruções que modificam o estado do programa ao longo da sua execução, com variáveis mutáveis por exemplo. A estrutura do código é baseado em procedimentos e funções, com ênfase em "como" as operações são realizadas, detalhando passos específicos a serem seguidos. &lt;/p&gt;

&lt;h4&gt;
  
  
  Programação orientada a Objetos(POO)
&lt;/h4&gt;

&lt;p&gt;No POO a abordagem é centrada a objetos que encapsulam dados e comportamentos relacionados. Esses objetos interagem entre si, proporcionando uma organização modular do código. &lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplos
&lt;/h2&gt;

&lt;p&gt;Aqui vou usar Python para mostrar um exemplo de como é este paradigma na pratica. Vou usar um exemplo no paradigma Imperativo e um Funcional, visto que o POO pode ser 'aproveitado' e utilizado na programação funcional.&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="c1"&gt;##Imperativo
&lt;/span&gt;&lt;span class="n"&gt;number_list&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="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;sum_pairs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;number_list&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;num&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;2&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="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="n"&gt;sum_square&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum_square&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#Output:56
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que é necessário usar de um &lt;code&gt;loop for&lt;/code&gt; para percorrer a lista de números e conseguir o resultado. Ou seja, a cada iteração é gerado um novo estado.&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="c1"&gt;##Funcinoal
&lt;/span&gt;&lt;span class="n"&gt;number_list&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="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;sum_pairs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&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="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&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="n"&gt;number_list&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="n"&gt;sum_pairs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#Output: 56
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo funcional utilizamos expressões &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;lambda&lt;/code&gt; e &lt;code&gt;filter&lt;/code&gt; para criar uma lista de números pares e em seguida a função &lt;code&gt;sum&lt;/code&gt; para conseguir a soma total. Este exemplo é mais conciso e expressa uma operação de forma funcional, evitando estados mutáveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens da programação funcional
&lt;/h2&gt;

&lt;h5&gt;
  
  
  Suporte a debug e testes
&lt;/h5&gt;

&lt;p&gt;A Programação Funcional proporciona um suporte melhor a debug e testes devido à imutabilidade e à pureza das funções. Isso facilita a identificação e correção de erros, tornando o desenvolvimento mais robusto.&lt;/p&gt;

&lt;h5&gt;
  
  
  Performance de código
&lt;/h5&gt;

&lt;p&gt;A abordagem funcional contribui para a melhoria da performance do código em situações em que a imutabilidade e a ausência de efeitos colaterais são críticas. Isso é particularmente útil em sistemas que exigem alta confiabilidade e escalabilidade.&lt;/p&gt;

&lt;h5&gt;
  
  
  Expressividade e concisão
&lt;/h5&gt;

&lt;p&gt;A programação funcional permite a expressão concisa de lógicas complexas, tornando o código mais legível e fácil de entender. Essa característica é valorizada em projetos que demandam manutenção a longo prazo e colaboração entre desenvolvedores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagens de programação funcionais.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Elixir
&lt;/h3&gt;

&lt;p&gt;O maior diferencial do Elixir é o polimorfismo, permitindo a criação de funções com diferentes implementações para tipos distintos de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Haskell
&lt;/h3&gt;

&lt;p&gt;Haskell é uma linguagem funcional pura que se destaca pela forte tipagem, inferência de tipos e imutabilidade. Sua sintaxe concisa e expressiva é favorecida em ambientes acadêmicos e aplicações matemáticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scala
&lt;/h3&gt;

&lt;p&gt;Scala é uma linguagem híbrida, incorporando conceitos funcionais e orientados a objetos. Oferece flexibilidade na transição de códigos imperativos para funcionais, sendo amplamente utilizada em ambientes corporativos.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Como criar .Xauthority manualmente.</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Tue, 30 Jan 2024 13:37:06 +0000</pubDate>
      <link>https://dev.to/starch1/como-criar-xauthority-manualmente-21ad</link>
      <guid>https://dev.to/starch1/como-criar-xauthority-manualmente-21ad</guid>
      <description>&lt;p&gt;Se o arquivo .Xauthority não existe no seu diretorio &lt;code&gt;home&lt;/code&gt;, você deve ver o seguinte erro&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xauth
xauth:  file /root/.Xauthority does not exist
Using authority file /root/.Xauthority
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criando o .Xauthority&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;touch&lt;/span&gt; ~/.Xauthority

&lt;span class="c"&gt;# Gera um magic cookie aleatorio de 128 bit hex&lt;/span&gt;
xauth add &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;:0 &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;xxd &lt;span class="nt"&gt;-l&lt;/span&gt; 16 &lt;span class="nt"&gt;-p&lt;/span&gt; /dev/urandom&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois verifique o arquivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xauth list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>tutorial</category>
      <category>linux</category>
    </item>
    <item>
      <title>Desenvolvendo um login com NodeJS, MongoDB, Express e Passport.</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Tue, 23 Jan 2024 17:06:27 +0000</pubDate>
      <link>https://dev.to/starch1/desenvolvendo-um-login-com-nodejs-mongodb-express-e-passport-2jga</link>
      <guid>https://dev.to/starch1/desenvolvendo-um-login-com-nodejs-mongodb-express-e-passport-2jga</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Este artigo explora a utilização do Express.js, um framework que simplifica a estruturação de aplicações web por meio de middleware e rotas. Além disso, aborda o MongoDB, um banco de dados NoSQL popular que oferece uma abordagem distinta para o armazenamento de dado&lt;/p&gt;

&lt;p&gt;&lt;a href="https://expressjs.com/pt-br/"&gt;Express.js&lt;/a&gt; é um framework que simplifica a organização de funcionalidades em aplicações, facilitando o uso de middleware e a definição de rotas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/"&gt;MongoDB&lt;/a&gt; é um banco de dados NoSQL popular. Ao contrário dos bancos relacionais, como tabelas, o MongoDB oferece uma abordagem diferente para armazenar dados, utilizando o formato chamado BSON.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.passportjs.org/docs/"&gt;Passport.js&lt;/a&gt;é um middleware de autenticação flexível para NodeJS. Ele pode ser facilmente integrado em qualquer aplicação web baseada em Express, tornando a implementação de autenticação mais simples e personalizável.&lt;/p&gt;

&lt;h1&gt;
  
  
  Passos para criar o projeto e instalar os modulos:
&lt;/h1&gt;

&lt;p&gt;Vamos iniciar um novo projeto usando&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Instale os modulos usando 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;npm i express ejs mongoose body-parser express-session
npm i passport passport-local 
npm i passport-local-mongoose 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie duas pastas dentro do diretorio do projeto usando 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;mkdir model
mkdir views
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um arquivo &lt;code&gt;app.js&lt;/code&gt;&lt;br&gt;
Dentro da pasta model, crie um arquivo &lt;code&gt;User.js&lt;/code&gt; o que vai ter os nossos &lt;a href="https://www.devmedia.com.br/banco-de-dados-nosql-um-novo-paradigma-revista-sql-magazine-102/25918"&gt;Schemas&lt;/a&gt;&lt;br&gt;
Dentro da pasta views crie os seguintes arquivos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;home.ejs
login.ejs
secret.ejs
register.ejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://ejs.co"&gt;EJS&lt;/a&gt; é uma linguagem de modelo que permite incorporar codigo JS diretamente em um arquivo de modelo.&lt;/p&gt;

&lt;p&gt;Estrutura do projeto deve se parecer com algo assim&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpw0zfkd7ke83gj5nhlqc.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%2Fpw0zfkd7ke83gj5nhlqc.png" alt="Image description" width="169" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dependencias no package.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"body-parser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.20.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ejs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.1.9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"express"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.18.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"express-session"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.17.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mongoose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.7.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passport-local"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passport-local-mongoose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.0.0"&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;No User.js vamos definir um schema que recebe dois campos &lt;code&gt;username&lt;/code&gt;e &lt;code&gt;password&lt;/code&gt;, o &lt;code&gt;passportLocalMongoose&lt;/code&gt;adiciona os metodos e campos adicionais ao schema pra facilitar a autenticação local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Arquivo User.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&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;mangoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&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;Schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Schema&lt;/span&gt; 

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;passportLocalMongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;passport-local-mongoose&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;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;passportLocalMongoose&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No arquivo app.js vamos começar definindo as libs do projeto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Arquivo app.js&lt;/span&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="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;passport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;passport&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;bodyParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body-parser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;LocalStrategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;passport-local&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;passportLocalMongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;passport-local-mongoose&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;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./model/User&lt;/span&gt;&lt;span class="dl"&gt;"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos criar uma conexão com o MongoDB&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;mongoose&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongodb://localhost/27017&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;Vamos configurar o express para usar a engine de visualização do EJS, configurar o middleware para processar os dados do formulário e a autenticação com Passport.js&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;view engine&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;ejs&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express-session&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)({&lt;/span&gt;
    &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xxx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;resave&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;saveUninitialized&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;passport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&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="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;passport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;session&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nx"&gt;passport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LocalStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="nx"&gt;passport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serializeUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serializeUser&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nx"&gt;passport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deserializeUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deserializeUser&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora vamos configurar as rotas GET com express.&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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="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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;,&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;register&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/register&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;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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;register&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&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;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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos definir a rota que vai tratar as solicitações post para o endpoint &lt;code&gt;/register&lt;/code&gt;, que cria um novo usuario com base no dados fornecidos no formulario do &lt;code&gt;register.ejs&lt;/code&gt;.&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;/register&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="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;username&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;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;password&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;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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;Agora definir a rota de login que lida com autenticação dos usuarios e logout que, bom, faz log out&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;passport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;sucessRedirect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;failureRedirect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="c1"&gt;// failureFlash: 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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/logout&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;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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logout&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="o"&gt;=&amp;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;err&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="nf"&gt;next&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="nf"&gt;redirect&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="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;Vamos criar uma função que age como middleware que vai garantir que só usuários autenticados tenham acesso a rotas privadas da aplicação.&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;function&lt;/span&gt; &lt;span class="nf"&gt;isLoggedIn&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="k"&gt;if&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="nf"&gt;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&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="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim vamos definir a porta para acessar-mos e fazer os testes localmente e por o servidor online.&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;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt; 
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;🔥&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pra tudo acima funcionar você precisa ter o um servidor mongoose rodando. Caso não tenha eu escrevi um artigo sobre como preparar o ambiente &lt;a href="https://dev.to/starch1/preparando-ambiente-de-trabalho-para-usar-mongodb-45mf"&gt;Preparando ambiente de trabalho MongoDB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode iniciar o servidor 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;mongod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois navegue até a pasta onde está o app.js e digite no terminal&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Abra o navegador e digite na barra o endereço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Integrando essas tecnologias, você ganha não apenas eficiência no desenvolvimento, mas também uma base sólida para construir aplicações escaláveis e seguras. O uso intuitivo de middleware, a flexibilidade do MongoDB e a robustez da autenticação com Passport.js proporcionam uma experiência de desenvolvimento acessível, mesmo para aqueles que estão começando.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Preparando ambiente de trabalho para usar MongoDB</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Tue, 23 Jan 2024 17:01:34 +0000</pubDate>
      <link>https://dev.to/starch1/preparando-ambiente-de-trabalho-para-usar-mongodb-45mf</link>
      <guid>https://dev.to/starch1/preparando-ambiente-de-trabalho-para-usar-mongodb-45mf</guid>
      <description>&lt;p&gt;Guia rápido de como preparar o ambiente de trabalho para começar a usar MongoDB&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalando no Windows
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Vá em &lt;a href="https://discord.com/invite/Q6FafYV"&gt;Download MongoDB&lt;/a&gt; e faça o download do MongoDB Community Server.&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%2F1kjrx61kplce7ynj0mok.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%2F1kjrx61kplce7ynj0mok.png" alt="Image description" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui você pode escolher a versão e pacotes de acordo com seus requisitos. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Quando o download estiver completo abra o arquivo MSI e clique em 'next' até concluir a instalação. Se você for um iniciante, não precisará fazer configurações especificas. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agora vá até o diretório que o MongoDB está instalado e copie o caminho &lt;/p&gt;&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%2Fqh0t3vk3d73tbxo6qb3b.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%2Fqh0t3vk3d73tbxo6qb3b.png" alt="Image description" width="669" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora crie uma variável de sistema para assegurar que não vamos ter problemas de caminho no futuro.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Editar variaveis do Sistema&amp;gt;&amp;gt;Variaveis do Ambiente&amp;gt;&amp;gt;Path&amp;gt;&amp;gt;New&amp;gt;&amp;gt; Cole o caminho que você copiou.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;A variável PATH é uma configuração do sistema operacional que lista os diretórios nos quais o sistema deve procurar por executáveis quando você digita um comando no prompt de comando ou em um script. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Depois de configurar o ambiente de variaveis, vamos rodar o servidor MongoDB. Abra o prompt de comando e digito o comando:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você verá um erro de i.e. C:/data/db/not found. &lt;/p&gt;

&lt;p&gt;Agora, abra a unidade C e crie uma pasta chamada "data" dentro desta pasta crie outra pasta chamada "db". Depois de criar essas pastas. Abra novamente o prompt de comando e execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o servidor mongo vai estar rodando :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foc1krazy8a267ehfkqpi.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%2Foc1krazy8a267ehfkqpi.png" alt="Image description" width="738" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Rodando Mongo shell
&lt;/h1&gt;

&lt;p&gt;Agora vamos conectar nosso servidor (mongod) ao shell mongo. Então, mantenha aquela janela do mongod e abra uma nova janela de prompt de comando e escreva mongo. Agora, nosso shell mongo se conectará com sucesso ao mongod.&lt;/p&gt;

&lt;p&gt;Agora você está pronto pra escrever queries no mongo shell&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>tutorial</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Preparando o ambiente de trabalho e utilizando APIs google.</title>
      <dc:creator>Starch1</dc:creator>
      <pubDate>Fri, 19 Jan 2024 21:53:42 +0000</pubDate>
      <link>https://dev.to/starch1/preparando-o-ambiente-de-trabalho-e-utilizando-apis-google-4j16</link>
      <guid>https://dev.to/starch1/preparando-o-ambiente-de-trabalho-e-utilizando-apis-google-4j16</guid>
      <description>&lt;p&gt;Guia rápido de como começar ativar e começar a usar as APIs google. &lt;/p&gt;

&lt;h1&gt;
  
  
  Acesso o console de desenvolvedor
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Abra o navegador e acesse &lt;a href="https://cloud.google.com/cloud-consol"&gt;Console do Google&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Se ainda não tiver um projeto, clique em 'criar projeto'&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Ativando a API
&lt;/h1&gt;

&lt;p&gt;-No painel de controle clique em 'Ativar APIs e Serviços'&lt;br&gt;
-Na biblioteca encontre a API que você quer utilizar&lt;br&gt;
-Escolha a API e clique em 'Ativar'&lt;/p&gt;

&lt;h1&gt;
  
  
  Criando credenciais
&lt;/h1&gt;

&lt;p&gt;-No painel de controle clique em 'Criar Credenciais'&lt;br&gt;
-Selecione o tipo de credencial que faça sentido de acordo com o projeto .Por exemplo, se estiver desenvolvendo uma aplicação da web, escolha "ID do Cliente OAuth"&lt;br&gt;
-Configure as informações necessárias, como URLs.&lt;br&gt;
-Clique em 'Criar' e faça o download das credenciais geradas. Nota que este arquivo é muito importante e você deve guardar com cuidado.&lt;/p&gt;

&lt;h1&gt;
  
  
  Papeis e permissões
&lt;/h1&gt;

&lt;p&gt;-No console, acesse a seção 'IAM' &lt;br&gt;
-Adicione os membros da sua equipe atribua papeis apropriados&lt;/p&gt;

&lt;h1&gt;
  
  
  Integrando credenciais a aplicação
&lt;/h1&gt;

&lt;p&gt;-Use as credenciais baixadas de acordo com o que a documentação da API pede&lt;br&gt;
-Mantenha as credenciais em segredo. Recomendo usar dotenv ou algo do tipo.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>googlecloud</category>
    </item>
  </channel>
</rss>
