<?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: Renan Marquetti</title>
    <description>The latest articles on DEV Community by Renan Marquetti (@renan_marquetti_9d8acb2b1).</description>
    <link>https://dev.to/renan_marquetti_9d8acb2b1</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%2F3094452%2F4b9019c8-0031-4970-925c-181cfc3534ad.png</url>
      <title>DEV Community: Renan Marquetti</title>
      <link>https://dev.to/renan_marquetti_9d8acb2b1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renan_marquetti_9d8acb2b1"/>
    <language>en</language>
    <item>
      <title>Quantas cartas tem em uma torre de cartas com N andares?</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Thu, 28 Aug 2025 02:28:29 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/quantas-cartas-tem-em-uma-torre-de-cartas-com-n-andares-3l1n</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/quantas-cartas-tem-em-uma-torre-de-cartas-com-n-andares-3l1n</guid>
      <description>&lt;h2&gt;
  
  
  Por que esta pergunta?
&lt;/h2&gt;

&lt;p&gt;Você pode estar se perguntando: por que devo saber responder uma pergunta como essa? Isso faz alguma diferença na minha vida?&lt;/p&gt;

&lt;p&gt;Pois bem, eu nunca entendi a força de uma pergunta (e resposta) como essa, até uma recente experiência, então decidi compartilhá-la com a comunidade, para dar exemplo de como os detalhes podem fazer imensa diferença.&lt;/p&gt;

