<?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: João Paulo de C. Lima</title>
    <description>The latest articles on DEV Community by João Paulo de C. Lima (@joao2391).</description>
    <link>https://dev.to/joao2391</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%2F356174%2F367b54f2-b3a6-4297-bc37-b993b09932ce.jpg</url>
      <title>DEV Community: João Paulo de C. Lima</title>
      <link>https://dev.to/joao2391</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joao2391"/>
    <language>en</language>
    <item>
      <title>Elixir - Uma Breve Introdução</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Sat, 10 Sep 2022 09:23:28 +0000</pubDate>
      <link>https://dev.to/joao2391/elixir-uma-breve-introducao-33in</link>
      <guid>https://dev.to/joao2391/elixir-uma-breve-introducao-33in</guid>
      <description>&lt;p&gt;Elixir é uma linguagem de programação funcional. Foi lançada em 2011. Idealizado e desenvolvido por &lt;a href="https://github.com/josevalim"&gt;José Valim&lt;/a&gt; dentro da empresa &lt;a href="https://plataformatec.com/"&gt;Plataformatec&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VwCqN2yw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tfxmi3melj5cegasd8q1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VwCqN2yw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tfxmi3melj5cegasd8q1.jpg" alt="Foto do José Valim" width="750" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de entrarmos nas funcionalidades da linguagem, vamos abordar alguns conceitos de programação funcional.&lt;/p&gt;

&lt;p&gt;Segundo &lt;a href="https://twitter.com/_ericelliott"&gt;Eric Elliott&lt;/a&gt;,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Programação funcional é o processo de construir software através de composição de funções puras, evitando compartilhamento de estados, dados mutáveis e efeitos colaterais.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O paradigma funcional, surgiu para auxiliar na resolução de problemas complexos. Os matemáticos encontraram nas funções a forma de chegar no objetivo final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0jXYIFAl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4k425j9iex4s8t9yydyb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0jXYIFAl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4k425j9iex4s8t9yydyb.png" alt="Paradigma Funcional na Matemática" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conceitos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Composição de Função&lt;/strong&gt;: Cria-se uma nova função, através da composição de outras&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Funções Puras&lt;/strong&gt;: Independente da quantidade de vezes em que é chamada, o resultado será sempre o mesmo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imutabilidade&lt;/strong&gt;: A variável ou objeto terá sempre o mesmo valor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efeito Colateral&lt;/strong&gt;: Interações com o “mundo externo” (acesso ao banco de dados, chamadas de APIs externas, etc) onde não podemos prever o resultado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RkUe-Yyk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqmpji74pyfw0pqyzcsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RkUe-Yyk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqmpji74pyfw0pqyzcsf.png" alt="Evolução da programação desenho Simpson" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Erlang, OTP e Tolerância a falhas
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.erlang.org/"&gt;Erlang&lt;/a&gt; é uma linguagem de programação usada para construir sistemas real-time, massivamente escaláveis ​e ​com requisitos de alta disponibilidade. &lt;br&gt;
Alguns de seus usos são em telecomunicações, bancos, comércio eletrônico, telefonia por computador e mensagens instantâneas (WhatsApp e Facebook Messenger).&lt;br&gt;
O runtime do Erlang tem suporte embutido para simultaneidade, distribuição e tolerância a falhas.&lt;br&gt;
Veja alguns casos interessantes do WhatsApp:&lt;br&gt;
&lt;a href="https://blog.whatsapp.com/1-million-is-so-2011"&gt;WhatsApp Blog - 02 milhões de conexões TCP&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.wired.com/2015/09/whatsapp-serves-900-million-users-50-engineers/"&gt;WhatsApp tem 50 engenheiros para 900 milhões de usuários&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  OTP:
&lt;/h2&gt;

&lt;p&gt;OTP é um conjunto de bibliotecas Erlang e princípios de design que fornecem middleware para desenvolver esses sistemas. Inclui seu próprio banco de dados distribuído, aplicativos para interface com outras linguagens, ferramentas de depuração e manipulação de lançamentos.&lt;/p&gt;
&lt;h2&gt;
  
  
  BEAM:
&lt;/h2&gt;

&lt;p&gt;BEAM é a máquina virtual no núcleo da plataforma Erlang Open Telecom. O BEAM faz parte do Erlang Run-Time System, que compila o código-fonte Erlang em bytecode, que é então executado no BEAM. Os arquivos de bytecode BEAM têm a extensão de arquivo &lt;em&gt;.beam&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EUhnHSKC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oz4bvnkkarfkzhag4gaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EUhnHSKC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oz4bvnkkarfkzhag4gaf.png" alt="Erlang BEAM" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Scheduler:
&lt;/h2&gt;

&lt;p&gt;A instância BEAM é iniciada em um único processo do SO (você pode procurá-la pelo nome beam). Para cada CPU disponível, ele cria um thread. Isso torna os sistemas Erlang escaláveis ​​porque podem aproveitar todos os núcleos disponíveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgXGTnOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eo48wc3bbvt3ygu36bgx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgXGTnOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eo48wc3bbvt3ygu36bgx.png" alt="Erlang Scheduler" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como parte do ERTS, o BEAM é responsável por escalonar os processos Erlang. Um único thread executa exatamente um escalonador que é, entre os outros, responsável por preencher a fila de processos Erlang. O escalonador também extrai processos Erlang da fila e aloca um intervalo de tempo para executar cada um deles.&lt;/p&gt;
&lt;h1&gt;
  
  
  Actor Model:
&lt;/h1&gt;

&lt;p&gt;O Actor Model é um modelo/conceito matemático de computação concorrente que trata os atores como a primitiva fundamental e universal da computação concorrente.&lt;/p&gt;

&lt;p&gt;O ERTS sobre o qual o Elixir se baseia, implementa o modelo de ator usando processos como atores que são leves e rápidos para criar e encerrar.&lt;/p&gt;