&lt;p&gt;Recentemente participei de um happy hour promovido pela empresa que eu trabalho atualmente (&lt;a href="https://woovi.com/" rel="noopener noreferrer"&gt;woovi&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Todos nós chamamos um motorista de aplicativo, e o CTO veio conosco no carro.&lt;/p&gt;

&lt;p&gt;Durante o fluir da conversa, chegamos ao assunto matemática. &lt;/p&gt;

&lt;p&gt;Eu gosto de matemática, sempre me dei bem desde o colégio.&lt;/p&gt;

&lt;p&gt;O CTO queria nos mostrar como, às vezes, perguntas simples podem nos levar a raciocínios complexos e como a matemática é o melhor método para ordenar a razão humana.&lt;/p&gt;

&lt;p&gt;Então ele fez a seguinte pergunta: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quantas cartas tem em uma torre de cartas com 10 andares?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Confesso que isso me chamou a atenção logo de cara, é o tipo de pergunta que ajuda a dar um maior sentido para a minha vida, então decidi tentar até conseguir.&lt;/p&gt;

&lt;p&gt;Estávamos todos no carro, a caminho do happy hour. &lt;/p&gt;

&lt;p&gt;O meu celular estava sem internet, então não tinha como usar nenhuma ajuda externa; era eu e o problema.&lt;/p&gt;

&lt;p&gt;Fiquei uns 20 minutos pensando, consegui chegar a uma fórmula que parecia resolver a questão, fiz as contas de cabeça e respondi: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;152.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na conferência, viram que estava errado; o correto era 155. Errei por 3 cartas. &lt;/p&gt;

&lt;p&gt;Vi que tinha cometido alguns erros de raciocínio e de cálculo.&lt;/p&gt;

&lt;p&gt;Pensei mais profundamente sobre o problema, corrigi a minha fórmula e o meu cálculo, com isso cheguei à resposta 155.&lt;/p&gt;

&lt;p&gt;Não disse o valor de imediato, visto que sei que a grande capacidade da mente humana é saber lidar com raciocínio abstrato, então decidi proclamar primeiro a fórmula para depois o resultado.&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%2F613dkr9a6uoeglccpio0.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%2F613dkr9a6uoeglccpio0.png" alt=" " width="454" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todos acharam legal o ocorrido, estamos perto do destino, mas conseguiram validar que a fórmula produzia valores corretos.&lt;/p&gt;

&lt;p&gt;Este assunto chegou até o nosso happy hour, gostaram de saber, mas fizeram a pergunta que faz qualquer um tremer: por que esta fórmula é correta? Como chega-se nela?&lt;/p&gt;

&lt;h2&gt;
  
  
  Como cheguei à resposta?
&lt;/h2&gt;

&lt;p&gt;Eu não conseguia explicar de uma forma fácil como tinha chegado na resposta, isso gerou confusão em alguns.&lt;/p&gt;

&lt;p&gt;Então decidi corrigir essa questão, simplifiquei a fórmula e o raciocínio para chegar até lá, está a fórmula simplificada:&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%2F2v1zgw4yw78x8g1qzai4.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%2F2v1zgw4yw78x8g1qzai4.png" alt=" " width="273" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O meu raciocínio se deu da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separe a torre em células de três cartas como essa.&lt;/li&gt;
&lt;/ul&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%2Fdkubzhaja5iynvuq5jec.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%2Fdkubzhaja5iynvuq5jec.png" alt=" " width="341" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resolvendo com 1 andar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observe que, em uma torre com 1 andar, só cabe uma célula.&lt;/li&gt;
&lt;li&gt;Logo, poderíamos deduzir que, em uma torre com um andar, serão necessárias 3 cartas, mas isso apenas se quisermos montar a torre com as cartas da base também. Como queremos a torre sem a base, temos que descontar a base.&lt;/li&gt;
&lt;li&gt;Logo, a dedução correta seria: uma célula vezes 3 cartas menos a base, 1*3 - 1 = 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resolvendo com 2 andares: &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%2F1jla1y9r70vzvlracayh.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%2F1jla1y9r70vzvlracayh.png" alt=" " width="771" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos seguir a mesma linha de raciocínio anterior, mas com um degrau a mais, e ver o que mudou.&lt;/li&gt;
&lt;li&gt;Para fins didáticos, conte os andares de cima para baixo.&lt;/li&gt;
&lt;li&gt;Observe que no 1° andar ainda temos 1 célula; no 2° andar, 2 células.&lt;/li&gt;
&lt;li&gt;Observe também que temos 2 cartas de base no segundo andar.&lt;/li&gt;
&lt;li&gt;Com isso, podemos deduzir que a conta seria a seguinte: uma célula do 1° andar, mais 2 células do 2° andar, menos as 2 cartas da base, (1+ 2) * 3 - 2 = 7.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Entendendo o padrão
&lt;/h2&gt;

&lt;p&gt;Apesar de ser poucos exemplos, conseguimos observar alguns padrões aqui: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A quantidade de células por andar é igual ao número do andar, logo deduz: 1° andar -&amp;gt; 1 célula, 2° andar -&amp;gt; 2 células, etc...&lt;/li&gt;
&lt;li&gt;A quantidade de cartas na base também é igual ao número do andar, então entendemos que: 1° andar -&amp;gt; 1 carta na base, 2° andar -&amp;gt; 2 cartas na base.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com essas observações, já conseguimos deduzir que, para chegar ao total de cartas contidas em uma torre de cartas com N andares, devemos: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Somar o total de células contidas em cada andar.&lt;/li&gt;
&lt;li&gt;Multiplicar o total de células pela quantidade de cartas em cada célula (nesse caso, 3).&lt;/li&gt;
&lt;li&gt;Pegar o resultado e subtrair as cartas que estão na base da torre (sempre será igual à quantidade de andares na torre).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Montando a fórmula
&lt;/h2&gt;

&lt;p&gt;O raciocínio é bem simples, na verdade, mas você pode ter se deparado com um problema logo de cara.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;como somar todas as células presente em todos os andares?&lt;br&gt;
se tiver 100 andares, vou ter que somar 100 + 99 + 98 ... + 2 + 1?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A sua dúvida é bem pertinente, na verdade, mas tem uma solução fácil.&lt;/p&gt;

&lt;p&gt;A grande maioria das pessoas conhece o operador matemático fatorial (símbolo: !), mas, fora ele, existem diversos outros, entre eles o operador &lt;a href="https://pt.wikipedia.org/wiki/Termial" rel="noopener noreferrer"&gt;termial&lt;/a&gt; (símbolo: ?), que atende exatamente essa demanda.&lt;/p&gt;

&lt;p&gt;Ao estudarmos o operador terminal, descobrimos que podemos usar a seguinte fórmula para resolver a questão mais facilmente e nos poupar esse trabalho massante:&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%2Ftdye3b7clw9o2h6rm98s.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%2Ftdye3b7clw9o2h6rm98s.png" alt=" " width="210" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se usarmos essa fórmula como a solução base para o primeiro passo da solução, basta adicionar as operações do segundo e terceiro passo e teremos a fórmula completa (não simplificada): &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%2F0xqq6kbb257bvxm82jzl.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%2F0xqq6kbb257bvxm82jzl.png" alt=" " width="298" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Simplificando um pouco mais a fórmula
&lt;/h2&gt;

&lt;p&gt;Nós conseguimos reduzir um pouco a complexidade ao simplificarmos uma operação da nossa fórmula.&lt;/p&gt;

&lt;p&gt;Observe que temos 2 constantes na nossa fórmula: &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%2Fnlnzeomeq92j3cp5zg2u.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%2Fnlnzeomeq92j3cp5zg2u.png" alt=" " width="259" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A divisão por dois da fração e a multiplicação por três podemos unir as duas em uma única operação de multiplicação, visto que:&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%2Fgaeyy2pyzcc8jxtmkpdl.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%2Fgaeyy2pyzcc8jxtmkpdl.png" alt=" " width="277" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso, podemos simplificar a fórmula para: &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%2F70xe5abb4pay9zyterxp.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%2F70xe5abb4pay9zyterxp.png" alt=" " width="266" height="61"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agradecimentos
&lt;/h2&gt;

&lt;p&gt;Muito obrigado a você, leitor, que veio até aqui. &lt;/p&gt;

&lt;p&gt;Acompanhar uma linha de raciocínio como essa não é um privilégio de todos.&lt;/p&gt;

&lt;p&gt;Também quero agradecer ao meu CTO que me incentivou a escrever esse artigo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como construir um computador do zero - Controler</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 16 Aug 2025 03:45:29 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-controler-4lb</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-controler-4lb</guid>
      <description>&lt;p&gt;O coração do nosso projeto é a central que dispara e opera todos os comandos do nosso computador, tem por objetivo principal interpretar e executar os comandos do nosso software.&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%2F3h4lv6f75mo96jx503sd.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%2F3h4lv6f75mo96jx503sd.png" alt=" " width="763" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É um dos componentes mais sensíveis do nosso projeto, aqui o menor erro faz com que tudo simplesmente não funcione, além de ser difícil encontrar o erro.&lt;/p&gt;

&lt;p&gt;Esta seção é composta de alguns componentes, sendo eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Registrador de instruções: um velho conhecido nosso, tem por objetivo guardar e persistir a instrução em execução naquele ciclo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Program Counter: é o componente que dita (e incrementa) qual instrução vai ser executada naquele ciclo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Contador de clock: dita em qual etapa de execução da instrução estamos (temos 5 etapas por padrão).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Controler: agrega todos os componentes acima e dita quais sinais cada componente vai receber naquela etapa de processamento.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Registrador de instruções
&lt;/h3&gt;

&lt;p&gt;Esse registrador se difere um pouco dos outros pelo fato de, além de ter as entradas e saídas padrão, ele possuir uma saída especial que envia um sinal com os 4 bits mais significativos diretamente para o controlador.&lt;/p&gt;

&lt;p&gt;Esse sinal contém o valor da instrução que vai ser executada dentro do ciclo de instrução.&lt;/p&gt;

&lt;p&gt;Esquema deste componente: &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%2F7fngelyfxyim4271v1r1.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%2F7fngelyfxyim4271v1r1.png" alt=" " width="528" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Program Counter
&lt;/h3&gt;

&lt;p&gt;Este componente não tem um nome muito assertivo, isso pode levar algumas pessoas à confusão, mas o seu funcionamento é muito simples.&lt;/p&gt;

&lt;p&gt;Imagine um contador que começa em 0 e vai incrementando (somando mais um) sempre que você clica em um botão. Pois bem, essa é a função deste componente.&lt;/p&gt;

&lt;p&gt;Este componente possui um valor interno que começa em 0 e vai incrementando sempre que termina o ciclo de instrução anterior, isso é importante quando se quer ler ou executar os dados da memória de forma sequencial (o padrão de quase todo software).&lt;/p&gt;

&lt;p&gt;Apesar de ler os dados da memória de forma sequencial ser o modo padrão de execução, também é possível pular para qualquer outro valor definido no nosso software, chamamos isso de jump (ou pulo).&lt;/p&gt;

&lt;p&gt;O valor contido dentro do contador de programa determina qual endereço de memória será lido no início do ciclo de instrução. Como o nosso contador sempre começa em 0, isso quer dizer que o nosso software sempre será escrito nos primeiros endereços de memória.&lt;/p&gt;

&lt;p&gt;Esquema deste componente: &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%2Fuxyqmq4o50v7l2gaaay1.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%2Fuxyqmq4o50v7l2gaaay1.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Contador de clock
&lt;/h3&gt;

&lt;p&gt;O nosso computador contém um ciclo de máquina de 5 etapas, isso quer dizer que todas as instruções do nosso computador têm que ser executadas em 5 clocks ou menos.&lt;/p&gt;

&lt;p&gt;Instruções mais complexas requerem mais ciclos para serem executadas, e instruções mais simples requerem poucos ciclos para serem executadas.&lt;/p&gt;

&lt;p&gt;Este componente tem a função de informar em qual das 5 etapas de clock a instrução está, ele é um importante componente auxiliar do controlador. &lt;/p&gt;

&lt;p&gt;Esquema deste componente: &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%2Fqay79m3avziutuxry0d2.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%2Fqay79m3avziutuxry0d2.png" alt=" " width="567" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Controller
&lt;/h3&gt;

&lt;p&gt;Este componente é verboso tanto quanto sensível, mas apesar destas condições, o seu funcionamento é simples.&lt;/p&gt;

&lt;p&gt;Este componente tem a função de receber um sinal de instrução e, a partir disto, ativar os componentes corretos para execução total da instrução.&lt;/p&gt;

&lt;p&gt;Esquema deste componente: &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%2Fcqgfv7rdjv6pbfv1z5nm.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%2Fcqgfv7rdjv6pbfv1z5nm.png" alt=" " width="597" height="866"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como construir um computador do zero - Output</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 16 Aug 2025 03:41:12 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-output-3o85</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-output-3o85</guid>
      <description>&lt;p&gt;Está parte serve para armazenar converter e exibir a saída do nosso software, apesar de ter poucos componentes (apenas 2 externos e um interno) um deles se destaca pela sua grande verbosidade&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%2Fy0p7aq9unq25h2131lma.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%2Fy0p7aq9unq25h2131lma.png" alt=" " width="551" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este sistema faz o uso de 3 componentes, sendo eles&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registrador de saída: um velho conhecido nosso, tem a função de armazenar e persistir os dados de saída do nosso computador.&lt;/li&gt;
&lt;li&gt;ComplementoDe2: é um componente interno, utilizado para exibir números com sinal negativo.&lt;/li&gt;
&lt;li&gt;ConversorBase10: ele converte um numero de 8 bits em seu equivalente decimal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Registrador de Saída
&lt;/h3&gt;

&lt;p&gt;O registrador já um dos nossos velhos conhecidos, para se iterar melhor, basta olhar os nossos artigos anteriores.&lt;/p&gt;

&lt;h3&gt;
  
  
  ComplementoDe2
&lt;/h3&gt;

&lt;p&gt;Este componente auxiliar é necessário para exibir números com sinal, isso se deve ao fato de que é possível interpretar um numero binário, de duas formas, com sinal e sem sinal.&lt;/p&gt;

&lt;p&gt;Números com sem sinal sempre partem de 0, não sendo possível representar números negativos, deve ser usado, para representar valores que nunca vai ser menor que 0 (distancia, velocidade, volume, etc...)&lt;/p&gt;

&lt;p&gt;A vantagem deste sistema é que você dobra o valor máximo que pode ser armazenados em N bits, por exemplo um numero de 8 bits pode ir de 0 até 255, sem sinal.&lt;/p&gt;

&lt;p&gt;Números com sinal devem ser usados para representar valores que podem ser menor do que 0 (temperatura, pagamentos, etc...)&lt;/p&gt;

&lt;p&gt;A vantagem desse sistema é que é possível representar números menores do que 0, a custo de um teto menor para números positivos, por exemplo um numero de 8 bits com sinal pode ir de -128 até 127.&lt;/p&gt;

&lt;p&gt;Este componente é necessário para converter o sinal de saída de números como sinal para os valores corretos, caso contrario o nosso sistema trataria todos os inputs como valores com sinal.&lt;/p&gt;

&lt;p&gt;Esquema deste componente:&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%2Foeg0mqio67ictm02d8x0.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%2Foeg0mqio67ictm02d8x0.png" alt=" " width="800" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ConversorBase10
&lt;/h3&gt;

&lt;p&gt;Tenho um carinho especial por esse componente porque ele foi o meu maior componente 100% autoral (fiz completamente da minha cabeça, não busquei nada pronto) neste projeto.&lt;/p&gt;

&lt;p&gt;O nosso computador tem base binária, isso quer dizer que os números também são computados em base binária, isso facilita o projeto como um todo, mas dificulta a leitura para humanos.&lt;/p&gt;

&lt;p&gt;Sendo assim, então é necessário uma forma de converter o sistema de binário para decimal.&lt;/p&gt;

&lt;p&gt;Este componente realiza essa função, ele converte o sinal de 8 bits em 3 sinais de 4 bits, sendo que cada sinal de saída representa os valores de unidade, dezena e centena.&lt;/p&gt;

&lt;p&gt;Também possui mais uma saída especial, que é ativada quando o número é negativo, usamos esse sinal para exibir o carácter '-' antes do número em exibição. &lt;/p&gt;

&lt;p&gt;Esquema deste componente:&lt;/p&gt;

&lt;p&gt;Entrada.&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%2Fly3w44i1ywhknyxske28.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%2Fly3w44i1ywhknyxske28.png" alt=" " width="624" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Saída da unidade.&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%2Fdzzbo0dvnmq2thfc4yas.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%2Fdzzbo0dvnmq2thfc4yas.png" alt=" " width="800" height="708"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Saída da dezena.&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%2Fb833y2np1lsmanm281jt.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%2Fb833y2np1lsmanm281jt.png" alt=" " width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Saída da centena.&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%2Fcgfsp6zsmjlybpish6pk.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%2Fcgfsp6zsmjlybpish6pk.png" alt=" " width="800" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como construir um computador do zero - Unidade Lógico Aritmética</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 16 Aug 2025 03:25:28 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-unidade-logico-aritmetica-6en</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-unidade-logico-aritmetica-6en</guid>
      <description>&lt;p&gt;Está parte do sistema é responsável pelo processamento lógico no nosso sistema, é onde de fato os dados são transformados, compostos e decompostos, até atingir o resultado desejado&lt;/p&gt;

&lt;p&gt;Esse componente é o mais complexo do nosso sistema, porque agrega muitas regras de negocio em um único espaço&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%2Fg1jm4q7lxk4qmthygi8e.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%2Fg1jm4q7lxk4qmthygi8e.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Está sessão do sistema é composta por 3 componentes, sendo eles: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registrador A (ou Acumulador): é um registrador usado para persistir e guardar os resultados das operações do sistema&lt;/li&gt;
&lt;li&gt;Registrador B: é o registrador auxiliar, usado para "memoria de trabalho", tem a função de receber o valor a será processado sobre o valor do Registrador A.&lt;/li&gt;
&lt;li&gt;ULA: é de fato a onde ocorre o processamento, tem por objetivo processar os valores dos registradores A e B e armazenar novamente esse valor no registrador A&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Registradores A e B
&lt;/h3&gt;

&lt;p&gt;Os Registradores já foram abordados em artigos anteriores, e todas as suas conexões estão descritas na imagem acima&lt;/p&gt;

&lt;h3&gt;
  
  
  Unidade Lógica e Aritmética (ULA)
&lt;/h3&gt;

&lt;p&gt;Este componente é capaz de processar os valores dos Registradores A e B de diversas formas diferentes, conseguimos fazer diversas operações, sendo elas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adição (ADD)&lt;/li&gt;
&lt;li&gt;Subtração (SUB)&lt;/li&gt;
&lt;li&gt;Lógica e (AND)&lt;/li&gt;
&lt;li&gt;Lógica ou (OR)&lt;/li&gt;
&lt;li&gt;Lógica ou exclusivo (XOR)&lt;/li&gt;
&lt;li&gt;Lógica negação (NOT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os inputs ALU_0 e ALU_1, são utilizados para selecionar a operação deseja, veja a tabela a baixo&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ALU_0&lt;/th&gt;
&lt;th&gt;ALU_1&lt;/th&gt;
&lt;th&gt;Operação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;ADD/SUB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;OR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;AND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;XOR/NOT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Observe que nos casos em que á mais de duas operações por seleção, será feito uma desambiguação em inputs específicos, portanto sendo necessário nos casos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ADD/SUB: utilize o input N_SUB_ADD em 0 para SUB e 1 para ADD&lt;/li&gt;
&lt;li&gt;XOR/NOT: utilize o input N_XOR_NOT em 0 para XOR e 1 para NOT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;À também mais um input de entrada: ALU_OUT, server para liberar o resultado da operação para o BUS&lt;/p&gt;

&lt;p&gt;Além desta, há mais uma saída: Carry_out, está saída é ativa quando o resultado das operações de soma ou subtração resultam em um overflow.&lt;/p&gt;

&lt;p&gt;Este é o esquema desse componente:&lt;br&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%2Fqxqqremrdkcic9b2lhox.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%2Fqxqqremrdkcic9b2lhox.png" alt=" " width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como construir um computador do zero - Memória Ram</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 16 Aug 2025 03:02:04 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-memoria-ram-39jp</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-memoria-ram-39jp</guid>
      <description>&lt;h2&gt;
  
  
  Memoria Ram
&lt;/h2&gt;

&lt;p&gt;A rainha do nosso computador, é o sistema que tem por objetivo armazenar os dados dentro do nosso computador, tudo está aqui (ou quase tudo), programas, dados base, dados de pós processamento, etc...&lt;/p&gt;

&lt;p&gt;A memória ram na verdade é muito similar a memoria rom, com a diferença que a memoria ram aceita tanto ler quanto gravar dados nela, principalmente durante a execução do software&lt;/p&gt;

&lt;p&gt;Sistema de ram é composto de basicamente de 3 componentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registrador de 8 bits&lt;/li&gt;
&lt;li&gt;Memory Address Register 4 bits (MAR)&lt;/li&gt;
&lt;li&gt;Random Access Memory 16 bytes (RAM)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Registrador de 8 bits
&lt;/h3&gt;

&lt;p&gt;Esse é o componente mais utilizado no nosso projeto, tem a função de armazenar uma pequena quantidade de informação (8 bits ou 1 byte) e persisti-la entre os ciclos de clock, será o componente mais importante de todo o sistema de memoria do computador.&lt;/p&gt;

&lt;p&gt;Apesar desse alto grau de importância o componente é muito simples, ele possui 1 entrada e saída para o bus (ou barramento), mais uma entrada para o pulso de clock e outra entrada para o pulso de reset.&lt;/p&gt;

&lt;p&gt;todas essas estradas são padrão em praticamente todos os componentes do nosso computador, mas o registrador possui mais duas entradas especificas para o registrador, sendo elas permitir entrada de dados (REG_IN) e permitir saída de dados (REG_OUT)&lt;/p&gt;

&lt;p&gt;Esquema deste componente:&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%2F638g2i76kr44ze1cqyg8.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%2F638g2i76kr44ze1cqyg8.png" alt=" " width="800" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Address Register 4 bits (MAR)
&lt;/h3&gt;

&lt;p&gt;Este componente tem a função de registrar (ou armazenar) os endereços de memoria que vão ser utilizados naquele sub-ciclo da instrução.&lt;/p&gt;

&lt;p&gt;É muito similar ao componente acima, mas o Registrador é de uso geral, já o MAR é de uso especifico, só será usado nesta cessão.&lt;/p&gt;

&lt;p&gt;Alem das entradas e saídas padrão (BUS_IN, CLK e RESET) ele possui outras entradas de uso especifico, sendo elas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PGR_RUN: é o input que altera o estado do nosso componente para operar em modo de programação.&lt;/li&gt;
&lt;li&gt;MAR_DIP: é a onde fica o input de endereço, quando o computador está em modo de programação.&lt;/li&gt;
&lt;li&gt;MAR_IN: quando ativo permite a entrada de um novo valor de endereço, caso contrario será mantido o valor vigente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;À também uma saída de uso especio (MAR_ADDR) que será utilizada apenas para abastecer a memoria RAM com o endereço que se deseja ler ou gravar naquele momento. &lt;/p&gt;

&lt;p&gt;Esquema deste componente:&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%2Fxh6l7kqg24jlq3sh7430.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%2Fxh6l7kqg24jlq3sh7430.png" alt=" " width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Random Access Memory 16 bytes (RAM)
&lt;/h3&gt;

&lt;p&gt;A Memoria RAM tem a função de armazenar os dados do nosso computador, sendo possível alterar o valor contido em qualquer endereço, equanto o nosso software executa.&lt;/p&gt;

&lt;p&gt;Mais do que um simples sistema de memoria, a RAM é a representação máxima do estado atual do nosso computador, tudo começa e passa por ela.&lt;/p&gt;

&lt;p&gt;Apesar de sua enorme importância o seu funcionamento é bem simples, basta selecionar um endereço que deseja consumir naquele momento e escolher as operações de leitura ou gravação.&lt;/p&gt;

&lt;p&gt;Este componente possui as entradas e saídas padrão (BUS_IN, BUS_OUT, CLK e RESET), e possui mais alguma entradas para uso especifico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ADDR: é o input para seleção do endereço atual de operação.&lt;/li&gt;
&lt;li&gt;RAM_IN: quando ativo insere o valor do BUS no endereço selecionado.&lt;/li&gt;
&lt;li&gt;RAM_OUT: quando ativo envia o valor do endereço selecionado para o BUS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esquema deste componente:&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%2Fmlsgqz1ppiw1ng7qaqei.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%2Fmlsgqz1ppiw1ng7qaqei.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como construir um computador do zero - Sistema de Input</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 16 Aug 2025 02:32:45 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-sistema-de-input-28cp</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-sistema-de-input-28cp</guid>
      <description>&lt;h3&gt;
  
  
  Sistema de Input
&lt;/h3&gt;

&lt;p&gt;Esta seção do computador é onde se encontram os componentes que recebem os inputs do usuário, ou seja, é onde tudo começa. &lt;/p&gt;

&lt;p&gt;Nesta seção, o usuário consegue dar "partida" no computador, retesar e "zerar" o seu estado (apagando os programas em execução).&lt;/p&gt;

&lt;p&gt;Se o nosso computador fosse um carro, aqui é onde ficaria o "cockpit", pedais de embreagem, acelerador, freio, etc...&lt;/p&gt;

&lt;p&gt;Esse sistema é composto por 4 componentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;botão de reset (freio)&lt;/li&gt;
&lt;li&gt;botão programa em execução (embreagem)&lt;/li&gt;
&lt;li&gt;gerenciamento de clock (acelerador)&lt;/li&gt;
&lt;li&gt;Memória ROM (volante)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos explorar cada um destes componentes.&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%2Fdt7vyphln5jb3n8gaudb.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%2Fdt7vyphln5jb3n8gaudb.png" alt=" " width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Botão de Reset
&lt;/h3&gt;

&lt;p&gt;É o componente mais simples do nosso sistema, ele literalmente é um botão que dispara um pulso no computador, esse pulso vai ser capturado pelos demais componentes do sistema, que irá "zerar" todos os seus valores internos (ficaram mais claros com o avançar do projeto).&lt;/p&gt;

&lt;p&gt;Esquema do componente: &lt;br&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%2Fclxi8bgxmdr36dfk4h3y.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%2Fclxi8bgxmdr36dfk4h3y.png" alt=" " width="262" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pino programa em execução
&lt;/h3&gt;

&lt;p&gt;Esse pino dita o modo de execução do nosso computador, são dois modos possíveis, sendo eles: modo de programação e modo de execução.&lt;/p&gt;

&lt;p&gt;Modo de Programação: esse modo serve para preparar o computador para receber as instruções do programa, serve literalmente para isso, é um modo em que não é executada nenhuma instrução, elas apenas são gravadas na memória para posterior consumo.&lt;/p&gt;

&lt;p&gt;Modo de Execução: nome autoexplicativo, ele começa a executar o software gravado na memória do nosso computador, seguindo assim o seu ciclo normal de computação. Quando dá certo, a gente nota que a vida passa a fazer sentido novamente, e no meio de um imenso oceano de dor e angústia, a verdade triunfa e mais nada será como antes.&lt;/p&gt;

&lt;p&gt;Ou não.&lt;/p&gt;

&lt;p&gt;Apesar da explicação longa, o sistema é inversamente curto e simples.&lt;/p&gt;

&lt;p&gt;Esquema do componente: &lt;br&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%2Fgiu1e42jx0zny7l3mafm.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%2Fgiu1e42jx0zny7l3mafm.png" alt=" " width="413" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gerenciamento de clock
&lt;/h3&gt;

&lt;p&gt;Este é o subsistema responsável por controlar o clock (ou pulsos) do nosso computador, é um dos componentes mais simples e importantes do nosso computador.&lt;/p&gt;

&lt;p&gt;Ele é responsável por sincronizar o processamento do nosso sistema, fazendo com que todos os componentes trabalhem em conjunto de forma ordenada.&lt;/p&gt;

&lt;p&gt;Possui 3 pinos de entradas no componente: entrada de seleção de modo de execução (mais detalhes à frente), entrada de clock manual, entrada para a instantânea do sistema (utilizada para encerrar a execução do software).&lt;/p&gt;

&lt;p&gt;O componente também possui 2 modos de operação, sendo eles: manual e automático.&lt;/p&gt;

&lt;p&gt;No modo automático, ele libera pulsos em uma frequência constante, sem depender de nenhum outro input do usuário.&lt;/p&gt;

&lt;p&gt;No modo manual, é o usuário que libera o pulso através de um botão. Usamos esse modo para verificar o processamento passo a passo, tem por objetivo entender e verificar o correto funcionamento do computador (vai por mim, esse botão está aí por um bom motivo).&lt;/p&gt;

&lt;p&gt;Esquema do componente: &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%2F8dgql6i5a738fd86t1oa.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%2F8dgql6i5a738fd86t1oa.png" alt="Seletor de clock." width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Memória ROM
&lt;/h3&gt;

&lt;p&gt;Apesar de ser um componente grande, tem uma função igualmente simples, é como se fosse o "disquete" (ou pendrive para os mais novos) que vamos usar para instalar o programa.&lt;/p&gt;

&lt;p&gt;Tem a única função de guardar os bytes do nosso programa e liberar conforme for solicitado, é mais um facilitador que uma obrigatoriedade, tem como seguir sem ele, mas a dor de cabeça é um pouco maior.&lt;/p&gt;

&lt;p&gt;Esquema do componente: &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%2Fd4g2yssrf92ufjpzubtn.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%2Fd4g2yssrf92ufjpzubtn.png" alt=" " width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OBS: esse componente utiliza o "ProgramCounter", um componente que vamos especificar mais adiante, na seção de controle, se preferir pode pular esse componente por hora.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como construir um computador do zero - Introdução.</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 16 Aug 2025 02:21:14 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-introducao-2o2p</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-usando-logisim-introducao-2o2p</guid>
      <description>&lt;h2&gt;
  
  
  O que leva alguém a construir um computador do zero, nos dias atuais?
&lt;/h2&gt;

&lt;p&gt;Eu comecei a programar relativamente tarde (por volta dos 24 anos), mas foi amor à primeira vista, me apaixonei logo de cara.&lt;/p&gt;

&lt;p&gt;No começo da minha jornada de estudos, eu encontrei diversos desafios, mas pude ser agraciado com vitórias maiores ainda.&lt;/p&gt;

&lt;p&gt;Sempre fui uma pessoa curiosa, constantemente buscava entender como o mundo em minha volta, desde o formar das gotas de chuva, até as questões profundas da alma humana (fique tranquilo, não vamos tão longe nestes artigos).&lt;/p&gt;

&lt;p&gt;Com o computador não foi diferente, quando tinha meus meros 14 anos de idade, o pai comprou um computador para nós (eu e meu irmão), desde então sempre tive curiosidade de saber como tudo aquilo funcionava por baixo do capô.&lt;/p&gt;

&lt;p&gt;Bem, o tempo foi passando, e uma década e pouco depois já estava aprendendo a programar. &lt;/p&gt;

&lt;p&gt;Como todo começo, comecei por baixo e um pouco perdido.&lt;/p&gt;

&lt;p&gt;Até que encontrei o canal do Fabio Akita, em especial um vídeo intitulado &lt;a href="https://www.youtube.com/watch?v=hYJ3dvHjeOE&amp;amp;pp=ygUzbyBndWlhIG1haXMgaGFyZGNvcmUgZGUgaW50cm9kdcOnw6NvIGEgY29tcHV0YcOnw6Nv" rel="noopener noreferrer"&gt;Aprendendo sobre Computadores com Super Mario (do jeito Hardcore++)&lt;/a&gt;, um vídeo em que ele ensina a importância da base da computação.&lt;/p&gt;

&lt;p&gt;Eu me apaixonei por tudo isso, percebi que a programação tinha uma verdade profunda, que valia a pena buscar, algo que me dava o prazer de continuar estudando, e fazia tudo aquilo valer a pena.&lt;/p&gt;

&lt;p&gt;Foi meu primeiro contato com esse tipo de conteúdo, eu queria mais, infelizmente, devido a questões monetárias, fui obrigado a deixar isso para um segundo momento.&lt;/p&gt;

&lt;p&gt;Até que, 3 anos depois, tomo conhecimento da &lt;a href="https://github.com/Universidade-Livre/ciencia-da-computacao" rel="noopener noreferrer"&gt;UBL&lt;/a&gt;, era tudo o que eu precisava, foi o pontapé para eu tomar uma atitude e iniciar os meus estudos formais na ciência da computação.&lt;/p&gt;

&lt;p&gt;A primeira matéria do curso é circuitos digitais. &lt;/p&gt;

&lt;p&gt;Enquanto estudava, percebi que poderia unir diversos circuitos simples e construir algo maior e mais robusto.&lt;/p&gt;

&lt;p&gt;Eu estava buscando um projeto para consolidar e validar os meus conhecimentos em circuitos digitais, nesse momento me lembrei da série do &lt;a href="https://www.youtube.com/watch?v=HyznrdDSSGM&amp;amp;list=PLowKtXNTBypGqImE405J2565dvjafglHU" rel="noopener noreferrer"&gt;Bean Eater&lt;/a&gt;, na qual ele constrói um computador do zero usando componentes eletrônicos.&lt;/p&gt;

&lt;p&gt;Era o projeto que eu estava buscando, caía como uma luva, tudo ficou ainda melhor quando, conversando com um grupo de programadores, tomei conhecimento de uma série inspirada nessa, só que em solo nacional.&lt;/p&gt;

&lt;p&gt;A série em questão é a &lt;a href="https://www.youtube.com/watch?v=2llmPWBYvQo&amp;amp;list=PLZ8dBTV2_5HTB43Mhfz-TyIATkECrp8XY" rel="noopener noreferrer"&gt;Construa um Computador de 8 Bits&lt;/a&gt; do Eng. Wagner Rambo, esta maravilhosa série, serviu de base para este projeto, com uma pequena diferença.&lt;/p&gt;

&lt;p&gt;Wagner Rambo é um Engenheiro em Eletrônica, Computadores e Telecomunicações (sim, o cara é brabo demais), ou seja, todo o computador foi montado usando hardware, então tomei a liberdade e "convertemos" todos os componentes para usar apenas portas lógicas e flip flops.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mentalidade
&lt;/h3&gt;

&lt;p&gt;Apesar de ser um projeto mais verboso do que complexo, acho importante compartilhar um pouco da mentalidade que exercitei para executar este projeto.&lt;/p&gt;

&lt;p&gt;Como já descrito acima, eu iniciei este projeto para consolidar e fixar os conhecimentos em circuitos digitais, então ele exige algum nível de conhecimento prévio (mais a respeito nas próximas seções).&lt;/p&gt;

&lt;p&gt;Imagine que está preparando um carrinho de concreto, o que você precisa? Areia, cimento, brita e água, mas apenas isto não é o suficiente, você ainda tem que misturar tudo e esperar secar.&lt;/p&gt;

&lt;p&gt;É com esta mentalidade que abordei esse projeto, e o conforto de saber que com isso estamos um passo mais próximo da excelência.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Como encarar a leitura desse artigo?&lt;/p&gt;

&lt;p&gt;Existem diversas formas de dissecar um assunto complexo, mas acredito que o ideal partirmos do todos para as partes.&lt;/p&gt;

&lt;p&gt;Quero dizer que devemos primeiro tomar conhecimento dos principais conceitos que dão sentido e razão ao nosso projeto.&lt;/p&gt;

&lt;p&gt;Então antes de botar a mão na massa devemos primeiro entender como a massa funciona, qual problema ela resolve, e porque veio existir.&lt;/p&gt;

&lt;p&gt;Assim definiremos como cada pequena parte contribui para o todo. &lt;/p&gt;

&lt;p&gt;Isto é essencial para não caminharmos como folhas ao vento&lt;/p&gt;

&lt;h3&gt;
  
  
  Conhecimentos prévios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;sistema digitais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para aprender sistema digitais eu recomendo fortemente o repositório da ubl: &lt;a href="https://github.com/Universidade-Livre/ciencia-da-computacao?tab=readme-ov-file#1%C2%AA-etapa" rel="noopener noreferrer"&gt;grade&lt;/a&gt;, &lt;a href="https://www.youtube.com/playlist?list=PLXyWBo_coJnMYO9Na3t-oYsc2X4kPJBWf" rel="noopener noreferrer"&gt;vídeo&lt;/a&gt;, &lt;a href="https://github.com/Universidade-Livre/ciencia-da-computacao/blob/main/extras/bibliography/01_digital_circuits.md" rel="noopener noreferrer"&gt;livros (recomendo)&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Logisim Evolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Logisim Evolution é um software educacional para projetar e simular circuitos lógicos digitais, será a ferramenta base para desenvolver e simular o nosso projeto.&lt;/p&gt;

&lt;p&gt;O software é bem intuitivo, mas existem diversos artigos e vídeos que o auxiliarão nesse aprendizado.&lt;/p&gt;

&lt;p&gt;Eu recomendo começar lendo a &lt;a href="https://github.com/logisim-evolution/logisim-evolution/blob/main/docs/docs.md#external-reads" rel="noopener noreferrer"&gt;documentação externa&lt;/a&gt; em seu repositório. &lt;/p&gt;

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

&lt;p&gt;aviso: não se preocupe com o que a caixa faz, mas qual problema ela resolve, primeiro se pergunte, porque? para depois se perguntar, como?&lt;/p&gt;

&lt;h3&gt;
  
  
  Calculadora VS Computador
&lt;/h3&gt;

&lt;p&gt;Muitos acreditam que um computador é uma calculadora turbinada, mas nada poderia estar mais longe da verdade, esse conceito pode não ser trivial à primeira vista, por isso vamos nos debruçar um pouco sobre ele.&lt;/p&gt;

&lt;p&gt;A calculadora e o computador têm propósitos diferentes, isso se deve ao fato de que cada um procura resolver um problema diferente.&lt;/p&gt;

&lt;p&gt;A calculadora tem por objetivos calcular (nossa, quem diria, né), ou seja, você passa uma conta e ela te devolve um resultado, por exemplo, 5+2, ela devolve 7.&lt;/p&gt;

&lt;p&gt;Calculadoras são de uso específico, elas não conseguem executar nenhuma operação que já não esteja implementada em sua arquitetura interna.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é um computador?
&lt;/h3&gt;

&lt;p&gt;Um computador é bem diferente de uma calculadora, um computador serve para computar, ou seja, você consegue inserir um conjunto de instruções (o que chamamos de software) a fim de processar sobre uma entrada de dados e transformar em outra saída de dados.&lt;/p&gt;

&lt;p&gt;Por exemplo, em um computador, é possível inserir um conjunto de instruções que lê uma entrada de dados e converte em sinal de som. &lt;/p&gt;

&lt;p&gt;Todo software de música funciona assim.&lt;/p&gt;

&lt;p&gt;Mas computadores não são capazes apenas de tocar música, o ponto central é que um computador é de uso geral e não específico, como uma calculadora.&lt;/p&gt;

&lt;p&gt;É por isso que um computador consegue emular uma calculadora, mas uma calculadora não consegue emular um computador.&lt;/p&gt;

&lt;h3&gt;
  
  
  Computadores não são inteligentes.
&lt;/h3&gt;

&lt;p&gt;Outro erro comum de pessoas leigas no assunto é achar que computadores são inteligentes. &lt;/p&gt;

&lt;p&gt;À primeira vista, eu entendo a confusão.&lt;/p&gt;

&lt;p&gt;Computadores têm habilidades que podem ser confundidas com inteligência, por exemplo, um computador tem memória superior à de qualquer humano, tanto em tamanho quanto em precisão (ela nunca se altera).&lt;/p&gt;

&lt;p&gt;Computadores também conseguem efetuar cálculos matemáticos muito mais rápido que um ser humano normal, algo que pode ser confundido com inteligência.&lt;/p&gt;

&lt;p&gt;Por mais que essas coisas chamem atenção, e sejam de fato impressionantes, elas por si só não tornam um computador inteligente. &lt;/p&gt;

&lt;p&gt;Para ilustrar melhor, vamos tentar responder à seguinte pergunta: o que é a inteligência? &lt;/p&gt;

&lt;p&gt;Essa pergunta é interessante por diversas razões, sendo essencial para levar esse pequeno debate a algum lugar viável.&lt;/p&gt;

&lt;p&gt;Apesar de milênios de conhecimento e filosofia acumulados, o ser humano ainda não possui uma definição final do que seja inteligência, então todo e qualquer debate que envolva esse conceito será, no melhor dos casos, de ordem condicional.&lt;/p&gt;

&lt;p&gt;Mas para responder à nossa pergunta (se um computador é inteligente ou não), não precisamos ir tão longe, apesar de um computador conter algumas características que parecem inteligência, ele reprova miseravelmente em outras características necessárias à inteligência.&lt;/p&gt;

&lt;p&gt;Aqui podemos listar várias delas: autodeterminação, adaptação, etc...&lt;/p&gt;

&lt;p&gt;Para facilitar, entenda que um computador sequer consegue resolver todos os problemas matemáticos (pesquise sobre o problema da parada), e por sua vez a matemática não consegue resolver todos os problemas humanos (tente usar matemática para calcular o que é a vida, boa sorte tentando).&lt;/p&gt;

&lt;p&gt;A única coisa que realmente me impressiona hoje em dia em um computador é como algo tão efêmero e simples pode ser capaz de feitos impressionantes.&lt;/p&gt;

&lt;p&gt;Resposta: por que nós ensinamos isso a ele.&lt;/p&gt;

&lt;h3&gt;
  
  
  Idiota rápido VS gênio lento
&lt;/h3&gt;

&lt;p&gt;Quero aproveitar esse pequeno debate e fazer uma pequena (mas útil) comparação entre um computador e o cérebro humano.&lt;/p&gt;

&lt;p&gt;Os computadores são essencialmente grandes idiotas, mas eles são muito rápidos e obedientes (um excelente idiota), o que os torna muito úteis para resolver diversos problemas triviais.&lt;/p&gt;

&lt;p&gt;Já o cérebro humano é essencialmente um gênio, ele é capaz de entender conceitos complexos de forma profunda e possui uma capacidade real de criatividade, mas ele é lento.&lt;/p&gt;

&lt;p&gt;Ambos têm o seu valor, portanto é necessário saber quando utilizar o idiota rápido e quando "conversar" com o gênio lento.&lt;/p&gt;

&lt;p&gt;Uma pequena dica, o cérebro de modo geral é lento, isso quer dizer que o aprendizado deve ser feito também de forma lenta, portanto paciência é essencial para o bom aprendizado, não adianta pegar atalhos, "natura non facit saltus" (a natureza não dá saltos).&lt;/p&gt;

&lt;h2&gt;
  
  
  As 5 grandes partes do projeto
&lt;/h2&gt;

&lt;p&gt;Agora estamos prontos para colocar as mãos na massa, mas antes tenho que deixar alguns avisos importantes.&lt;/p&gt;

&lt;p&gt;Esse tutorial praticamente não utiliza abstrações, portanto nada de peças prontas ou outras facilidades, usaremos apenas portas lógicas e Flip Flops.&lt;/p&gt;

&lt;p&gt;Isto diminui um pouco a carga teórica e aumenta a didática, mas de contrapartida acrescenta o trabalho, por isso reafirmo, esse artigo é para quem quer entender e desenvolver profundamente as bases da computação, e não simplesmente montar um computador.&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%2Flu49njtfkb0lrcjjkebp.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%2Flu49njtfkb0lrcjjkebp.png" alt=" " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sistema de input
&lt;/h3&gt;

&lt;p&gt;Este sistema é onde controlamos a entrada de dados do usuário, os seus componentes são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sistema clock&lt;/li&gt;
&lt;li&gt;sistema de reset&lt;/li&gt;
&lt;li&gt;Read Only Memory (ROM)&lt;/li&gt;
&lt;li&gt;Control Input Data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sistema de memória
&lt;/h3&gt;

&lt;p&gt;Aqui é o sistema que gerencia e armazena todos os dados do nosso computador, os seus componentes são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory Address Register (MAR)&lt;/li&gt;
&lt;li&gt;Random Access Memory (RAM)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sistema Lógico e Aritmético
&lt;/h3&gt;

&lt;p&gt;Aqui é onde os dados do sistema são processados, ou seja, é onde eles são transmutados de acordo com a operação escolhida (soma, subtração, etc.), os seus componentes são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arithmetic Logic Unit (ULA)&lt;/li&gt;
&lt;li&gt;Acumulador (ACC)&lt;/li&gt;
&lt;li&gt;Register B&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sistema de saída
&lt;/h3&gt;

&lt;p&gt;Nesta parte do nosso projeto é onde nós convertemos e exibimos os dados que desejamos mostrar ao usuário do nosso computador, os seus componentes são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output Register&lt;/li&gt;
&lt;li&gt;Converter Binary to Decimal&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sistema de controle
&lt;/h3&gt;

&lt;p&gt;Aqui é a central de operações do nosso computador, todos os sinais do nosso computador são gerenciados aqui, estes são os seus componentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Program counter (PC)&lt;/li&gt;
&lt;li&gt;Instruction Register (IR)&lt;/li&gt;
&lt;li&gt;Controller&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Finalização
&lt;/h2&gt;

&lt;p&gt;Se você leu e entendeu até aqui, saiba que você já possui a completa essência deste projeto.&lt;/p&gt;

&lt;p&gt;Agora vamos começar a botar a mão na massa e nos aprofundar um pouco mais em cada parte do projeto.&lt;/p&gt;

&lt;p&gt;"A partir de um bruto diamante se lapida uma bela joia." Renan Marquetti.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/renan_marquetti_9d8acb2b1/como-construir-um-computador-do-zero-sistema-de-inputs-21gb-temp-slug-4952665?preview=530733458c616ad49a894b092384be0571f919b07be075c9621fa7a40c6496596296f928b1b669e5f15da5310b16d173f0645eaa52670b18609076d9"&gt;próximo artigo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agradecimentos
&lt;/h2&gt;

&lt;p&gt;Um agradecimento especial aos meus pais, que me ensinaram a viver, e à minha esposa, que cuida de mim e da nossa família.&lt;/p&gt;

&lt;p&gt;Não posso deixar de me esquecer de agradecer a Felipe Rocha Novaes e Sibelius Seraphini, que foram os primeiros a me encorajar a escrever artigos.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>programming</category>
      <category>logisim</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Como fazer copy paste com nvim em conexão ssh</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Tue, 15 Jul 2025 02:40:38 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-fazer-copy-paste-com-nvim-em-conexao-ssh-2aki</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-fazer-copy-paste-com-nvim-em-conexao-ssh-2aki</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Recentemente comecei a trabalhar em uma empresa que me forneceu uma maquina remota para trabalho, nós usamos conexão ssh acessar estas maquinas.&lt;/p&gt;

&lt;p&gt;Não sou dev raiz, mas gosto de usar nvim (com &lt;a href="https://github.com/nvim-lua/kickstart.nvim" rel="noopener noreferrer"&gt;kickstart&lt;/a&gt;), para mim ele simplesmente funciona e é altamente personalizável e leve.&lt;/p&gt;

&lt;p&gt;Mas logo nos meus primeiros usos me deparei com um problema, o copy e paste não funcionava como o esperado, queria copiar parte do código colar na minha maquina local, mas simplesmente não funcionava.&lt;/p&gt;

&lt;p&gt;Decidi me debruçar sobre o problema, com determinação encontrei uma solução plausível, e aqui busco compartilha-la.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visão geral
&lt;/h2&gt;

&lt;p&gt;O ponto central do problema (logo da solução também), é que o nvim não tem acesso direto a área de transferência do seu sistema operacional (não importa se é maquina remota ou local), logo é necessário um "intermediário" que o nvim chama de provedor.&lt;/p&gt;

&lt;p&gt;Mas nem todo provedor é valido em todos os ambientes, os mais comuns não funcionam em conexões ssh, por sorte um santo escreveu isso na doc do &lt;a href="https://neovim.io/doc/user/provider.html#clipboard-tool" rel="noopener noreferrer"&gt;nvim&lt;/a&gt;:&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%2Fcxaehcue7sannitklnwl.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%2Fcxaehcue7sannitklnwl.png" alt="Doc nvim provider" width="800" height="891"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como pode ver existe alguns provedores de área de transferência específicos para conexão ssh, decidi utilizar o &lt;a href="https://github.com/lemonade-command/lemonade" rel="noopener noreferrer"&gt;lemonade&lt;/a&gt;, no qual obtive bons resultados&lt;/p&gt;

&lt;p&gt;O lemonade utiliza uma conexão tcp para enviar o conteúdo da sua maquina remota para a sua maquina local, então é necessário alguns cuidados e configurações para tudo funcionar bem &lt;/p&gt;

&lt;p&gt;Se tem interesse em utilizar o &lt;a href="https://github.com/lemonade-command/lemonade" rel="noopener noreferrer"&gt;lemonade&lt;/a&gt; basta seguir o guia abaixo&lt;/p&gt;

&lt;h2&gt;
  
  
  Guia
&lt;/h2&gt;

&lt;p&gt;aviso: este guia parte do pressuposto que estais usando linux tanto na maquina remota quanto na maquina local, embora seja perfeitamente possível adaptar esse guia para usuários de outros sistemas operacionais, já que o lemonade é multi plataforma.&lt;/p&gt;

&lt;p&gt;1. Download lemonade &lt;a href="https://github.com/lemonade-command/lemonade/releases" rel="noopener noreferrer"&gt;release&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;escolha a versão desejada (usei 1.1.1)&lt;/li&gt;
&lt;li&gt;baixe o arquivo lemonade_linux_amd64.tar.gz na sua maquina local (no meu caso tanto a minha maquina local quanto a minha maquina remota são linux)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;se preferir basta rodar o seguinte comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; https://github.com/lemonade-command/lemonade/releases/download/v1.1.1/lemonade_linux_amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;2. Instale o lemonade na sua maquina local: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;descompacte o arquivo obtido no passo anterior&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-zxvf&lt;/span&gt; lemonade_linux_amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a descompactação ira gerar um binário (de nome lemonade) no seu diretoria atual, para ser acessado facilmente pelo sistema (e o terminal), devemos mover para o diretório bin do linux, para isso basta executar&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;lemonade /bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(opcional) remova o tar.gz executando o seguinte comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm &lt;/span&gt;lemonade_linux_amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;3. Instale o lemonade na sua maquina remota: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;basta copiar o binário da sua maquina local (apenas se for o mesmo sistema operacional), para isso vamos utilizar o comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp /bin/lemonade usuario@servidor:/bin
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;4. configure o lemonade na sua maquina local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;crie um aquivo no seu .config, chame-o de lemonade.toml, use o seguinte comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvim ~/.config/lemonade.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;insira o seguinte conteudo&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2489&lt;/span&gt;
&lt;span class="py"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'localhost'&lt;/span&gt;
&lt;span class="py"&gt;line-ending&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'crlf'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;5. configure a sua conexão ssh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;abra o seu arquivo de configuração ssh, no meu caso esta em ~/.ssh/config, para isso execute o seguinte comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvim ~/.ssh/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;insira esta linha&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;RemoteForward&lt;/span&gt; &lt;span class="m"&gt;2489&lt;/span&gt; localhost:2489
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;6. configure o lemonade na sua maquina remota:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;acesse a sua maquina remota&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;crie um aquivo no seu .config, chame-o de lemonade.toml, use o seguinte comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvim ~/.config/lemonade.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;insira o seguinte conteúdo&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2489&lt;/span&gt;
&lt;span class="py"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'localhost'&lt;/span&gt;
&lt;span class="py"&gt;trans-loopback&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;trans-localfile&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;line-ending&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'crlf'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;7. configure o nvim na sua maquina remota:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;abra o arquivo init.lua do seu nvim, no meu caso (uso o &lt;a href="https://github.com/nvim-lua/kickstart.nvim" rel="noopener noreferrer"&gt;kickstart&lt;/a&gt;), então usei o comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvim ~/.config/nvim/init.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;verifique se já possue esta configuração, caso não tenha insira&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'unnamed'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;insira esta linha, (cuidado, não pode duplicar essa configuração, insira somente se você não possui esta configuração)&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'lemonade'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;8. executando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;acesse a sua maquina local&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;suba o server limonade com o seguinte comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lemonade server
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;acesse a sua maquina remota&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;abra um arquivo qualquer com o nvim &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;copie uma linha da sua escolha utilizando o comando&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;"+yy
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;na sua maquina local, faça paste a onde desejar&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Alternativa
&lt;/h2&gt;

&lt;p&gt;Considere usar o nvim da sua maquina local conectado a sua maquina remota, para isso basta usar o protocolo scp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  nvim scp:://user@hostname//path/to/file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito obrigado por você que leu até aqui, sabemos o quão árdua é a jornada até a excelência, mas espero ter ajudado em mais um passo, qualquer duvida e sugestão pode entrar em contato comigo direto pelo meu &lt;a href="https://www.linkedin.com/in/renan-marquetti-52b40426b/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como fazer find em arrays no mongoDb</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 28 Jun 2025 20:32:17 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-fazer-find-em-arrays-no-mongodb-2m14</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-fazer-find-em-arrays-no-mongodb-2m14</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Esse artigo tem por objetivo ensinar realizar consultas em campos de arrays para collections MongoDb&lt;/p&gt;

&lt;h2&gt;
  
  
  "Sintaxe JS" vs "Sintaxe mongoDb"
&lt;/h2&gt;

&lt;p&gt;Primeiramente vamos estabelecer a base da nossa didática, para isso vamos supor que você tenha uma array de objetos com a seguinte tipagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Inventory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;qty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;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;como você faria para buscar a lista de objetos com menos de 10 itens em estoque? poderia ser feito um filter no array passando como argumento uma arrow function que atende-se tal critério, ficaria algo, mais ou menos assim:&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;queryLessThanTen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;qty&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&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;myResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myCollectionArray&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="nx"&gt;queryLessThanTen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe a nossa arrow function na primeira linha, nesse contexto ela se comporta como uma "query", sendo essa a "Sintaxe JS" para buscar dados em um array &lt;/p&gt;

&lt;p&gt;o mongo possui a sua própria "sintaxe" de consulta, então se os nossos dados estiverem em uma collection do mongoDb, teriamos que escrever a nossa query da seguinte forma:&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;queryLessThanTen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;qty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$lt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&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;myResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inventory&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;queryLessThanTen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;você consegue perceber a diferença? embora as "sintaxes" sejam diferentes, os objetivos são os mesmos, logo &lt;code&gt;obj =&amp;gt; obj.qty &amp;lt; 10&lt;/code&gt; é equivalente a &lt;code&gt;{qty: {$lt: 10}}&lt;/code&gt;, esta sera a base da nossa didática&lt;/p&gt;

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

&lt;p&gt;Agora vamos começar a colocar a mão na massa, assim vamos expor os principais casos de uso envolvido quando deseja realizar  consultas sobre array em mongoDb, mas cuidado, pode parecer simples a primeira vista, e de fato o é, mas finds sobre arrays esconde uma série de segredos e nuances que vamos começar a expor e trabalhar a partir daqui.&lt;/p&gt;

&lt;h4&gt;
  
  
  Comparação por igualdade/uniformidade
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Caso: contem/inclui valor&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&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;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&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;este é o mais simples deles, deve ser usado para selecionar todos os documentos que contem um determinado valor dentro do array&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: valor index N é igual á&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&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="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongo&lt;/span&gt; &lt;span class="o"&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;tags.1&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="s2"&gt;red&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;caso similar ao anterior, mas com uma diferença importante, ele contem uma especificação de index para a consulta. &lt;/p&gt;

&lt;p&gt;por exemplo nesse exemplo o array &lt;code&gt;["blank", "red", "blue"]&lt;/code&gt; é valido, porque o valor de index 1 é iqual a "red", mas o array &lt;code&gt;["red", "blue"]&lt;/code&gt; não é valido, porque o valor de index 1 ("blue") é diferente de "red".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: idêntico/exato&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&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="s2"&gt;blank&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;toString&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;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&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="s2"&gt;blank&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;este caso é similar ao primeiro caso, mas esconde um segredo, deve ser usado somente quando deseja buscar documentos com correspondência exata de valores, incluindo a ordem estabelecida na consulta.&lt;/p&gt;

&lt;p&gt;por exemplo, quando se utiliza a correspondência exata um documento que contem o array &lt;code&gt;["blank", "red"]&lt;/code&gt; não corresponde exatamente ao array &lt;code&gt;["red", "blank"]&lt;/code&gt;, isso porque contem todos os valores mas a ordem dos não corresponde.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: contem/inclui um conjunto de valores&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blank&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;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$all&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&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="s2"&gt;blank&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;similar o caso acima, mas com uma diferença crucial, aqui usamos o operador &lt;code&gt;$all&lt;/code&gt;, ele faz com que os valores não precisam estar na ordem pré estabelecida, portanto nessa consulta os arrays &lt;code&gt;["blank", "red"]&lt;/code&gt; e &lt;code&gt;["red", "blank"]&lt;/code&gt; são equivalentes.&lt;/p&gt;

&lt;p&gt;outro ponto a ser observado, nesse tipo de consulta não é levado em conta outros valores do array, logo então o array &lt;code&gt;["blank", "blue", "red"]&lt;/code&gt; também corresponde ao array &lt;code&gt;["red", "blank"]&lt;/code&gt;, isso porque os demais valores são irrelevantes para a consulta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: Tamanho Array&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$size&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;este caso é bem simples, usamos o operador &lt;code&gt;$size&lt;/code&gt; para simplesmente compara os tamanhos do array, portanto os arrays: &lt;code&gt;[true, true, false]&lt;/code&gt;, &lt;code&gt;[1, 2, 3]&lt;/code&gt; , &lt;code&gt;["red", "blank", "blue"]&lt;/code&gt; são equivalentes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Comparação por referencia/relativa
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Caso: contem/inclui valor maior que&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;neste caso busca todos os documentos que contem ao menos um valor numérico maior que 25.&lt;/p&gt;

&lt;p&gt;também pode ser utilizado o comparador &lt;code&gt;{$lt: 25}&lt;/code&gt; (less than), para buscar valor menor que 25.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: contem/inclui valor maior que e valor menor que&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;$lt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;está consulta deve ser usada quando busca um array que contem algum valor maior que 15 e algum valor menor do que 15, nesse caso o array contendo os valores &lt;code&gt;[25, 10]&lt;/code&gt; é valido para a consulta.&lt;/p&gt;

&lt;p&gt;este caso contem uma importante nuance, caso o array contenha algum valor que atende ambas as condições, como por exemplo o array &lt;code&gt;[18, 23]&lt;/code&gt; é um array valido, porque o valor 18 atende ambas as condições, sendo assim o valor 23 é irrelevante para a consulta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: contem/inclui valores maior que e menor que&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$elemMatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;$lt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;similar o caso acima, com uma diferença, aqui usamos o operador &lt;code&gt;$elemMatch&lt;/code&gt;, ele faz com que todas as comparações se apliquem em todos os elementos do array.&lt;/p&gt;

&lt;p&gt;por exemplo nessa consulta o array &lt;code&gt;[25, 29]&lt;/code&gt; é valido, porque tanto 25 quanto 29 é maior que 22 e menor que 29.&lt;/p&gt;

&lt;p&gt;já o array &lt;code&gt;[25, 32]&lt;/code&gt; não é valido, porque 25 atende ambas as comparações, mas 32 atende apenas uma delas, sendo assim a comparação é invalida&lt;/p&gt;

&lt;h3&gt;
  
  
  Casos compostos
&lt;/h3&gt;

&lt;p&gt;Também é possível combinar diversos casos e operadores para buscar um resultado mais especifico, seria um trabalho hercúleo expor todas as possibilidades, logo vamos exemplificar apenas alguns deles&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: tamanho de array e inclui conjunto de valores&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;black&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;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$size&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="na"&gt;$all&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&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="s2"&gt;black&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;este exemplo utiliza a junção dos operadores $size e $all, deve ser usado quando deseja buscar documentos cujo array tenha apenas o conjunto de valores passado como paramentos, mas sem se importar com a ordem dos valores.&lt;/p&gt;

&lt;p&gt;por exemplo nesse caso os arrays &lt;code&gt;["red", "black"]&lt;/code&gt; e &lt;code&gt;["blank", "red"]&lt;/code&gt; são equivalentes, mas o array &lt;code&gt;["red", "black", "blue"]&lt;/code&gt; agora não é mais equivalente, isso porque a presença do valor "blue" passa a ser relevante para a comparação.&lt;/p&gt;

&lt;p&gt;em resumo, utilize esse caso quando deseja buscar arrays por uniformidade, sem exatidão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: contem/inclui valores maior que e menor que e algum valor igual á&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;dim_cm&lt;/span&gt;&lt;span class="p"&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;dim_cm.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;$elemMatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;$lt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;unindo o operador $elemMatch e a busca por index, é possível filtrar ainda mais os dados, nesse caso sera retornado os arrays em que todos os valores são maior do que 22 e menor do que 30, mas desde que o primeiro valor seja 26.&lt;/p&gt;

&lt;p&gt;por exemplo os arrays: &lt;code&gt;[26]&lt;/code&gt;, &lt;code&gt;[26, 29]&lt;/code&gt;, &lt;code&gt;[26, 25, 27]&lt;/code&gt; são equivalentes, mas os arrays &lt;code&gt;[23]&lt;/code&gt;, &lt;code&gt;[27, 29]&lt;/code&gt;, &lt;code&gt;[28, 25, 27]&lt;/code&gt; não são equivalentes. &lt;/p&gt;

&lt;p&gt;isso porque todos os valores satisfazem a primeira regra, mas não satisfaz a ultima regra em que exige que o primeiro valor seja igual a 26.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repositorio
&lt;/h3&gt;

&lt;p&gt;caso tenha interesse faça um fork desse &lt;a href="https://github.com/RenanMarquetti/poc-mongodDb/blob/main/src/01_crud/findInArray.test.ts" rel="noopener noreferrer"&gt;repositório&lt;/a&gt;, e execute na sua maquina, ele contem uma série de teste com todos esses exemplos, isto vai agilizar e profundar ainda mais o seu conhecimentos sobre o assunto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agradecimentos
&lt;/h3&gt;

&lt;p&gt;muito obrigado por você que leu até aqui, quero agrade-lo pela sua atenção e dedicação, qualquer duvida ou sugestão ou critica por favor entre em contato comigo através do meu &lt;a href="https://www.linkedin.com/in/renan-marquetti-52b40426b/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>mongodb</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Como mapas de Karnough podem te transformar em um programador melhor.</title>
      <dc:creator>Renan Marquetti</dc:creator>
      <pubDate>Sat, 03 May 2025 15:13:20 +0000</pubDate>
      <link>https://dev.to/renan_marquetti_9d8acb2b1/como-mapas-de-karnough-podem-te-transformar-em-um-programador-melhor-1kfe</link>
      <guid>https://dev.to/renan_marquetti_9d8acb2b1/como-mapas-de-karnough-podem-te-transformar-em-um-programador-melhor-1kfe</guid>
      <description>&lt;p&gt;Este artigo busca demonstrar a importância da base. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sou um desenvolvedor com pouco tempo de jornada (cerca de 1 ano), mas desde o começo dos meus estudos me interessei pelos conceitos base da computação, sempre quis saber como as coisas realmente funcionam por baixo dos panos, sem abstrações.&lt;/p&gt;

&lt;p&gt;Apesar de gostar e me interessar pela base, nunca consegui me debruçar sobre o estudo da mesma, mas isso começou a mudar quando encontrei a &lt;a href="https://github.com/Universidade-Livre/ciencia-da-computacao" rel="noopener noreferrer"&gt;UBL&lt;/a&gt;, uma faculdade inteira sobre ciências da computação e de código aberto, recebi como um grande presente, enviado dos céus.&lt;/p&gt;

&lt;p&gt;Logo no começo (cerca de 2 semanas) tive os meus primeiros espantos, pensei que levaria meses para que aquele estudo começa-se a fazer algum efeito, que fosse capaz de mudar a forma programar.&lt;/p&gt;

&lt;p&gt;Já na matéria de circuitos digitais (primeira matéria), alguns  conceitos me chamaram atenção pela sua simplicidade e genialidade, especialmente mapas de Karnough.&lt;/p&gt;

&lt;p&gt;Então, nada mais natural que buscar uma forma de implementa-lo em um ambiente de desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mapas de Karnough&lt;/strong&gt;&lt;br&gt;
Nesta sessão quero demonstrar uma possível aplicação para mapas de Karnough em um ambiente de desenvolvimento, para um melhor aproveitamento do corrente artigo é necessário que o leitor já tenha algum contado com o conceito, caso queria saber o que é mapas de Karnough recomendo que veja: &lt;a href="https://www.makerhero.com/blog/mapa-de-karnaugh/" rel="noopener noreferrer"&gt;Artigo Mapas de Karnough&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para exemplificar melhor, imagine a seguinte situação, você é um desenvolvedor prestando consultoria para uma montadoras de veiculo que precisa fazer um recall.&lt;/p&gt;

&lt;p&gt;Solicitam que você levante as informações para montar um relatório para saber em quais carros a peça se encontra, você se depara com uma base de dados completamente desorganizada (é raro, mas acontece sempre), sendo necessário uma busca indireta.&lt;/p&gt;

&lt;p&gt;Você solicita ao time de engenheiros que passem os critérios para uso da peça, você recebe a seguinte lista:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;foi usada em carros que são vermelhos e não são do ano atual e o nome não começa com a letra 'V'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;foi usada em carros que são vermelhos e são do ano atual e o nome não começa com a letra 'V'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;foi usada em carros que não são vermelhos nem são do ano atual e podem ou não começar com a letra 'V'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;foi usada em carros que são vermelhos e não são do ano atual e o nome começa com a letra 'V'.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode estar pensando que é simples resolver o problema, basta isolar cada critério dentro de uma expressão booleana e unir tudo no final com o operador "ou", ficando algo mais ou menos assim:&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;cars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;terabytesOfData&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;carsFilter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cars&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="nx"&gt;c&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;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isRed&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;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isCurrentYear&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;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isStartsV&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; 
               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;C&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;Isso funciona, até você ver que o banco tem terabytes de dados para serem analisados e filtrados, logo o otimização aqui é necessário, mas como faze-la de forma confiável, neste momento que entra em cena o mapa de Karnough.&lt;/p&gt;

&lt;p&gt;Existem diversas ferramentas online para isso, aqui vamos usar o site &lt;a href="https://www.makerhero.com/blog/mapa-de-karnaugh/" rel="noopener noreferrer"&gt;Make Hero&lt;/a&gt; (a ferramenta se encontra na metade do artigo)&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%2F5x1x9jwubwh5bmda81lg.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%2F5x1x9jwubwh5bmda81lg.png" alt="mapa de karnough" width="800" height="647"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para usa-la basta seguir os seguintes passos: &lt;/p&gt;

&lt;p&gt;1 - isole as variáveis booleanas dentro de cada critério, neste caso temos 3 variáveis:&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;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;car&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isRed&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;car&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isCurrentYear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;car&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isStartsV&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 - agora preencha a tabela verdade com o resultado de cada critério, (1 para sim e 0 para não), por exemplo, o primeiro critério ficaria A = 1, B = 0, C = 0, agora procure a linha que corresponde a esse critério (linha 5), e maque 1, repita o processo até terminar todos os critérios, ficado assim: &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%2F7duxjmfh0pbp6v6gnd95.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%2F7duxjmfh0pbp6v6gnd95.png" alt="Resultado passo 2" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - pegue e utilize a expressão resultante, no nosso caso é !B || (A &amp;amp;&amp;amp; !C)&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;// before: &lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; 
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// after: &lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 - se preferir converta para uma expressão legível para humanos, no nosso caso ficaria assim: a peça foi usada em carros que não são do ano ou que são vermelhos e não começam com a letra 'V'.&lt;/p&gt;

&lt;p&gt;Pode parecer pouco, mas conseguimos reduzir de 4 critérios para 1, uma economia de 75%, algo decisivo em alguns projetos, e o melhor de tudo, é matematicamente segura.&lt;/p&gt;

&lt;p&gt;se você leu até aqui, você é um herói da resistência, então por favor eu gostaria de ouvir o seu feedback, caso tenha interesse, segue o meu linkedin: &lt;a href="https://www.linkedin.com/in/renan-marquetti-52b40426b" rel="noopener noreferrer"&gt;Renan Marquetti&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