&lt;p&gt;Os atores, neste modelo, podem ter as seguintes propriedades, entre outras, dependendo de seu design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tome a entrada como uma mensagem.&lt;/li&gt;
&lt;li&gt;Faça o cálculo.&lt;/li&gt;
&lt;li&gt;Pode criar outros atores.&lt;/li&gt;
&lt;li&gt;Enviar mensagem de saída ou resposta.&lt;/li&gt;
&lt;li&gt;Cada ator geralmente tem seu estado que não é compartilhado.&lt;/li&gt;
&lt;li&gt;Os atores podem alterar o estado uns dos outros passando mensagens. Também podem modificar seu próprio estado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tP9lxSzt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jp9300qiabgpq4bilfux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tP9lxSzt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jp9300qiabgpq4bilfux.png" alt="Elixir ActorModel" width="880" height="569"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Funcionalidades da Linguagem
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Performance:
&lt;/h2&gt;

&lt;p&gt;Para demonstrar a performance do Elixir, vou utilizar um exemplo retirado do seguinte artigo: &lt;a href="https://medium.com/true-henrique/elixir-10-motivos-para-aprender-6cd4d6876f05"&gt;Elixir: 10 motivos para aprender&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elixir 10k requisições:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HqCcnX3W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xpxgdot8g1ptu4zb40zk.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HqCcnX3W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xpxgdot8g1ptu4zb40zk.PNG" alt="Código Exemplo 10k requisições Elixir" width="880" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2yiasktu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/1%2AzVJJroH-dWsc04mk04gMpg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2yiasktu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/1%2AzVJJroH-dWsc04mk04gMpg.gif" alt="Exemplo 10k requisições Elixir" width="732" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node 10k requisições:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GRttJwCy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rocif33dulizimdh9ucw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GRttJwCy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rocif33dulizimdh9ucw.PNG" alt="Código Exemplo 10k requisições Node" width="880" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iX7Ff4C3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/1%2A8_YMbs7jdnQBUJHRrCghAA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iX7Ff4C3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/1%2A8_YMbs7jdnQBUJHRrCghAA.gif" alt="Exemplo 10k requisições Node" width="732" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais informações sobre performance em Elixir:&lt;br&gt;
&lt;a href="https://phoenixframework.org/blog/the-road-to-2-million-websocket-connections"&gt;2 milhões de conexões websockets&lt;/a&gt;&lt;br&gt;
&lt;a href="https://discord.com/blog/how-discord-scaled-elixir-to-5-000-000-concurrent-users"&gt;Como o Discord escalou para 5M de usuários concorrentes&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Produtividade:
&lt;/h2&gt;

&lt;p&gt;Além da performance, existe um framework que nos dá um grande aumento da produtividade. O nome é &lt;a href="https://phoenixframework.org/"&gt;Pheonix Framework&lt;/a&gt;&lt;br&gt;
Com o Pheonix Framework, você consegue prototipar uma aplicação de forma muito rápida.&lt;br&gt;
Para criar um projeto, via CLI, basta fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix phx.new &amp;lt;nome_projeto&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EC0HHzhK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yexfmy1creo9465tz51.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EC0HHzhK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yexfmy1creo9465tz51.jpg" alt="PheonixFramework Logo" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe:
&lt;/h2&gt;

&lt;p&gt;Alguns pontos sobre a sintaxe da linguagem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspirada em &lt;a href="https://www.ruby-lang.org/pt/"&gt;Ruby&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Podemos, por exemplo, utilizar “?” ou “!” na nomenclatura de funções e variáveis;&lt;/li&gt;
&lt;li&gt; Parênteses não são obrigatórios e não precisamos declarar o retorno explicitamente em funções com “return”;&lt;/li&gt;
&lt;li&gt; “Pattern Matching” (reconhecimento de padrões);&lt;/li&gt;
&lt;li&gt; ”Guards”;&lt;/li&gt;
&lt;li&gt; “Pipe Operator” (torna possível economizar diversas linhas de código e tornar a legibilidade muito alta).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo Com Pipe:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notification&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;notification&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;get_client&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;get_remote_chats&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;insert_or_update_local_chats&lt;/span&gt;

    &lt;span class="ss"&gt;:ok&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemplo Sem Pipe:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notification&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;insert_or_update_local_chats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_remote_chats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

    &lt;span class="ss"&gt;:ok&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Documentação:
&lt;/h2&gt;

&lt;p&gt;Para a documentação, existe uma ferramenta chamada &lt;a href="https://hexdocs.pm/"&gt;HexDocs&lt;/a&gt;&lt;br&gt;
Para gerar uma página de documentação, basta adicionar alguns comentários “marcando” as funções e módulos e rodar um pequeno comando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EcU3ytpm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ag3bivo0qkie553fnjam.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EcU3ytpm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ag3bivo0qkie553fnjam.PNG" alt="Codigo uso HexDocs" width="586" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XSLSa0sj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w1f2zxkk833oy99lu24z.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XSLSa0sj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w1f2zxkk833oy99lu24z.PNG" alt="Pagina Gerada HexDocs" width="880" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Macros e Metaprogramação:
&lt;/h2&gt;

&lt;p&gt;Em Elixir, macros permitem uma extensão da linguagem. Ou seja, você pode criar código que escreve código em tempo de compilação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CEMZZXpQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8mqyjlavxiicrbg0sbun.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CEMZZXpQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8mqyjlavxiicrbg0sbun.PNG" alt="Macros Elixir" width="698" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Cases:
&lt;/h1&gt;

&lt;p&gt;Algumas das empresas que usam Elixir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ShKAD0hW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mkl6ojn0n6nnjy01xs61.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ShKAD0hW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mkl6ojn0n6nnjy01xs61.PNG" alt="Image description" width="681" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://elixir-lang.org/cases.html"&gt;Lista Completa&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Documentário:
&lt;/h1&gt;

&lt;p&gt;Há um documentário no Youtube sobre a linguagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1cxDUv5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/921q4h0u4e6slp6bckvx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1cxDUv5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/921q4h0u4e6slp6bckvx.jpg" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=lxYFOM3UJzo"&gt;Assista aqui&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Aprendizado:
&lt;/h1&gt;

&lt;p&gt;Alguns sites para aprender Elixir:&lt;br&gt;
&lt;a href="https://elixirschool.com/pt"&gt;Elixir School&lt;/a&gt;&lt;br&gt;
&lt;a href="https://exercism.org/tracks/elixir"&gt;Exercism&lt;/a&gt;&lt;br&gt;
&lt;a href="https://elixir-lang.org/getting-started/introduction.html"&gt;Documentação da Linguagem&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Fontes:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/true-henrique/elixir-10-motivos-para-aprender-6cd4d6876f05"&gt;https://medium.com/true-henrique/elixir-10-motivos-para-aprender-6cd4d6876f05&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alura.com.br/artigos/programacao-funcional-o-que-e"&gt;https://www.alura.com.br/artigos/programacao-funcional-o-que-e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.lelonek.me/elixir-on-erlang-vm-demystified-320557d09e1f"&gt;https://blog.lelonek.me/elixir-on-erlang-vm-demystified-320557d09e1f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zemuldo.com/blog/erlang-elixir-concurrency-model-5f26fddb356aef5185fd38b9"&gt;https://zemuldo.com/blog/erlang-elixir-concurrency-model-5f26fddb356aef5185fd38b9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.erlang.org/"&gt;https://www.erlang.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://elixir-lang.org/"&gt;https://elixir-lang.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>programacaofuncional</category>
      <category>ptbr</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>[Pt-BR] LiteDB – Banco de dados NoSQL Brasileiro</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Wed, 05 May 2021 10:07:09 +0000</pubDate>
      <link>https://dev.to/joao2391/pt-br-litedb-banco-de-dados-nosql-brasileiro-2clo</link>
      <guid>https://dev.to/joao2391/pt-br-litedb-banco-de-dados-nosql-brasileiro-2clo</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://www.litedb.org/"&gt;LiteDb&lt;/a&gt; é um banco de dados NoSql desenvolvido e mantido pelos brasileiros &lt;a href="https://github.com/mbdavid"&gt;Mauricio David&lt;/a&gt;,&lt;a href="https://github.com/kcsombrio"&gt;Cassiano Sombrio&lt;/a&gt; e &lt;a href="https://github.com/lbnascimento"&gt;Leonardo Nascimento&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Features
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Não necessita de um servidor de documentos NoSql&lt;/li&gt;
&lt;li&gt;Possui uma API simples muito semelhante ao do MongoDb&lt;/li&gt;
&lt;li&gt;Suporte para Portable UWP/PCL&lt;/li&gt;
&lt;li&gt;Recuperação de dados após falha de gravação&lt;/li&gt;
&lt;li&gt;Criptografia de arquivo de dados usando criptografia DES (AES)&lt;/li&gt;
&lt;li&gt;Transações ACID (atomicidade, consistência, isolamento e durabilidade)&lt;/li&gt;
&lt;li&gt;Recuperação de dados após falha de gravação (journal mode)&lt;/li&gt;
&lt;li&gt;Mapeie suas classes POCO para o BsonDocument usando atributos ou usando Fluent Mapper API&lt;/li&gt;
&lt;li&gt;Armazenar arquivos e dados de fluxo (como GridFS no MongoDB)&lt;/li&gt;
&lt;li&gt;Armazenamento de arquivos de dados simples (como SQLite)&lt;/li&gt;
&lt;li&gt;Indexação de campos dos documentos para pesquisa rápida (até 16 índices por coleção)&lt;/li&gt;
&lt;li&gt;Suporte a consultas LINQ&lt;/li&gt;
&lt;li&gt;Shell de comando&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fonte: &lt;a href="https://raphaelcardoso.com.br/conhecendo-e-usando-o-litedb/"&gt;Blog Raphael Cardoso&lt;/a&gt; e &lt;a href="https://www.litedb.org/"&gt;LiteDB&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Setup
&lt;/h1&gt;

&lt;p&gt;Baixe e instale o &lt;a href="https://dotnet.microsoft.com/download/dotnet/5.0"&gt;.NET 5&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Criando uma API integrada com o LiteDB
&lt;/h1&gt;

&lt;p&gt;Para criar um projeto Web API, basta digitar 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;dotnet new webapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a criação do projeto, iremos adicionar o seguinte pacote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet add package LiteDB --version 5.0.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos adicionar as seguintes classes para que o nosso CRUD funcione:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dSQXt95r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w07ip9pl1m1tvmjecgky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dSQXt95r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w07ip9pl1m1tvmjecgky.png" alt="Estrutura do Projeto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para não deixar o artigo muito longo, aqui está os links das classes criadas:&lt;br&gt;
Pasta “Common”:&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Common/Configs.cs"&gt;Config.cs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Common/Constants.cs"&gt;Constants.cs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Common/ILiteDBContext.cs"&gt;ILiteDBContext.cs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Common/LiteDBContext.cs"&gt;LiteDBContext.cs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Common/LiteDBExtensions.cs"&gt;LiteDBExtensions.cs&lt;/a&gt;&lt;br&gt;
Pasta “Controller”:&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Controllers/CustomerController.cs"&gt;CustomerController.cs&lt;/a&gt;&lt;br&gt;
Pasta “Models”:&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Models/Customer.cs"&gt;Customer.cs&lt;/a&gt;&lt;br&gt;
Pasta “Services”:&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Services/ILiteDBServices.cs"&gt;ILiteDBServices.cs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/joao2391/LiteDB_API_Example/blob/master/Services/LiteDBServices.cs"&gt;LiteDBService.cs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repare que a classe “LiteDBExtensions.cs”, está sendo usada para facilitar a manutenção e legibilidade do código.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YCoVcroo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tykcv5ws6fgmcqewjn3x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YCoVcroo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tykcv5ws6fgmcqewjn3x.png" alt="Classe LiteDBExtensions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esses dois métodos de extensão criados, são utilizandos dentro da classe “Startup.cs”.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---vkocyn2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqmmhte51ud0y3ysns30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---vkocyn2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqmmhte51ud0y3ysns30.png" alt="Método ConfigureServices da classe Startup"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Testando nossos endpoints
&lt;/h1&gt;

&lt;p&gt;Primeiro, vamos iniciar a nossa API através do comando:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora, vamos fazer um requisição POST para inserir uma informação em nosso banco de dados:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EXlZ9nXR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rqwt79fenolhl7d3gsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EXlZ9nXR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rqwt79fenolhl7d3gsf.png" alt="Método POST"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qwmAFol1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfr6xenn2cwy6hhyyawa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qwmAFol1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfr6xenn2cwy6hhyyawa.png" alt="Postman POST"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AgQpf6GG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qcdcghmibca7s7o8gj9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AgQpf6GG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qcdcghmibca7s7o8gj9k.png" alt="Postman retorno"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a requisição POST, vamos verificar, através da requisição GET se a informação foi, realmente, inserida&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0AbCRLBN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2goieiw6kx7la0tkibcm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0AbCRLBN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2goieiw6kx7la0tkibcm.png" alt="Método GET"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O9jEUyvN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llyz4t4llrruink2dkod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O9jEUyvN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llyz4t4llrruink2dkod.png" alt="Postman GET"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bGi-lRCw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/64k84rac6qcw1kq8nfe2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bGi-lRCw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/64k84rac6qcw1kq8nfe2.png" alt="Postman retorno"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repare que este método retorna todas as informações, pois não foi especificado um “Id” na hora da requisição.&lt;br&gt;
Para retornar um cadastro específico, bastamos informar o “Id”&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1yzi6Ne5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/692x1cj4z631ehcqviv4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1yzi6Ne5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/692x1cj4z631ehcqviv4.png" alt="Método GET/ID"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O_tVeL57--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2j6ou99t4p70mz80ycc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O_tVeL57--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2j6ou99t4p70mz80ycc.png" alt="Postman GET/ID"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v2Nw_tWU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dgs4ula7eyy5wacin5f2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v2Nw_tWU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dgs4ula7eyy5wacin5f2.png" alt="Postman retorno"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto! Temos nosso primeiro cadastro realizado. Se quisermos alterá-lo ou excluí-lo, temos um endpoint para cada função.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2FhsqZEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/40a9j4lqb2wo3802n5ku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2FhsqZEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/40a9j4lqb2wo3802n5ku.png" alt="Método PUT"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OjsZQxOZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s59whlgbbzg28j3dgg6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OjsZQxOZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s59whlgbbzg28j3dgg6s.png" alt="Postman PUT"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OoNYus4r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wlnb6pm988p33g2pw26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OoNYus4r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wlnb6pm988p33g2pw26.png" alt="Postman Retorno"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Udf2KxCs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6y9jxtyx9m7qwfezrd14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Udf2KxCs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6y9jxtyx9m7qwfezrd14.png" alt="Método DELETE"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8-mwDNp---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cwt0vgqqh30lxtw4sh4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8-mwDNp---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cwt0vgqqh30lxtw4sh4n.png" alt="Postman DELETE"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TKXral6d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vhbbv83yrm6c2cmm9ck4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TKXral6d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vhbbv83yrm6c2cmm9ck4.png" alt="Postman retorno"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas então, onde as informações estão sendo salvas? &lt;br&gt;
As informações são salvas em um arquivo “.db”, localizado dentro do seu projeto&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NRdFDUNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/betdkb3160dzhnripvdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NRdFDUNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/betdkb3160dzhnripvdy.png" alt="arquivos “nameofDb.db”"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As classes de "services" e "context", fazem o trabalho de buscar e inserir as informações dentro do arquivo.&lt;/p&gt;

&lt;p&gt;O nome do arquivo é definido da seguinte maneira:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lxo8J_ir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2nez1hj8bp8nvvr4h3ij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lxo8J_ir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2nez1hj8bp8nvvr4h3ij.png" alt="caminho para o arquivos"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Como podemos perceber, o LiteDB pode ser usado em diversas situações e projetos. Cabe a você decidir onde e quando usá-lo.&lt;/p&gt;

&lt;p&gt;Espero que vocês tenham gostado. Dúvidas, sugestões ou críticas deixem nos comentários.&lt;/p&gt;

&lt;p&gt;Um grande abraço!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>nosql</category>
      <category>litedb</category>
      <category>database</category>
    </item>
    <item>
      <title>[PT-Br] Conheça o Blazor e o poder do WebAssembly</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Sat, 01 May 2021 12:33:47 +0000</pubDate>
      <link>https://dev.to/joao2391/pt-br-conheca-o-blazor-e-o-poder-do-webassembly-3clp</link>
      <guid>https://dev.to/joao2391/pt-br-conheca-o-blazor-e-o-poder-do-webassembly-3clp</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;h2&gt;
  
  
  O que é Blazor?
&lt;/h2&gt;

&lt;p&gt;É um framework para aplicações “client-side” escrito em .NET e rodando em cima do WebAssembly. &lt;br&gt;
É baseado em tecnologias já existentes como HTLM e CSS, mas você pode usar C# e Razor ao invés de Javascript para buildar os componentes. Oferece todos os benefícios de uma plataforma de aplicativo de página única (SPA) rica e moderna ao usar o .NET de ponta a ponta.&lt;br&gt;
A ideia sobre o Blazor é ser capaz de combinar Razor e C # em um projeto da web do lado do cliente que roda completamente no navegador.&lt;/p&gt;
&lt;h2&gt;
  
  
  WebAssembly
&lt;/h2&gt;

&lt;p&gt;WebAssembly é um formato binário para o código no navegador e é executado muito mais rápido do que o JavaScript tradicional. Oferece ao navegador várias vantagens, como:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Executa em desempenho quase nativo
&lt;/li&gt;
&lt;li&gt;É executado em uma caixa de areia segura para a memória
&lt;/li&gt;
&lt;li&gt;Compila a partir de uma variedade de linguagens, ou seja, .NET, C, C ++, Java, Rust, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A principal vantagem do WebAssembly é que ele lida muito bem com trabalhos com muita memória e multithreading, em comparação com o javascript.&lt;/p&gt;
&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;O Blazor contém todos os recursos de uma estrutura web moderna, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um modelo de componente para a construção de IU combinável&lt;/li&gt;
&lt;li&gt;Roteamento&lt;/li&gt;
&lt;li&gt;Layouts&lt;/li&gt;
&lt;li&gt;Formulários e validação&lt;/li&gt;
&lt;li&gt;Injeção de dependência&lt;/li&gt;
&lt;li&gt;Recarregamento ao vivo no navegador durante o desenvolvimento&lt;/li&gt;
&lt;li&gt;Renderização do lado do servidor&lt;/li&gt;
&lt;li&gt;Depuração completa do .NET em navegadores e no IDE&lt;/li&gt;
&lt;li&gt;Rich IntelliSense e ferramentas
&lt;/li&gt;
&lt;li&gt;Publicação e corte de tamanho de aplicativo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Baixe e instale o &lt;a href="https://dotnet.microsoft.com/download" rel="noopener noreferrer"&gt;.NET Core 2.1 SDK (2.1.300 ou posterior)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Baixe e instale o &lt;a href="https://visualstudio.microsoft.com/pt-br/" rel="noopener noreferrer"&gt;Visual Studio 2017 (15.7 ou posterior)&lt;/a&gt; com o ASP.NET e a carga de trabalho de desenvolvimento da web selecionados.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fonte: &lt;a href="https://blazor-tutorial.net/overview" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Um CRUD simples utilizando Blazor, EFCore e InMemoryDatabase
&lt;/h1&gt;

&lt;p&gt;Neste exemplo vou lhes mostrar como fazer um simples CRUD utilizando as seguintes ferramentas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor" rel="noopener noreferrer"&gt;Blazor&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/pt-br/ef/core/" rel="noopener noreferrer"&gt;EFCore&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/pt-br/ef/core/providers/in-memory/?tabs=dotnet-core-cli" rel="noopener noreferrer"&gt;InMemoryDB&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após a instalação do Blazor, vamos criar um projeto através do 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;dotnet new blazorserver -o &amp;lt;VOCE_ESCOLHE_O_NOME&amp;gt; --no-https
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;/div&gt;


&lt;p&gt;Observação: você pode utilizar o &lt;a href="https://visualstudio.microsoft.com/pt-br/" rel="noopener noreferrer"&gt;Visual Studio&lt;/a&gt; e criar o projeto através do caminho “File &amp;gt; New Solution” e pesquisar por “Blazor”&lt;/p&gt;

&lt;p&gt;Para saber se está tudo OK, basta digitar 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;dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Por padrão, já vem criada uma aplicação para você se ambientar com o Blazor. Para visualizar a aplicação, acesse &lt;a href="http://localhost:5000" rel="noopener noreferrer"&gt;http://localhost:5000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos criar as nossas classes, páginas e instalar alguns pacotes necessários para fazermos o CRUD.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup:
&lt;/h2&gt;

&lt;p&gt;Primeiro, vamos instalar o pacote &lt;a href="//ttps://docs.microsoft.com/pt-br/ef/core/providers/in-memory/?tabs=dotnet-core-cli"&gt;Microsoft.EntityFrameworkCore.InMemory&lt;/a&gt;. Para isso, digite o seguinte comando (dentro da pasta do seu projeto):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 3.1.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Codificando
&lt;/h2&gt;

&lt;p&gt;Agora, dentro da pasta “Data”, vamos criar as seguintes classes: “Context.cs” e “ClienteService.cs”.&lt;/p&gt;

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

&lt;p&gt;A classe “ClienteService.cs” terá o seguinte código:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;A classe “Context.cs” terá o seguinte código:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Agora, dentro da pasta “Models”, vamos criar a seguinte classe:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft027l1rjiegisla8ncne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft027l1rjiegisla8ncne.png" alt="Imagem 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A classe “Model.cs” terá o seguinte código:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Agora, dentro da pasta “Pages”, vamos criar a pasta “Clientes” e dentro dela as seguintes páginas: “Cadastrar.razor” e “Editar.razor”.&lt;br&gt;
Ainda na pasta “Pages”, vamos criar a página “Cliente.razor”.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhlrwwswir8kdtjvsnto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhlrwwswir8kdtjvsnto.png" alt="Imagem 3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A página “Cadastrar.razor” terá o seguinte código:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;E a página “Editar.razor” terá o seguinte código:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Repare que em ambas as páginas temos códigos C# escritos dentro do bloco “@code”. Dentro desse bloco é possível criar qualquer código em C#.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando
&lt;/h2&gt;

&lt;p&gt;Após realizar a codificação, rode o comando “dotnet build” para buildar a aplicação. Caso apareça algum erro, leia-o atentamente e verifique os passos anteriores deste artigo.&lt;/p&gt;

&lt;p&gt;Deu tudo certo? Então, vamos rodar nossa aplicação:&lt;br&gt;
dotnet run&lt;/p&gt;

&lt;p&gt;Essa é a nossa página inicial:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvpcmn45bev1hmeeoavp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvpcmn45bev1hmeeoavp.png" alt="Imagem 4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode navegar pelas páginas através do menu no lado esquerdo.&lt;/p&gt;

&lt;p&gt;Nossa págna “Cliente” está vazia:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkb9lelbzb5wki7db9qy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkb9lelbzb5wki7db9qy.png" alt="Imagem 5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos cadastrar alguns clientes:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef2x4vxfn6skfxiweyqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef2x4vxfn6skfxiweyqa.png" alt="Imagem 6"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fww3cw77y30ryq9hl0afs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fww3cw77y30ryq9hl0afs.png" alt="Imagem 7"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frivx4yw5pows02aa3pjn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frivx4yw5pows02aa3pjn.png" alt="Imagem 8"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, nossa página de “Clientes” foi preenchida:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbac0tn26c32un3ctaz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbac0tn26c32un3ctaz2.png" alt="Imagem 9"&gt;&lt;/a&gt;&lt;br&gt;
Repare que podemos editar e excluir o dado cadastrado.&lt;br&gt;
Vamos, primeiro, editar:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvs9nyjd48a25w2c2icg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvs9nyjd48a25w2c2icg.png" alt="Imagem 10"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fieoz34a2ao5jcwi2ldnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fieoz34a2ao5jcwi2ldnw.png" alt="Imagem 11"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxqyzhjk4nj6cy5edixy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxqyzhjk4nj6cy5edixy.png" alt="Imagem 12"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos excluí-lo:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01c0shdgvqa5ck3ugqb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01c0shdgvqa5ck3ugqb2.png" alt="Imagem 13"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkb9lelbzb5wki7db9qy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkb9lelbzb5wki7db9qy.png" alt="Imagem 14"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  We made it!
&lt;/h2&gt;

&lt;p&gt;Todas as funções desse CRUD estão na classe “ClienteService.cs”. Lembra do bloco “@code” dentro das páginas “.razor”?  Pois bem, é nesse bloco que chamamos as funções da nossa classe.&lt;/p&gt;

&lt;p&gt;Este foi um pequeno exemplo de como utilizar o C# com WebAssembly através do Blazor. Espero que tenham gostado.&lt;br&gt;
Qualquer dúvida, crítica ou sugestão deixe nos comentários.&lt;/p&gt;

&lt;p&gt;Còdigo no Github: &lt;a href="https://github.com/joao2391/CRUDBlazor" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um grande abraço!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>blazor</category>
      <category>crud</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>[PT-BR] Automatizando consultas de CEP com HtmlAgilityPack</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Sat, 22 Aug 2020 07:50:25 +0000</pubDate>
      <link>https://dev.to/joao2391/pt-br-automatizando-consultas-de-cep-com-htmlagilitypack-3dke</link>
      <guid>https://dev.to/joao2391/pt-br-automatizando-consultas-de-cep-com-htmlagilitypack-3dke</guid>
      <description>&lt;p&gt;Fala, galera! Beleza?&lt;/p&gt;

&lt;p&gt;Nesse artigo vou lhes mostrar como automatizar consultas de CEPs no &lt;a href="http://www2.correios.com.br/"&gt;site dos Correios&lt;/a&gt; através da biblioteca &lt;a href="https://html-agility-pack.net/"&gt;HtmlAgilityPack&lt;/a&gt; para &lt;a href="https://docs.microsoft.com/pt-br/dotnet/core/"&gt;.NET Core&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vamos lá!&lt;/p&gt;

&lt;p&gt;Obs: para não deixar o artigo muito extenso, não vou explicar o passo a passo para se criar uma aplicação console no .NET Core.&lt;/p&gt;

&lt;p&gt;1) Após a criação da aplicação console, instale a biblioteca do HtmlAgilityPack através do &lt;a href="https://www.nuget.org/packages/HtmlAgilityPack/"&gt;NuGet&lt;/a&gt;.&lt;br&gt;
Você pode instalar usando o Gerenciador de pacotes do nuget dentro do Visual Studio:&lt;/p&gt;

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

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

&lt;p&gt;Agora que já temos nosso pacote instalado, vamos adicionar o seguinte trecho de código:&lt;/p&gt;

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

&lt;p&gt;Uma breve explicação do trecho acima:&lt;br&gt;
 Primeiro, pedimos para que o usuário insira o CEP para que a nossa aplicação busque o endereço correspondente. Após isso, passamos o CEP digitado para o nosso método chamado “BuscaEnderecoPeloCEP(cep)”.&lt;/p&gt;

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

&lt;p&gt;Nessa primeira parte do nosso método, criamos três variáveis do tipo “string”: “httpResponse, html e UrlCorreio”.&lt;br&gt;
Observação: A variável “httpResponse” será responsável por armazenar o html que é retornado após enviarmos uma requisição do tipo POST para o endereço dos Correios (armazenado na variável “UrlCorreio”).&lt;br&gt;
Após isso, iniciamos o nosso bloco "Try-catch". Dentro dele, criamos uma variável do tipo “Dictionary” (Aqui, pode-se usar qualquer coleção que seja do tipo Chave-Valor).&lt;br&gt;
Iremos enviar essa coleção como um &lt;a href="https://docs.microsoft.com/pt-br/dotnet/api/system.net.http.formurlencodedcontent?view=netcore-3.1"&gt;FormUrlEncodedContent&lt;/a&gt; dentro do nosso “HttpRequestMessage”. Para fazer a requisição para a url dos correios, criamos um bloco “using” instanciando um objeto do tipo “HttpClient”. Esse objeto será responsável por fazer a requisição HTTP.&lt;/p&gt;

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

&lt;p&gt;Aqui, instanciamos um objeto do tipo “HtmlDocument” (classe do HtmlAgilityPack). Para podermos extrair todas as informações contidas dentro html retornado, passamos o html para o método “LoadHtml()”.&lt;br&gt;
A váriavel “name” é do tipo “HtmlNodeCollection” e receberá todas as informações contidas na tag html “td”.&lt;br&gt;
As variáveis “bairro, cidade e rua”, receberão as informações contidas nas posições dessa coleção (“name[1], name[2], name[0]”, respectivamente).&lt;br&gt;
Por fim, a variável “endereco” receberá a concatenação das informações contidas em “bairro, cidade e rua” e então retornaremos essa informação.&lt;br&gt;
Caso ocorra alguma exceção, retornaremos a mensagem do erro. (é possível melhorar, e muito, esse tipo de tratamento. Porém, não é o assunto principal aqui).&lt;/p&gt;

&lt;p&gt;Como forma de estudo e afim de abstrair essas funcionalidades, cm março de 2020, criei uma biblioteca em &lt;a href="https://docs.microsoft.com/pt-br/dotnet/standard/net-standard"&gt;.NET Standard 2.0&lt;/a&gt; para realizar essas consultas. Inclusive, é possível buscar os CEPs a partir de um endereço. Caso queira conferir, vou deixar os links aqui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/DotNetCepSearch"&gt;DotNetCepSearch - NuGet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joao2391/DotNetCEPSearch"&gt;DotNetCepSearch - Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>html</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Quick Tip #15</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Fri, 15 May 2020 08:45:34 +0000</pubDate>
      <link>https://dev.to/joao2391/quick-tip-14-2h31</link>
      <guid>https://dev.to/joao2391/quick-tip-14-2h31</guid>
      <description>&lt;p&gt;If you need some fake data to test your REST Api, check 'em out:&lt;br&gt;
&lt;a href="https://my-json-server.typicode.com/"&gt;My JSON Server&lt;/a&gt;&lt;br&gt;
&lt;a href="https://jsonplaceholder.typicode.com/"&gt;JSONPlaceholder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>json</category>
      <category>api</category>
      <category>rest</category>
    </item>
    <item>
      <title>Quick Tip #14</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Wed, 13 May 2020 10:14:08 +0000</pubDate>
      <link>https://dev.to/joao2391/quick-tip-14-59fo</link>
      <guid>https://dev.to/joao2391/quick-tip-14-59fo</guid>
      <description>&lt;p&gt;Do you know JMESPath?&lt;br&gt;
&lt;a href="https://jmespath.org/"&gt;JMESPath&lt;/a&gt; is a query language for JSON.&lt;br&gt;
If you use &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt; you can install an extension and play with it.&lt;br&gt;
It supports a lot of programming languages. Check it &lt;a href="https://jmespath.org/libraries.html"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>json</category>
      <category>jmespath</category>
    </item>
    <item>
      <title>Xpose [Beta Version] - No more F12</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Mon, 11 May 2020 07:39:42 +0000</pubDate>
      <link>https://dev.to/joao2391/xpose-beta-version-no-more-f12-4gl8</link>
      <guid>https://dev.to/joao2391/xpose-beta-version-no-more-f12-4gl8</guid>
      <description>&lt;p&gt;Hi guys!&lt;br&gt;
I've developed a dotnet lib called &lt;a href="https://github.com/joao2391/DotNetExpose"&gt;DotNetExpose&lt;/a&gt;.&lt;br&gt;
The main goal of it is to show the same information when you press F12 (browser dev tools).&lt;br&gt;
So, now I took its functionalities to a browser extension. For now it's available only on &lt;a href="https://addons.mozilla.org/pt-BR/firefox/addon/xpose/?src=search"&gt;FireFox&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;I hope you enjoy it!&lt;/p&gt;

&lt;p&gt;Feel free to follow me on &lt;a href="https://github.com/joao2391/"&gt;Github&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/joaopaulodecastrolima/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>webcrawler</category>
      <category>firefox</category>
      <category>dotnetexpose</category>
    </item>
    <item>
      <title>Quick Tip #13</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Fri, 08 May 2020 07:27:54 +0000</pubDate>
      <link>https://dev.to/joao2391/quick-tip-13-5enh</link>
      <guid>https://dev.to/joao2391/quick-tip-13-5enh</guid>
      <description>&lt;p&gt;If you want to know what that shell script's commands means, just copy and paste on &lt;a href="https://explainshell.com/#"&gt;Explain Shell&lt;/a&gt;.&lt;br&gt;
Try it out!&lt;/p&gt;

</description>
      <category>shellscript</category>
      <category>shell</category>
      <category>bash</category>
      <category>cmd</category>
    </item>
    <item>
      <title>DotNetGoF - Generate Gang of Four Design Pattern templates with .NET Core CLI</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Thu, 07 May 2020 08:10:13 +0000</pubDate>
      <link>https://dev.to/joao2391/dotnetgof-generate-gang-of-four-design-pattern-templates-with-net-core-cli-4b21</link>
      <guid>https://dev.to/joao2391/dotnetgof-generate-gang-of-four-design-pattern-templates-with-net-core-cli-4b21</guid>
      <description>&lt;p&gt;DotNetGoF is a &lt;a href="https://docs.microsoft.com/pt-br/dotnet/core/tutorials/cli-templates-create-project-template" rel="noopener noreferrer"&gt;CLI template for .NET Core&lt;/a&gt;.&lt;br&gt;
You can check the &lt;a href="https://github.com/joao2391/DotNetGoF" rel="noopener noreferrer"&gt;Github repo&lt;/a&gt; and the &lt;a href="https://www.nuget.org/packages/DotNetGoF/" rel="noopener noreferrer"&gt;Nuget Package&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It helps you to generate examples of &lt;a href="https://www.dofactory.com/net/design-patterns" rel="noopener noreferrer"&gt;Gang of Four&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to install
&lt;/h2&gt;

&lt;p&gt;Use the &lt;a href="https://docs.microsoft.com/pt-br/dotnet/core/tools/" rel="noopener noreferrer"&gt;dotnet core CLI&lt;/a&gt; to install DotNetGoF.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new &lt;span class="nt"&gt;--install&lt;/span&gt; DotNetGoF::1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to use
&lt;/h2&gt;

&lt;p&gt;After installed it you'll see a list of templates available. If you want to check if it's all there run&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;p&gt;Choose a directory through your favorite terminal and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new &amp;lt;SHORT_NAME&amp;gt; &lt;span class="c"&gt;#example: dotnet new gofaf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enjoy it!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>gof</category>
      <category>designpattern</category>
    </item>
    <item>
      <title>[PT-BR]DotNetRastreioSearch - Localize objetos nos Correios</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Wed, 06 May 2020 07:29:26 +0000</pubDate>
      <link>https://dev.to/joao2391/pt-br-dotnetrastreiosearch-localize-objetos-nos-correios-123k</link>
      <guid>https://dev.to/joao2391/pt-br-dotnetrastreiosearch-localize-objetos-nos-correios-123k</guid>
      <description>&lt;p&gt;Publiquei mais um package no Nuget relacionado aos Correios. (o primeiro foi um &lt;a href="https://www.nuget.org/packages/DotNetCepSearch"&gt;package para buscar cep e endereço&lt;/a&gt;)&lt;br&gt;
Dessa vez, você pode obter o status de algum objeto enviado pelos Correios.&lt;br&gt;
Caso queira conferir, aqui estão os links:&lt;br&gt;
Nuget: &lt;br&gt;
&lt;a href="https://www.nuget.org/packages/DotNetRastreioSearch/"&gt;https://www.nuget.org/packages/DotNetRastreioSearch/&lt;/a&gt;&lt;br&gt;
Github:&lt;br&gt;
&lt;a href="https://github.com/joao2391/DotNetRastreioSearh"&gt;https://github.com/joao2391/DotNetRastreioSearh&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>webcrawler</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>[PT-BR] Quer Chocolatey?</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Tue, 05 May 2020 07:47:15 +0000</pubDate>
      <link>https://dev.to/joao2391/pt-br-quer-chocolatey-p4k</link>
      <guid>https://dev.to/joao2391/pt-br-quer-chocolatey-p4k</guid>
      <description>&lt;p&gt;Fala, galera! Beleza?&lt;br&gt;
Já ouviram falar do Chocolatey?&lt;br&gt;
Não?&lt;br&gt;
Então vou lhes apresentar…&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://chocolatey.org/"&gt;Chocolatey&lt;/a&gt; é uma solução de gerenciamento de software para Windows (parecido com o &lt;a href="https://www.npmjs.com/"&gt;NPM&lt;/a&gt; do &lt;a href="https://nodejs.org/en/"&gt;NodeJS&lt;/a&gt; ).&lt;/p&gt;

&lt;p&gt;Para instalá-lo é muito simples. Você pode utilizar o &lt;a href="https://docs.microsoft.com/pt-br/windows-server/administration/windows-commands/cmd"&gt;CMD&lt;/a&gt; padrão ou o &lt;a href="https://docs.microsoft.com/pt-br/powershell/scripting/getting-started/getting-started-with-windows-powershell?view=powershell-7"&gt;PowerShell&lt;/a&gt;. Obs: certifique-se de estar como administrador. &lt;br&gt;
Vamos começar pelo &lt;strong&gt;&lt;em&gt;CMD&lt;/em&gt;&lt;/strong&gt;:&lt;br&gt;
1 – Copie e cole o seguinte comando:&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="s2"&gt;"%SystemRoot%&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="s2"&gt;ystem32&lt;/span&gt;&lt;span class="se"&gt;\W&lt;/span&gt;&lt;span class="s2"&gt;indowsPowerShell&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s2"&gt;1.0&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;owershell.exe"&lt;/span&gt; &lt;span class="nt"&gt;-NoProfile&lt;/span&gt; &lt;span class="nt"&gt;-InputFormat&lt;/span&gt; None &lt;span class="nt"&gt;-ExecutionPolicy&lt;/span&gt; Bypass &lt;span class="nt"&gt;-Command&lt;/span&gt; &lt;span class="s2"&gt;"iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; SET &lt;span class="s2"&gt;"PATH=%PATH%;%ALLUSERSPROFILE%&lt;/span&gt;&lt;span class="se"&gt;\c&lt;/span&gt;&lt;span class="s2"&gt;hocolatey&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 – Se não apareceu nenhuma mensagem de erro, basta digitar&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora, pelo &lt;strong&gt;&lt;em&gt;PowerShell&lt;/em&gt;&lt;/strong&gt; :&lt;br&gt;
1 -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  Run Get-ExecutionPolicy 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso o retorne uma mensagem "Restricted", então execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; Set-ExecutionPolicy AllSigned 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Set-ExecutionPolicy Bypass &lt;span class="nt"&gt;-Scope&lt;/span&gt; Process 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 – Agora, copie e cole o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Set-ExecutionPolicy Bypass &lt;span class="nt"&gt;-Scope&lt;/span&gt; Process &lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; iex &lt;span class="o"&gt;((&lt;/span&gt;New-Object System.Net.WebClient&lt;span class="o"&gt;)&lt;/span&gt;.DownloadString&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://chocolatey.org/install.ps1'&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3 - Se não apareceu nenhuma mensagem de erro, basta digitar&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;choco&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 ou&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;choco -?&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Para instalar algum software via Chocolatey, basta digitar&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;choco install &amp;lt;nomedopacote&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 Você pode pesquisar pelos softwares disponíveis nesse &lt;a href="https://chocolatey.org/packages"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para mais informações, acesse o &lt;a href="https://chocolatey.org"&gt;site oficial do Chocolatey&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Muito obrigado pela atenção!&lt;br&gt;
Até mais!&lt;/p&gt;

</description>
      <category>windows</category>
      <category>chocolatey</category>
    </item>
    <item>
      <title>Quick Tip #12</title>
      <dc:creator>João Paulo de C. Lima</dc:creator>
      <pubDate>Tue, 05 May 2020 07:24:48 +0000</pubDate>
      <link>https://dev.to/joao2391/quick-tip-12-5hg6</link>
      <guid>https://dev.to/joao2391/quick-tip-12-5hg6</guid>
      <description>&lt;p&gt;A lot of courses and tutorials about differents kinds of programming languages.&lt;br&gt;
Check &lt;a href="https://hackr.io/"&gt;this&lt;/a&gt; out!&lt;/p&gt;

</description>
      <category>course</category>
      <category>tutorial</category>
      <category>programminglanguages</category>
    </item>
  </channel>
</rss>
