<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Revelo Community - O melhor conteúdo tech para devs]]></title><description><![CDATA[Aprimore suas habilidades com conteúdo tech por devs para devs. Leia sobre tecnologias, práticas de desenvolvimento e histórias da comunidade no Brasil.]]></description><link>https://community.revelo.com.br/</link><image><url>https://community.revelo.com.br/favicon.png</url><title>Revelo Community - O melhor conteúdo tech para devs</title><link>https://community.revelo.com.br/</link></image><generator>Ghost 4.36</generator><lastBuildDate>Thu, 16 Apr 2026 20:46:13 GMT</lastBuildDate><atom:link href="https://community.revelo.com.br/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplicação React Native]]></title><description><![CDATA[<p></p><p><strong>Lu&#xED;sa Barros.</strong> React Native &#xE9; um framework JavaScript utilizado principalmente na constru&#xE7;&#xE3;o de aplica&#xE7;&#xF5;es cross-platform para dispositivos m&#xF3;veis. O desenvolvimento de interfaces que captam a aten&#xE7;&#xE3;o do usu&#xE1;rio envolve muitas vari&#xE1;veis, e uma</p>]]></description><link>https://community.revelo.com.br/gerenciando-temas-com-custom-hooks-react-context-api-e-typescript-em-uma-aplicacao-react-native/</link><guid isPermaLink="false">6729505e7a5ec80001aa41bc</guid><category><![CDATA[React]]></category><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Community]]></dc:creator><pubDate>Fri, 15 Nov 2024 16:57:53 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----REVELO-BLOG----Gerenciando-temas-com-Custom-Hooks--React-Context-API-e-Typescript-em-uma-aplicac-a-o-React-Native.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----REVELO-BLOG----Gerenciando-temas-com-Custom-Hooks--React-Context-API-e-Typescript-em-uma-aplicac-a-o-React-Native.png" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native"><p></p><p><strong>Lu&#xED;sa Barros.</strong> React Native &#xE9; um framework JavaScript utilizado principalmente na constru&#xE7;&#xE3;o de aplica&#xE7;&#xF5;es cross-platform para dispositivos m&#xF3;veis. O desenvolvimento de interfaces que captam a aten&#xE7;&#xE3;o do usu&#xE1;rio envolve muitas vari&#xE1;veis, e uma delas &#xE9; o conjunto de estilos que ir&#xE1; compor essa interface. </p><p>Nesse artigo, iremos detalhar a import&#xE2;ncia de um bom gerenciamento de estilos por meio de temas, fazendo o melhor uso do TypeScript, da React Hooks e Context &#xA0;API e do Styled Components.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/para-devs"><img src="https://community.revelo.com.br/content/images/2024/11/CTA_Blog_Revelo--4-.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/11/CTA_Blog_Revelo--4-.png 600w, https://community.revelo.com.br/content/images/2024/11/CTA_Blog_Revelo--4-.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Os temas nos permitem padronizar e reutilizar estilos em v&#xE1;rios componentes da aplica&#xE7;&#xE3;o e nada mais s&#xE3;o do que simples objetos onde definimos as cores, tipografia, tamanhos, espa&#xE7;amentos e diversas outras propriedades que constituem a UI do nosso aplicativo. Suas possibilidades de utiliza&#xE7;&#xE3;o visam:</p><ul><li>manter a consist&#xEA;ncia da identidade de marca da aplica&#xE7;&#xE3;o;</li><li>facilitar a implementa&#xE7;&#xE3;o de funcionalidades como modo claro e escuro;</li><li>customizar a aplica&#xE7;&#xE3;o de acordo com as prefer&#xEA;ncias do usu&#xE1;rio;</li><li>auxiliar na acessibilidade (tamanho de fontes, corre&#xE7;&#xE3;o de cores, etc);</li></ul><p>Ent&#xE3;o, ao inv&#xE9;s de, por exemplo, passarmos o c&#xF3;digo hexadecimal de uma cor diretamente ao componente, o passar&#xED;amos atrav&#xE9;s de um tema:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.53.42.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="695" height="216" srcset="https://community.revelo.com.br/content/images/size/w600/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.53.42.png 600w, https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.53.42.png 695w"></figure><p>O exemplo anterior pode n&#xE3;o ter esclarecido completamente a raz&#xE3;o para o uso de temas, uma vez que parece estar gerando c&#xF3;digo adicional para um &#xFA;nico uso. No entanto, imagine uma situa&#xE7;&#xE3;o em que estamos lidando com uma aplica&#xE7;&#xE3;o que possui uma grande quantidade de componentes e a necessidade de alterar a cor de todos os textos no sistema. Nesse cen&#xE1;rio, em vez de modificar cada componente individualmente, podemos simplesmente ajustar o tema.</p><h2 id="criando-os-objetos-de-tema">Criando os objetos de tema</h2><p>Inicialmente, vamos manter toda a l&#xF3;gica em um &#xFA;nico arquivo mas, conforme o projeto escale, pode ser interessante criar uma pasta espec&#xED;fica para definir as propriedades de cada objeto de tema. Antes disso, vamos determinar a tipagem do objeto, para que cada um possua os mesmos atributos e n&#xE3;o haja nenhuma diverg&#xEA;ncia. Aqui a grande estrela entra em jogo: o TypeScript. Criaremos, ent&#xE3;o, um type chamado Theme:</p><p><strong>Nota:</strong> As 3 propriedades abaixo s&#xE3;o apenas um exemplo, voc&#xEA; pode criar as suas pr&#xF3;prias. Caso utilize alguma biblioteca com componentes j&#xE1; pr&#xE9;-definidos como o Native Base, Material UI ou React Native Paper, &#xE9; importante identificar na documenta&#xE7;&#xE3;o a especifica&#xE7;&#xE3;o que eles seguem, e criar o seu objeto de temas no mesmo formato. Assim, voc&#xEA; pode fazer as customiza&#xE7;&#xF5;es necess&#xE1;rias estendendo o Default Theme da pr&#xF3;pria biblioteca ou passar diretamente o objeto com as suas propriedades.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.54.16.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="356" height="120"></figure><p>Para garantir a liberdade de podermos adicionar quantos temas quisermos, vamos criar um &#xFA;nico objeto, que ir&#xE1; conter todos os temas. Ele ser&#xE1; do tipo Record&lt;Theme[&apos;mode&apos;], Theme&gt;, com chaves e valores de um tipo espec&#xED;fico. No exemplo abaixo, a chave ser&#xE1; do tipo &apos;LIGHT&apos; | &apos;DARK&apos; e o valor ser&#xE1; do tipo Theme, que criamos logo acima:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.54.39.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="556" height="251"></figure><p>Com o objeto de tema criado, podemos ir para os pr&#xF3;ximos passos: gerir a funcionalidade de troca de temas e deix&#xE1;-lo dispon&#xED;vel por toda a aplica&#xE7;&#xE3;o!</p><h2 id="criando-um-hook-customizado-%60usetheme%60">Criando um hook customizado: `useTheme`</h2><p>Muitas bibliotecas possuem suporte para temas, o que nos possibilita gerenci&#xE1;-los de forma mais pr&#xE1;tica. Dependendo da complexidade da aplica&#xE7;&#xE3;o e do acoplamento &#xE0; bibliotecas de terceiros, pode ser conveniente utilizar os recursos exportados por elas, visto que requerem m&#xED;nimas configura&#xE7;&#xF5;es para implementar. Por&#xE9;m, iremos criar o nosso pr&#xF3;prio hook customizado! Isso nos garante total controle da estrutura, encapsulando a l&#xF3;gica de gest&#xE3;o dos temas em um &#xFA;nico lugar, al&#xE9;m de n&#xE3;o depender de nenhuma biblioteca externa.</p><p>Um hook customizado nada mais &#xE9; do que uma fun&#xE7;&#xE3;o que utiliza as funcionalidades de estado e ciclo de vida do React, nos permitindo criar snippets de c&#xF3;digo que podem facilmente ser compartilhados entre v&#xE1;rios componentes. Ele precisa ter o prefixo &apos;use&apos; + um nome iniciando com letra mai&#xFA;scula (por exemplo, useTheme). O nosso hook vai retornar uma fun&#xE7;&#xE3;o chamada switchTheme, que ir&#xE1; alterar o tema atual, e o currentTheme - um estado com o objeto do tema que est&#xE1; sendo utilizado no momento.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.55.06.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="592" height="180"></figure><h2 id="disponibilizando-o-%60usetheme%60-com-a-context-api">Disponibilizando o `useTheme` com a Context API</h2><p>Com o hook criado, precisamos deix&#xE1;-lo acess&#xED;vel em qualquer local da aplica&#xE7;&#xE3;o. Para isso, utilizaremos a API de contexto nativa do React, a fim de deixar o objeto de tema e a fun&#xE7;&#xE3;o de altera&#xE7;&#xE3;o, que s&#xE3;o exportados pelo hook, dispon&#xED;veis globalmente. Primeiro, vamos criar o contexto e utilizar o useContext() no nosso hook customizado:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.55.29.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="617" height="432" srcset="https://community.revelo.com.br/content/images/size/w600/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.55.29.png 600w, https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.55.29.png 617w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.55.47.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="585" height="179"></figure><p>Se voc&#xEA; prestou aten&#xE7;&#xE3;o no c&#xF3;digo acima, notou que lan&#xE7;amos um erro caso o contexto n&#xE3;o esteja definido, exigindo que o hook seja usando dentro de um ThemeProvider. &#xC9; dessa forma que o React gerencia o acesso aos contextos, e &#xE9; justamente o Provider que associa um contexto a um determinado escopo. Portanto, agora iremos exportar o nosso Provider:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.56.18.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="654" height="342" srcset="https://community.revelo.com.br/content/images/size/w600/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.56.18.png 600w, https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.56.18.png 654w"></figure><p>Prontinho! Tudo certo para conseguirmos utilizar o nosso tema na aplica&#xE7;&#xE3;o.</p><h2 id="utilizando-o-%60usetheme%60-%F0%9F%8E%89">Utilizando o `useTheme` &#xA0;&#x1F389;</h2><p>Finalmente, podemos acessar as funcionalidades fornecidas pelo nosso hook customizado em qualquer componente funcional do sistema. Para isso, precisamos apenas import&#xE1;-lo e invoc&#xE1;-lo:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.56.54.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="652" height="466" srcset="https://community.revelo.com.br/content/images/size/w600/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.56.54.png 600w, https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.56.54.png 652w"></figure><p>No exemplo acima, utilizamos inline styles, por&#xE9;m o Styled Components nos permite criar componentes customizados usando uma sintaxe muito parecida com o que &#xE9; utilizado na web, o CSS-in-JS. Caso estiv&#xE9;ssemos utilizando o Provider da pr&#xF3;pria biblioteca, poder&#xED;amos apenas estender a interface DefaultTheme dela:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.57.25.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="578" height="169"></figure><p>Por&#xE9;m, uma vez que criamos nosso pr&#xF3;prio hook, precisamos pass&#xE1;-lo via props. Dessa forma, conseguimos acessar o nosso tema nos arquivos de estiliza&#xE7;&#xE3;o e usar o Typescript a nosso favor:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.57.57.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="624" height="219" srcset="https://community.revelo.com.br/content/images/size/w600/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.57.57.png 600w, https://community.revelo.com.br/content/images/2024/11/Captura-de-Pantalla-2024-11-04-a-la-s--16.57.57.png 624w"></figure><h2 id="conclus%C3%A3o">Conclus&#xE3;o</h2><p>Neste artigo, exploramos a import&#xE2;ncia dos temas em aplicativos mobile e como podem melhorar a experi&#xEA;ncia do usu&#xE1;rio. Desenvolvemos um hook customizado que permite um controle centralizado dos estilos, priorizando c&#xF3;digo limpo e reutiliz&#xE1;vel. Disponibilizamos esse hook globalmente pela aplica&#xE7;&#xE3;o com a React Context API, a partir de um Provider, podendo ser consumido tanto pelos componentes funcionais, quanto pelos arquivos de estiliza&#xE7;&#xE3;o. E, por fim, podemos ver como o TypeScript desempenhou um papel fundamental para definir estruturas de dados s&#xF3;lidas, garantindo a coes&#xE3;o dos atributos e propriedades em toda a aplica&#xE7;&#xE3;o. Espero muito que com essas ferramentas, voc&#xEA; esteja mais capaz de criar aplicativos com interfaces visualmente consistentes e altamente personaliz&#xE1;veis.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/para-devs"><img src="https://community.revelo.com.br/content/images/2024/11/CTA_Blog_Revelo--1---1-.png" class="kg-image" alt="Gerenciando temas com Custom Hooks, React Context API e TypeScript em uma aplica&#xE7;&#xE3;o React Native" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/11/CTA_Blog_Revelo--1---1-.png 600w, https://community.revelo.com.br/content/images/2024/11/CTA_Blog_Revelo--1---1-.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><p><a href="https://reactnavigation.org/docs/themes">https://reactnavigation.org/docs/themes</a><br><a href="https://styled-components.com/docs/advanced#theming">https://styled-components.com/docs/advanced#theming</a><br><a href="https://react.dev/learn/passing-data-deeply-with-context">https://react.dev/learn/passing-data-deeply-with-context</a></p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Como aplicar o princípio da infraestrutura imutável em um ambiente DevOps]]></title><description><![CDATA[<p></p><p>A infraestrutura imut&#xE1;vel &#xE9; uma abordagem que visa tornar os componentes de infraestrutura inalter&#xE1;veis, ou seja, que n&#xE3;o podem ser modificados depois de implantados. Isso significa que, em vez de atualizar ou corrigir os servidores, containers ou outros recursos em execu&#xE7;&#xE3;o,</p>]]></description><link>https://community.revelo.com.br/como-aplicar-o-principio-da-infraestrutura-imutavel-em-um-ambiente-devops/</link><guid isPermaLink="false">6722c43b7a5ec80001aa4188</guid><category><![CDATA[DevOps]]></category><category><![CDATA[Dev tech]]></category><dc:creator><![CDATA[Virgílio Borges]]></dc:creator><pubDate>Fri, 15 Nov 2024 16:49:10 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Como-aplicar-o-princi-pio-da-infraestrutura-imuta-vel-em-um-ambiente-DevOps.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Como-aplicar-o-princi-pio-da-infraestrutura-imuta-vel-em-um-ambiente-DevOps.png" alt="Como aplicar o princ&#xED;pio da infraestrutura imut&#xE1;vel em um ambiente DevOps"><p></p><p>A infraestrutura imut&#xE1;vel &#xE9; uma abordagem que visa tornar os componentes de infraestrutura inalter&#xE1;veis, ou seja, que n&#xE3;o podem ser modificados depois de implantados. Isso significa que, em vez de atualizar ou corrigir os servidores, containers ou outros recursos em execu&#xE7;&#xE3;o, eles s&#xE3;o substitu&#xED;dos por novas vers&#xF5;es sempre que houver uma mudan&#xE7;a. Neste artigo, vamos explicar o que &#xE9; infraestrutura imut&#xE1;vel, quais s&#xE3;o os benef&#xED;cios e desafios dessa abordagem e como aplic&#xE1;-la em um ambiente DevOps.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/para-devs"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--14.png" class="kg-image" alt="Como aplicar o princ&#xED;pio da infraestrutura imut&#xE1;vel em um ambiente DevOps" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--14.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--14.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="o-que-%C3%A9-infraestrutura-imut%C3%A1vel">O que &#xE9; infraestrutura imut&#xE1;vel?</h2><p>A infraestrutura imut&#xE1;vel &#xE9; baseada no conceito de imutabilidade, que &#xE9; uma propriedade de algo que n&#xE3;o pode ser alterado ou modificado. Por exemplo, uma string &#xE9; um tipo de dado imut&#xE1;vel, pois uma vez criada, ela n&#xE3;o pode ser modificada. Se quisermos alterar o valor de uma string, temos que criar uma nova string com o novo valor.</p><p>A infraestrutura imut&#xE1;vel aplica esse conceito aos componentes de infraestrutura, como servidores, containers, m&#xE1;quinas virtuais, redes, etc. Em uma infraestrutura imut&#xE1;vel, esses componentes s&#xE3;o criados a partir de imagens pr&#xE9;-configuradas e pr&#xE9;-testadas, que cont&#xEA;m todas as depend&#xEA;ncias e configura&#xE7;&#xF5;es necess&#xE1;rias para executar as aplica&#xE7;&#xF5;es. Essas imagens s&#xE3;o armazenadas em um reposit&#xF3;rio centralizado e versionado, e podem ser facilmente replicadas e distribu&#xED;das.</p><p>Uma vez implantados, esses componentes n&#xE3;o s&#xE3;o mais alterados manualmente ou por meio de ferramentas de gerenciamento de configura&#xE7;&#xE3;o. Eles permanecem no mesmo estado at&#xE9; serem descartados e substitu&#xED;dos por novos componentes criados a partir de novas imagens. Essa substitui&#xE7;&#xE3;o ocorre sempre que h&#xE1; uma mudan&#xE7;a no c&#xF3;digo da aplica&#xE7;&#xE3;o, nas configura&#xE7;&#xF5;es da infraestrutura ou nas pol&#xED;ticas de seguran&#xE7;a.</p><h2 id="quais-s%C3%A3o-os-benef%C3%ADcios-da-infraestrutura-imut%C3%A1vel">Quais s&#xE3;o os benef&#xED;cios da infraestrutura imut&#xE1;vel?</h2><p>A infraestrutura imut&#xE1;vel traz diversos benef&#xED;cios para o ambiente DevOps, tais como:</p><ul><li><strong>Consist&#xEA;ncia</strong>: ao usar imagens pr&#xE9;-configuradas e pr&#xE9;-testadas para criar os componentes de infraestrutura, evita-se o risco de inconsist&#xEA;ncias entre os ambientes de desenvolvimento, teste e produ&#xE7;&#xE3;o. Todos os componentes t&#xEA;m o mesmo estado e comportamento esperado, o que facilita a depura&#xE7;&#xE3;o e a resolu&#xE7;&#xE3;o de problemas.</li><li><strong>Confiabilidade</strong>: ao eliminar as mudan&#xE7;as nos componentes em execu&#xE7;&#xE3;o, reduz-se a possibilidade de erros humanos ou falhas nas ferramentas de gerenciamento de configura&#xE7;&#xE3;o. Al&#xE9;m disso, ao descartar os componentes antigos e substitu&#xED;-los por novos, evita-se o ac&#xFA;mulo de lixo ou vulnerabilidades nos sistemas operacionais ou nas aplica&#xE7;&#xF5;es.</li><li><strong>Seguran&#xE7;a</strong>: ao usar imagens atualizadas e seguras para criar os componentes de infraestrutura, garante-se que eles estejam em conformidade com as pol&#xED;ticas e normas de seguran&#xE7;a. Al&#xE9;m disso, ao substituir os componentes periodicamente, reduz-se a exposi&#xE7;&#xE3;o a ataques ou invas&#xF5;es.</li><li><strong>Agilidade</strong>: ao automatizar o processo de cria&#xE7;&#xE3;o e substitui&#xE7;&#xE3;o dos componentes de infraestrutura, acelera-se o ciclo de vida das aplica&#xE7;&#xF5;es. Isso permite entregar valor aos clientes com mais rapidez e frequ&#xEA;ncia, al&#xE9;m de facilitar a integra&#xE7;&#xE3;o e a entrega cont&#xED;nuas (CI/CD).</li></ul><h2 id="quais-s%C3%A3o-os-desafios-da-infraestrutura-imut%C3%A1vel">Quais s&#xE3;o os desafios da infraestrutura imut&#xE1;vel?</h2><p>A infraestrutura imut&#xE1;vel tamb&#xE9;m apresenta alguns desafios que devem ser considerados antes de adot&#xE1;-la, tais como:</p><ul><li><strong>Custo</strong>: ao substituir os componentes de infraestrutura com frequ&#xEA;ncia, pode-se aumentar o consumo de recursos computacionais e o armazenamento das imagens. Isso pode gerar um custo maior para a organiza&#xE7;&#xE3;o, especialmente se ela usa servi&#xE7;os em nuvem. Por isso, &#xE9; importante planejar bem a capacidade e a escalabilidade da infraestrutura, al&#xE9;m de monitorar e otimizar o uso dos recursos.</li><li><strong>Complexidade</strong>: ao usar imagens pr&#xE9;-configuradas e pr&#xE9;-testadas para criar os componentes de infraestrutura, &#xE9; preciso garantir que elas estejam sempre atualizadas e compat&#xED;veis com as aplica&#xE7;&#xF5;es. Isso requer um processo rigoroso de controle de vers&#xE3;o, teste e valida&#xE7;&#xE3;o das imagens, al&#xE9;m de uma boa comunica&#xE7;&#xE3;o entre as equipes de desenvolvimento e opera&#xE7;&#xF5;es. Al&#xE9;m disso, &#xE9; preciso definir uma estrat&#xE9;gia de backup e recupera&#xE7;&#xE3;o dos dados, pois os componentes s&#xE3;o descartados com frequ&#xEA;ncia.</li><li><strong>Cultura</strong>: ao adotar a infraestrutura imut&#xE1;vel, &#xE9; preciso mudar a mentalidade e os h&#xE1;bitos das equipes de desenvolvimento e opera&#xE7;&#xF5;es, que est&#xE3;o acostumadas a modificar os componentes em execu&#xE7;&#xE3;o. Isso requer uma cultura de colabora&#xE7;&#xE3;o, automa&#xE7;&#xE3;o e aprendizado cont&#xED;nuo, al&#xE9;m de uma vis&#xE3;o compartilhada dos objetivos e benef&#xED;cios da infraestrutura imut&#xE1;vel.</li></ul><h2 id="como-aplicar-o-princ%C3%ADpio-da-infraestrutura-imut%C3%A1vel-em-um-ambiente-devops">Como aplicar o princ&#xED;pio da infraestrutura imut&#xE1;vel em um ambiente DevOps?</h2><p>Para aplicar o princ&#xED;pio da infraestrutura imut&#xE1;vel em um ambiente DevOps, &#xE9; preciso seguir alguns passos, que podem variar de acordo com as caracter&#xED;sticas e necessidades de cada organiza&#xE7;&#xE3;o. A seguir, apresentamos um exemplo gen&#xE9;rico de como aplicar a infraestrutura imut&#xE1;vel em um ambiente DevOps:</p><ul><li><strong>Definir as imagens</strong>: o primeiro passo &#xE9; definir as imagens que ser&#xE3;o usadas para criar os componentes de infraestrutura. As imagens devem conter todas as depend&#xEA;ncias e configura&#xE7;&#xF5;es necess&#xE1;rias para executar as aplica&#xE7;&#xF5;es, como o sistema operacional, os pacotes, os drivers, os scripts, etc.<a href="https://blog.convisoappsec.com/arquitetura-imutavel-em-appsec/"> As imagens podem ser criadas manualmente ou por meio de ferramentas de automa&#xE7;&#xE3;o, como o Packer1</a>.</li><li><strong>Armazenar as imagens</strong>: o segundo passo &#xE9; armazenar as imagens em um reposit&#xF3;rio centralizado e versionado, que permita o acesso e a distribui&#xE7;&#xE3;o das imagens pelas equipes de desenvolvimento e opera&#xE7;&#xF5;es. O reposit&#xF3;rio deve ter mecanismos de seguran&#xE7;a, como autentica&#xE7;&#xE3;o, criptografia e assinatura digital. O reposit&#xF3;rio pode ser local ou em nuvem, como o Amazon Elastic Container Registry (ECR)<a href="https://aws.amazon.com/pt/blogs/aws-brasil/alavancando-o-aws-cloudformation-para-criar-uma-infraestrutura-imutavel-no-nubank/">2</a><a href="https://azure.microsoft.com/pt-br/products/devops/"> ou o Azure Container Registry (ACR)3</a>.</li><li><strong>Testar as imagens</strong>: o terceiro passo &#xE9; testar as imagens antes de implant&#xE1;-las na infraestrutura. Os testes devem verificar se as imagens est&#xE3;o funcionando corretamente e se est&#xE3;o em conformidade com os requisitos funcionais e n&#xE3;o funcionais das aplica&#xE7;&#xF5;es. Os testes podem ser realizados manualmente ou por meio de ferramentas de automa&#xE7;&#xE3;o, como o Testinfra<a href="https://www.redhat.com/pt-br/topics/devops">4</a><a href="https://www.ibm.com/br-pt/topics/devops"> ou o Serverspec5</a>.</li><li><strong>Implantar as imagens</strong>: o quarto passo &#xE9; implantar as imagens na infraestrutura, criando os componentes correspondentes, como servidores, containers ou m&#xE1;quinas virtuais. A implanta&#xE7;&#xE3;o deve ser feita por meio de ferramentas de automa&#xE7;&#xE3;o, que permitem provisionar, configurar e gerenciar os componentes de forma r&#xE1;pida e consistente. Algumas ferramentas que podem ser usadas s&#xE3;o o Terraform<a href="https://blog.aevo.com.br/diversidade-e-inclusao/">6</a>, o Ansible<a href="https://www.handtalk.me/br/blog/diversidade-e-inclusao/">7</a> ou o Chef<a href="https://www.ethos.org.br/cedoc/inclusao-e-diversidade/">8</a>.</li><li><strong>Substituir os componentes</strong>: o quinto passo &#xE9; substituir os componentes sempre que houver uma mudan&#xE7;a nas aplica&#xE7;&#xF5;es ou nas configura&#xE7;&#xF5;es da infraestrutura. A substitui&#xE7;&#xE3;o deve ser feita por meio de ferramentas de automa&#xE7;&#xE3;o, que permitem criar novos componentes a partir das novas imagens e descartar os componentes antigos sem interromper o servi&#xE7;o. Algumas ferramentas que podem ser usadas s&#xE3;o o Kubernetes, o Docker Swarm ou o Amazon Elastic Container Service (ECS).</li></ul><p>Para aplicar o princ&#xED;pio da infraestrutura imut&#xE1;vel em um ambiente DevOps, voc&#xEA; pode seguir os seguintes passos:</p><ul><li>Criar uma imagem do seu aplicativo que contenha todas as depend&#xEA;ncias e configura&#xE7;&#xF5;es necess&#xE1;rias para execut&#xE1;-lo. Voc&#xEA; pode usar ferramentas como o Docker<a href="https://aws.amazon.com/pt/blogs/aws-brasil/alavancando-o-aws-cloudformation-para-criar-uma-infraestrutura-imutavel-no-nubank/">1</a> ou o Packer<a href="https://blog.convisoappsec.com/arquitetura-imutavel-em-appsec/">2</a> para criar imagens de containers ou de m&#xE1;quinas virtuais, respectivamente.</li><li>Armazenar a imagem do seu aplicativo em um reposit&#xF3;rio centralizado e versionado, que permita o acesso e a distribui&#xE7;&#xE3;o das imagens pelas equipes de desenvolvimento e opera&#xE7;&#xF5;es.<a href="https://qastack.com.br/devops/412/what-are-immutable-servers"> Voc&#xEA; pode usar servi&#xE7;os em nuvem como o Amazon Elastic Container Registry (ECR)3</a><a href="https://www.infoq.com/br/presentations/infraestrutura-imutavel-e-em-nuvem-no-nubank/"> ou o Azure Container Registry (ACR)4</a> para armazenar imagens de containers, por exemplo.</li><li>Testar a imagem do seu aplicativo antes de implant&#xE1;-la na infraestrutura. Voc&#xEA; pode usar ferramentas como o Testinfra ou o Serverspec para escrever e executar testes de infraestrutura usando Python ou Ruby, respectivamente.</li><li>Implantar a imagem do seu aplicativo na infraestrutura, criando os componentes correspondentes, como servidores, containers ou m&#xE1;quinas virtuais. Voc&#xEA; pode usar ferramentas como o Terraform, o Ansible ou o Chef para provisionar, configurar e gerenciar a infraestrutura como c&#xF3;digo.</li><li>Substituir os componentes da infraestrutura sempre que houver uma mudan&#xE7;a no seu aplicativo ou nas configura&#xE7;&#xF5;es da infraestrutura. Voc&#xEA; pode usar ferramentas como o Kubernetes, o Docker Swarm ou o Amazon Elastic Container Service (ECS) para criar e gerenciar clusters de containers que podem ser substitu&#xED;dos facilmente.</li></ul><p>Um exemplo simples de infraestrutura imut&#xE1;vel &#xE9; usar uma imagem do Linux que j&#xE1; cont&#xE9;m o Apache instalado e configurado para servir uma p&#xE1;gina web est&#xE1;tica. Neste caso, voc&#xEA; n&#xE3;o precisa modificar o servidor depois de cri&#xE1;-lo, apenas substitu&#xED;-lo por uma nova imagem quando precisar atualizar o Apache ou o Linux. Um exemplo de c&#xF3;digo que usa o Docker e o Terraform para criar e gerenciar essa infraestrutura imut&#xE1;vel &#xE9; o seguinte:</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;"><colgroup></colgroup><tbody><tr style="height:0pt"><td style="vertical-align:top;background-color:#333333;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Definir o provedor de infraestrutura como AWS</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">provider</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;aws&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">region</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;us-east-1&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Definir um recurso do tipo aws_instance, que representa uma inst&#xE2;ncia EC2</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">resource</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;aws_instance&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;web-server&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ami</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;ami-0c2b8ca1dad447f8a&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># AMI do Amazon Linux 2</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">instance_type</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;t2.micro&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Instalar e executar o Docker na inst&#xE2;ncia</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">user_data</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;&lt;EOF</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">#!/bin/bash</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sudo</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">yum</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">update</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-y</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sudo</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">amazon-linux-extras</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">install</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">docker</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-y</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sudo</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">service</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">docker</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">start</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sudo</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">usermod</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-a</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-G</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">docker</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ec2-user</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Criar uma imagem do Docker com o Apache e uma p&#xE1;gina web est&#xE1;tica</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sudo</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">docker</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">build</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-t</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">web-image</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Executar um container com a imagem do Docker e expor a porta 80</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sudo</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">docker</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">run</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-d</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-p</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">80</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">:80</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">web-image</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">EOF</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Permitir o acesso &#xE0; porta 80 da inst&#xE2;ncia</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">security_groups</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">[&quot;${aws_security_group.web-sg.name}&quot;]</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Definir um recurso do tipo aws_security_group, que representa um grupo de seguran&#xE7;a</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">resource</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;aws_security_group&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;web-sg&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">name</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;web-sg&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">description</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;Allow access to port 80&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Permitir o acesso &#xE0; porta 80 da inst&#xE2;ncia de qualquer origem</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ingress</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">from_port</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">80</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">to_port</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">80</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">protocol</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;tcp&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">cidr_blocks</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">[&quot;0.0.0.0/0&quot;]</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Definir um arquivo chamado Dockerfile, que cont&#xE9;m as instru&#xE7;&#xF5;es para construir a imagem do Docker com o Apache e uma p&#xE1;gina web est&#xE1;tica</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">data</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;template_file&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;Dockerfile&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">template</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;&lt;DOCKERFILE</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Use a imagem oficial do CentOS 7 como base</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">FROM</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> centos:7</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Instale o Apache usando o yum</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">RUN</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">yum</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-y</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">update</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&amp;&amp;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">yum</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">-y</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">install</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">httpd</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Copie a p&#xE1;gina web est&#xE1;tica para o diret&#xF3;rio /var/www/html</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">COPY</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">index.html</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">/var/www/html/</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Exponha a porta 80 do container</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">EXPOSE</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#d36363;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">80</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Inicie o Apache quando o container iniciar</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">CMD</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">[&quot;/usr/sbin/httpd&quot;,</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;-D&quot;,</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;FOREGROUND&quot;]</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">DOCKERFILE</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#888888;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Definir um arquivo chamado index.html, que cont&#xE9;m o c&#xF3;digo HTML da p&#xE1;gina web est&#xE1;tica</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">data</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;template_file&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;index&quot;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">template</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;&lt;HTML</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;html&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;head&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;title&gt;Web</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Server&lt;/title&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;/head&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;body&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;h1&gt;Hello,</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">world!&lt;/h1&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;p&gt;This</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">is</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">a</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">web</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">server</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">running</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">on</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">an</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">immutable</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">infrastructure.&lt;/p&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;/body&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; &#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&lt;/html&gt;</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; </span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">HTML</span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#ffffff;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br></span><span style="font-size:11pt;font-family:Consolas,sans-serif;color:#a2fca2;background-color:#333333;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span></p></td></tr></tbody></table><!--kg-card-end: html--><p>O c&#xF3;digo usa o Docker para criar uma imagem com o Apache e uma p&#xE1;gina web est&#xE1;tica, e o Terraform para criar uma inst&#xE2;ncia EC2 que executa um container com essa imagem e exp&#xF5;e a porta 80. Para acessar a p&#xE1;gina web, basta usar o endere&#xE7;o IP da inst&#xE2;ncia.</p><h2 id="conclus%C3%A3o">Conclus&#xE3;o</h2><p>Neste artigo, vimos como aplicar o princ&#xED;pio da infraestrutura imut&#xE1;vel em um ambiente DevOps. Aprendemos o que &#xE9; infraestrutura imut&#xE1;vel, quais s&#xE3;o os benef&#xED;cios e desafios dessa abordagem e como aplic&#xE1;-la em um ambiente DevOps. Vimos tamb&#xE9;m alguns exemplos de ferramentas que podem nos auxiliar nesse processo.</p><p>A infraestrutura imut&#xE1;vel &#xE9; uma abordagem que visa aumentar a consist&#xEA;ncia, a confiabilidade, a seguran&#xE7;a e a agilidade da infraestrutura, evitando as mudan&#xE7;as nos componentes em execu&#xE7;&#xE3;o e substituindo-os por novas vers&#xF5;es sempre que houver uma altera&#xE7;&#xE3;o. Para aplicar essa abordagem em um ambiente DevOps, &#xE9; preciso usar ferramentas de automa&#xE7;&#xE3;o que permitam criar, armazenar, testar e implantar imagens pr&#xE9;-configuradas e pr&#xE9;-testadas dos componentes de infraestrutura. Assim, &#xE9; poss&#xED;vel entregar valor aos clientes com mais rapidez e qualidade, al&#xE9;m de facilitar a integra&#xE7;&#xE3;o e a entrega cont&#xED;nuas (CI/CD).</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/para-devs"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--15.png" class="kg-image" alt="Como aplicar o princ&#xED;pio da infraestrutura imut&#xE1;vel em um ambiente DevOps" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--15.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--15.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="refer%C3%AAncias-bibliogr%C3%A1ficas">Refer&#xEA;ncias Bibliogr&#xE1;ficas</h2><ul><li>Docker Documentation - https://docs.docker.com/</li><li>Packer Documentation - https://www.packer.io/docs</li><li>Amazon Elastic Container Registry (ECR) - https://aws.amazon.com/ecr/</li><li>Azure Container Registry (ACR) - https://azure.microsoft.com/en-us/services/container-registry/</li><li>Testinfra Documentation - https://testinfra.readthedocs.io/en/latest/</li><li>Serverspec Documentation - https://serverspec.org/</li><li>Terraform Documentation - https://www.terraform.io/docs/index.html</li><li>Ansible Documentation - https://docs.ansible.com/ansible/latest/index.html</li><li>Chef Documentation - https://docs.chef.io/</li></ul><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Tutorial: Construindo um Modelo de Reconhecimento de Dígitos Manuscritos com TensorFlow]]></title><description><![CDATA[<p></p><p><strong>Raimundo Neto Barros.</strong> Redes Neurais Convolucionais (CNNs), tamb&#xE9;m conhecidas como ConvNets ou Convolutional Neural Networks, s&#xE3;o um tipo de arquitetura de rede neural projetada especialmente para tarefas de processamento de imagens e reconhecimento de padr&#xF5;es. As CNNs t&#xEA;m sido uma parte essencial</p>]]></description><link>https://community.revelo.com.br/tutorial-construindo-um-modelo-de-reconhecimento-de-digitos-manuscritos-com-tensorflow/</link><guid isPermaLink="false">6722baaa7a5ec80001aa4120</guid><category><![CDATA[IA]]></category><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Community]]></dc:creator><pubDate>Fri, 15 Nov 2024 16:43:40 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Tutorial_-Construindo-um-Modelo-de-Reconhecimento-de-Di-gitos-Manuscritos-com-TensorFlow.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Tutorial_-Construindo-um-Modelo-de-Reconhecimento-de-Di-gitos-Manuscritos-com-TensorFlow.png" alt="Tutorial: Construindo um Modelo de Reconhecimento de D&#xED;gitos Manuscritos com TensorFlow"><p></p><p><strong>Raimundo Neto Barros.</strong> Redes Neurais Convolucionais (CNNs), tamb&#xE9;m conhecidas como ConvNets ou Convolutional Neural Networks, s&#xE3;o um tipo de arquitetura de rede neural projetada especialmente para tarefas de processamento de imagens e reconhecimento de padr&#xF5;es. As CNNs t&#xEA;m sido uma parte essencial do avan&#xE7;o da intelig&#xEA;ncia artificial em campos como vis&#xE3;o computacional, reconhecimento de imagem e processamento de v&#xED;deo. </p><p>Este resumo detalhado ir&#xE1; explorar os principais aspectos das CNNs.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/para-devs"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--13.png" class="kg-image" alt="Tutorial: Construindo um Modelo de Reconhecimento de D&#xED;gitos Manuscritos com TensorFlow" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--13.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--13.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="arquitetura-de-camadas">Arquitetura de Camadas</h2><p>As CNNs s&#xE3;o compostas por camadas interconectadas, com tr&#xEA;s tipos principais de camadas: Camadas de Convolu&#xE7;&#xE3;o, Camadas de Pooling (Agrupamento) e Camadas Fully Connected (Totalmente Conectadas).</p><h3 id="camadas-de-convolu%C3%A7%C3%A3o">Camadas de Convolu&#xE7;&#xE3;o</h3><ul><li>As camadas de convolu&#xE7;&#xE3;o s&#xE3;o o componente fundamental das CNNs. Eles consistem em filtros ou gr&#xE3;os, que s&#xE3;o matrizes de pesos pequenos que percorrem a imagem de entrada em pequenos passos, realizando opera&#xE7;&#xF5;es de convolu&#xE7;&#xE3;o para detectar caracter&#xED;sticas relevantes. Essas caracter&#xED;sticas incluem bordas, texturas, padr&#xF5;es e outras informa&#xE7;&#xF5;es importantes.</li></ul><h3 id="camadas-de-pooling"> Camadas de Pooling</h3><ul><li>As camadas de pooling (ou agrupamento) s&#xE3;o utilizadas para reduzir a dimensionalidade dos dados, mantendo as caracter&#xED;sticas mais importantes. O pooling geralmente envolve uma sele&#xE7;&#xE3;o do valor m&#xE1;ximo (Max Pooling) ou m&#xE9;dio (Average Pooling) em uma regi&#xE3;o local da imagem convolucional.</li></ul><h3 id="camadas-totalmente-conectadas">Camadas Totalmente Conectadas</h3><ul><li>As camadas totalmente conectadas s&#xE3;o semelhantes &#xE0;s camadas tradicionais de redes neurais artificiais. Eles s&#xE3;o respons&#xE1;veis &#x200B;&#x200B;por tomar as caracter&#xED;sticas extra&#xED;das pelas camadas anteriores e utiliz&#xE1;-las para realizar a classifica&#xE7;&#xE3;o ou a regress&#xE3;o de sa&#xED;da.</li></ul><h3 id="fun%C3%A7%C3%B5es-de-ativa%C3%A7%C3%A3o">Fun&#xE7;&#xF5;es de Ativa&#xE7;&#xE3;o</h3><ul><li>As CNNs utilizam fun&#xE7;&#xF5;es de ativa&#xE7;&#xE3;o, como a fun&#xE7;&#xE3;o ReLU (Rectified Linear Unit), para introduzir n&#xE3;o-linearidade nas camadas convolucionais e melhorar a capacidade de aprendizado da rede.</li></ul><h3 id="camadas-de-normaliza%C3%A7%C3%A3o">Camadas de Normaliza&#xE7;&#xE3;o</h3><ul><li>Camadas de normaliza&#xE7;&#xE3;o, como a Normaliza&#xE7;&#xE3;o em lote, s&#xE3;o usadas para acelerar o treinamento e melhorar a estabilidade da rede.</li></ul><h2 id="aprendizado-de-caracter%C3%ADsticas-hier%C3%A1rquicas">Aprendizado de Caracter&#xED;sticas Hier&#xE1;rquicas</h2><p>Uma das principais vantagens das CNNs &#xE9; sua capacidade de aprender caracter&#xED;sticas hierarquicamente complexas. Camadas iniciais detectam caracter&#xED;sticas simples, como bordas, enquanto camadas mais profundas identificam caracter&#xED;sticas cada vez mais abstratas, como objetos inteiros.</p><h3 id="treinamento-com-backpropagation">Treinamento com Backpropagation</h3><ul><li>As CNNs s&#xE3;o treinadas usando o algoritmo de retropropaga&#xE7;&#xE3;o (backpropagation), ajustando os pesos das redes para minimizar uma fun&#xE7;&#xE3;o de perda. O aprendizado geralmente envolve grandes conjuntos de dados rotulados.</li></ul><h3 id="transfer%C3%AAncia-de-aprendizagem">Transfer&#xEA;ncia de aprendizagem</h3><ul><li>As CNNs pr&#xE9;-treinadas em grandes conjuntos de dados, como o ImageNet, podem ser adaptadas para tarefas espec&#xED;ficas com menores conjuntos de dados atrav&#xE9;s da t&#xE9;cnica de transfer&#xEA;ncia de aprendizagem. Isso permite a reutiliza&#xE7;&#xE3;o de recursos aprendidos anteriormente.</li></ul><h3 id="aplica%C3%A7%C3%B5es">Aplica&#xE7;&#xF5;es</h3><ul><li>As CNNs t&#xEA;m uma ampla gama de aplica&#xE7;&#xF5;es, incluindo reconhecimento de imagem, classifica&#xE7;&#xE3;o de objetos, segmenta&#xE7;&#xE3;o de imagens, reconhecimento de texto em imagens, detec&#xE7;&#xE3;o de rostos, diagn&#xF3;stico m&#xE9;dico baseado em imagens, entre outros.</li></ul><p>As Redes Neurais Convolucionais t&#xEA;m revolucionado a vis&#xE3;o computacional e s&#xE3;o essenciais para uma s&#xE9;rie de aplica&#xE7;&#xF5;es pr&#xE1;ticas, tornando poss&#xED;vel a automa&#xE7;&#xE3;o de tarefas anteriormente complexas em dom&#xED;nios que envolvem imagens e vis&#xE3;o por computador. Elas continuam sendo uma &#xE1;rea de pesquisa ativa, com avan&#xE7;os constantes e adapta&#xE7;&#xF5;es para diversos campos.</p><p>O reconhecimento de d&#xED;gitos escritos &#xE0; m&#xE3;o &#xE9; uma tarefa fundamental em aprendizado de m&#xE1;quina e vis&#xE3;o computacional. Neste tutorial, voc&#xEA; aprender&#xE1; a criar um modelo de reconhecimento de d&#xED;gitos manuscritos usando TensorFlow, uma das bibliotecas mais populares para aprendizado profundo e redes neurais. Este tutorial &#xE9; direcionado a desenvolvedores e entusiastas que desejam explorar o mundo do reconhecimento de padr&#xF5;es por meio de redes neurais.</p><h2 id="tensorflow">TensorFlow</h2><p>TensorFlow &#xE9; uma biblioteca de c&#xF3;digo aberto poderosa e popular para aprendizado de m&#xE1;quina e intelig&#xEA;ncia artificial. Desenvolvida pelo Google Brain, &#xE9; uma ferramenta extremamente flex&#xED;vel que oferece uma ampla gama de funcionalidades para desenvolver e treinar modelos complexos de aprendizado profundo.</p><p>Vamos explorar detalhadamente as principais caracter&#xED;sticas e conceitos do TensorFlow: </p><p><strong>Modelagem com Grafos Computacionais: </strong>TensorFlow representa as opera&#xE7;&#xF5;es matem&#xE1;ticas em forma de grafos direcionados, onde n&#xF3;s representamos opera&#xE7;&#xF5;es e as arestas representam os dados (tensores) que fluem entre essas opera&#xE7;&#xF5;es. Isso permite uma otimiza&#xE7;&#xE3;o eficiente e paraleliza&#xE7;&#xE3;o das opera&#xE7;&#xF5;es.</p><p>O TensorFlow &#xE9; centrado no conceito de tensores, que s&#xE3;o estruturas de dados multidimensionais. Os tensores s&#xE3;o de v&#xE1;rias dimens&#xF5;es (0D a ND) e podem ser a unidade b&#xE1;sica para representar os dados de entrada, sa&#xED;da e as configura&#xE7;&#xF5;es dos modelos.</p><p><strong>Flexibilidade de Constru&#xE7;&#xE3;o de Modelos:</strong> O TensorFlow oferece dois estilos principais para constru&#xE7;&#xE3;o de modelos: o modo imperativo (usando APIs como Keras) e o modo declarativo (usando uma API do TensorFlow). Isso permite a constru&#xE7;&#xE3;o de modelos de forma intuitiva e flex&#xED;vel. Keras API: Integrada ao TensorFlow, a API Keras &#xE9; uma interface de alto n&#xED;vel que facilita a cria&#xE7;&#xE3;o, treinamento e avalia&#xE7;&#xE3;o de modelos. Keras &#xE9; conhecida por sua simplicidade e efici&#xEA;ncia.</p><p><strong>Treinamento Distribu&#xED;do: </strong>O TensorFlow suporta treinamento distribu&#xED;do, permitindo que modelos sejam treinados simultaneamente em v&#xE1;rios dispositivos, como GPUs e TPUs, melhorar a escalabilidade e a efici&#xEA;ncia do treinamento.</p><h2 id="finalidades-e-aplica%C3%A7%C3%B5es-pr%C3%A1ticas">Finalidades e aplica&#xE7;&#xF5;es pr&#xE1;ticas</h2><p>Um Modelo de Reconhecimento de D&#xED;gitos Manuscritos com TensorFlow tem a finalidade de confidencialidade e classifica&#xE7;&#xE3;o de d&#xED;gitos escritos &#xE0; m&#xE3;o em imagens ou documentos. Esse tipo de modelo tem v&#xE1;rias aplica&#xE7;&#xF5;es pr&#xE1;ticas, incluindo:</p><p><strong>Reconhecimento de D&#xED;gitos em Cheques e Documentos Financeiros</strong>: as institui&#xE7;&#xF5;es financeiras utilizam modelos de reconhecimento de d&#xED;gitos para processar cheques e documentos que cont&#xEA;m n&#xFA;meros escritos &#xE0; m&#xE3;o, agilizando o processo de verifica&#xE7;&#xE3;o e elimina&#xE7;&#xE3;o de erros.</p><p><strong>Automatiza&#xE7;&#xE3;o de Processos Empresariais</strong>: as empresas podem utilizar modelos de reconhecimento de d&#xED;gitos para automatizar a leitura de formul&#xE1;rios, faturas, cheques e outros documentos, economizando tempo e reduzindo erros de interpreta&#xE7;&#xE3;o humana.</p><p><strong>Sistemas de Pagamento Autom&#xE1;tico</strong>: em sistemas financeiros, o reconhecimento de d&#xED;gitos &#xE9; usado para automatizar a leitura de cheques, c&#xF3;digos de barras em boletos e outras formas de pagamento, agilizando o processamento.</p><p><strong>Sistemas de Reconhecimento de Escrita Manua</strong>l: pode ser usado como componente em sistemas de reconhecimento de escrita manual mais complexos, onde o reconhecimento de d&#xED;gitos &#xE9; a primeira etapa para a identifica&#xE7;&#xE3;o de palavras ou frases escritas &#xE0; m&#xE3;o.</p><p><strong>Aplicativos M&#xF3;veis</strong>: aplicativos m&#xF3;veis podem integrar modelos de reconhecimento de d&#xED;gitos para facilitar a entrada de dados, como reconhecimento de n&#xFA;meros de telefone ou c&#xF3;digos de autentica&#xE7;&#xE3;o.</p><p><strong>O desenvolvimento de aplica&#xE7;&#xF5;es educacionais</strong>: utilizando um Modelo de Reconhecimento de D&#xED;gitos Manuscritos com TensorFlow pode ser uma maneira eficaz de ajudar os alunos a aprenderem a escrever e considerar n&#xFA;meros de forma interativa e envolvente.</p><h2 id="pr%C3%A9-requisitos">Pr&#xE9;-requisitos</h2><p>Antes de come&#xE7;armos, voc&#xEA; precisar&#xE1; atender aos seguintes requisitos para execu&#xE7;&#xE3;o dos c&#xF3;digos:</p><p><strong>Conhecimento em Python:</strong> Este tutorial pressup&#xF5;e que voc&#xEA; tenha conhecimento b&#xE1;sico na linguagem Python, incluindo manipula&#xE7;&#xE3;o de arrays da biblioteca NumPy.</p><p><strong>Instala&#xE7;&#xE3;o do TensorFlow:</strong> Certifique-se de que o TensorFlow esteja instalado no seu ambiente Python. Voc&#xEA; pode instal&#xE1;-lo usando o comando pip:</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ffffff;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">pip install tensorflow</span></p></td></tr></tbody></table><!--kg-card-end: html--><p>Agora, vamos criar um modelo de reconhecimento de d&#xED;gitos com o passo a passo a seguir.</p><h3 id="passo-1-conjunto-de-dados-mnist">Passo 1: Conjunto de Dados MNIST</h3><p>O conjunto de dados MNIST &#xE9; um conjunto cl&#xE1;ssico para tarefas de reconhecimento de d&#xED;gitos manuscritos. Ele consiste em 60.000 imagens de treinamento e 10.000 imagens de teste, cada uma representando um &#xFA;nico d&#xED;gito de 0 a 9. Come&#xE7;aremos carregando esse conjunto de dados utilizando o seguinte c&#xF3;digo.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">import tensorflow </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#569cd6;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">as</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> tf</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#569cd6;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">from</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> tensorflow.keras.datasets import mnist</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Carregando o conjunto de dados MNIST</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(x_train, y_train), (x_test, y_test) </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> mnist.load_data()</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-2-pr%C3%A9-processamento-dos-dados">Passo 2: Pr&#xE9;-processamento dos Dados</h3><p>O pr&#xE9;-processamento dos dados &#xE9; uma etapa extremamente importante no treinamento de redes neurais, pois essa etapa interfere diretamente nos resultados dos algoritmos. Primeiro, normalizamos as imagens para que os valores dos pixels estejam no intervalo de 0 a 1.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Normaliza&#xE7;&#xE3;o dos valores dos pixels para o intervalo [0, 1]</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ffffff;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> x_train, x_test = x_train / </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#df3079;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">255.0</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ffffff;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, x_test / </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#df3079;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">255.0</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-3-construindo-o-modelo">Passo 3: Construindo o Modelo</h3><p>Agora, construiremos o modelo de rede neural. Neste exemplo, usaremos uma rede neural convolucional (CNN) simples, conhecida por seu desempenho em tarefas de vis&#xE3;o computacional.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">model </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> tf.keras.models.Sequential([</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;tf.keras.layers.Conv2D(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">32</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, (</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">), </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#569cd6;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">activation</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;relu&apos;</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, input_shape</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">28</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">28</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)),</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;tf.keras.layers.MaxPooling2D((</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)),</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;tf.keras.layers.Flatten(),</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;tf.keras.layers.Dense(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">128</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#569cd6;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">activation</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;relu&apos;</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">),</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;tf.keras.layers.Dropout(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">),</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;tf.keras.layers.Dense(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">])</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-4-compilando-o-modelo">Passo 4: Compilando o Modelo</h3><p>Ap&#xF3;s construir o modelo, &#xE9; hora de compila-lo. Definiremos a fun&#xE7;&#xE3;o de perda, o otimizador e as m&#xE9;tricas para monitorar durante o treinamento do algoritmo.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Compilando o modelo</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">model.compile(optimizer</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;adam&apos;</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">,</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;loss</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">tf.keras.losses.SparseCategoricalCrossentropy(from_logits</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">True),</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;metrics</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">[&apos;accuracy&apos;])</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-5-treinamento-do-modelo">Passo 5: Treinamento do Modelo</h3><p>Agora, treinaremos o modelo usando os dados de treinamento da base MNIST.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Treinando o modelo</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-6-avalia%C3%A7%C3%A3o-do-modelo">Passo 6: Avalia&#xE7;&#xE3;o do Modelo</h3><p>Ap&#xF3;s o treinamento, avaliaremos o desempenho do modelo utilizando os dados de teste. Vale ressaltar, que os dados de teste s&#xE3;o diferentes dos dados de treino.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Avaliando o modelo nos dados de teste</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">test_loss, test_accuracy </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> model.evaluate(x_test, y_test, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#569cd6;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">verbose</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#d4d4d4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#b5cea8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#569cd6;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">print</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(f</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;Acur&#xE1;cia nos dados de teste: {test_accuracy*100:.2f}%&apos;</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h2 id="resultados">Resultados</h2><p>Ap&#xF3;s seguir os passos anteriores para rodar sua rede neural, voc&#xEA; deve obter bons resultados se tratando do desempenho do algoritmo na classifica&#xE7;&#xE3;o das imagens. Caso deseje ver melhor a classifica&#xE7;&#xE3;o dos dados voc&#xEA; pode plotar o resultado utilizando a biblioteca do Python chamada Matplotlib. Para plotar os resultados siga os passos a seguir.</p><h3 id="passo-1-importe-a-biblioteca">Passo 1: importe a biblioteca</h3><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:&apos;Courier New&apos;,monospace;color:#7a7e85;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Importando a biblioteca</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:&apos;Courier New&apos;,monospace;color:#cf8e6d;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">import </span><span style="font-size:11pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">matplotlib.pyplot </span><span style="font-size:11pt;font-family:&apos;Courier New&apos;,monospace;color:#cf8e6d;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">as </span><span style="font-size:11pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">plt</span></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-2-escolha-uma-das-imagens-aleatoriamente">Passo 2: Escolha uma das imagens aleatoriamente</h3><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#7a7e85;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Escolhendo um exemplo aleat&#xF3;rio do conjunto de teste</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">index = np.random.randint(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#2aacb8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#8888c6;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">len</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(x_test))</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">imagem_teste = x_test[index]</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">classe_real = y_test[index]</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-3-realize-a-previs%C3%A3o-do-modelo">Passo 3: Realize a previs&#xE3;o do modelo</h3><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#7a7e85;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Fazendo uma previs&#xE3;o usando o modelo</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">previsao = model.predict(np.expand_dims(imagem_teste, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#aa4926;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">axis</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#2aacb8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">))[</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#2aacb8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">]</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-4-obtenha-a-classe-de-previs%C3%A3o">Passo 4: Obtenha a classe de previs&#xE3;o</h3><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#7a7e85;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Obtendo a classe prevista (a classe com maior probabilidade)</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">classe_prevista = np.argmax(previsao)</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-5-plotando-os-resultados">Passo 5: Plotando os resultados</h3><p>Ap&#xF3;s plotado o resultado, ser&#xE1; mostrado uma imagem aleat&#xF3;ria, com uma das imagens da base, com uma legenda na imagem: Classe Real e Classe Prevista, na imagem voc&#xEA; pode verificar o acerto do algoritmo.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#7a7e85;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Plotando a imagem de teste</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">plt.figure(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#aa4926;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">figsize</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#2aacb8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#2aacb8;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">))</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">plt.imshow(imagem_teste, </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#aa4926;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">cmap</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#6aab73;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;gray&apos;</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">plt.title(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#6aab73;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">f&apos;Classe Real: </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cf8e6d;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">classe_real</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cf8e6d;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}\n</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#6aab73;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Classe Prevista: </span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cf8e6d;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">{</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">classe_prevista</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#cf8e6d;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#6aab73;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">plt.axis(</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#6aab73;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;off&apos;</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#bcbec4;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">plt.show()</span></p><p dir="ltr" style="line-height:1.38;background-color:#1e1f22;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h2 id="conclus%C3%A3o">Conclus&#xE3;o</h2><p>Neste tutorial, voc&#xEA; aprendeu como criar um modelo de reconhecimento de d&#xED;gitos escritos &#xE0; m&#xE3;o usando TensorFlow. Come&#xE7;amos carregando o conjunto de dados MNIST, realizamos o pr&#xE9;-processamento das imagens, constru&#xED;mos um modelo de rede neural convolucional (CNN), o compilamos, treinamos e avaliamos seu desempenho e plotamos um resultado aleat&#xF3;rio da classifica&#xE7;&#xE3;o dos dados. O modelo atingiu uma alta precis&#xE3;o na classifica&#xE7;&#xE3;o de d&#xED;gitos manuscritos.</p><p>Agora voc&#xEA; possui as habilidades necess&#xE1;rias para come&#xE7;ar a explorar tarefas mais complexas de aprendizado profundo e vis&#xE3;o computacional. Lembre-se de que o aprendizado de m&#xE1;quina &#xE9; uma disciplina vasta e em constante evolu&#xE7;&#xE3;o, com aplica&#xE7;&#xF5;es emocionantes em diversas &#xE1;reas.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/para-devs"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--14.png" class="kg-image" alt="Tutorial: Construindo um Modelo de Reconhecimento de D&#xED;gitos Manuscritos com TensorFlow" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--14.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--14.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="bibliografia">Bibliografia</h2><p>JURASZEK, Guilherme Defreitas et al. Reconhecimento de produtos por imagem utilizando palavras visuais e redes neurais convolucionais. 2014.</p><p>TensorFlow.<a href="https://www.tensorflow.org/"> https://www.tensorflow.org/</a></p><p>Conjunto de Dados MNIST.<a href="http://yann.lecun.com/exdb/mnist/"> http://yann.lecun.com/exdb/mnist/</a></p><p>TensorFlow Tutorials.<a href="https://www.tensorflow.org/tutorials"> https://www.tensorflow.org/tutorials</a></p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Guia Avançado de Google Cloud Platform]]></title><description><![CDATA[<p></p><blockquote class="kg-blockquote-alt"><em>Caro leitor &#xE1;vido por explorar as profundezas do Google Cloud Platform at&#xE9; agora exploramos apenas os fundamentos dessa plataforma poderosa. No entanto, chegou a hora de subir um degrau e mergulhar no mundo avan&#xE7;ado do GCP. Este &#xE9; o terceiro e &#xFA;ltimo cap&#xED;tulo</em></blockquote>]]></description><link>https://community.revelo.com.br/guia-avancado-de-google-cloud-platform/</link><guid isPermaLink="false">67202ea37a5ec80001aa40ca</guid><category><![CDATA[Web Development]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Gabriel Reis Duarte]]></dc:creator><pubDate>Mon, 11 Nov 2024 18:53:17 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Guia-Avanc-ado-de-Google-Cloud-Platform.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Guia-Avanc-ado-de-Google-Cloud-Platform.png" alt="Guia Avan&#xE7;ado de Google Cloud Platform"><p></p><blockquote class="kg-blockquote-alt"><em>Caro leitor &#xE1;vido por explorar as profundezas do Google Cloud Platform at&#xE9; agora exploramos apenas os fundamentos dessa plataforma poderosa. No entanto, chegou a hora de subir um degrau e mergulhar no mundo avan&#xE7;ado do GCP. Este &#xE9; o terceiro e &#xFA;ltimo cap&#xED;tulo de nossa s&#xE9;rie, onde vamos desvendar as capacidades mais sofisticadas e as funcionalidades avan&#xE7;adas dessa incr&#xED;vel plataforma em nuvem.</em></blockquote><blockquote>Aqui &#xE9; onde come&#xE7;a os poderes da ferramenta Google Cloud Platform?</blockquote><p>Se voc&#xEA; est&#xE1; aqui, &#xE9; porque j&#xE1; dominou as no&#xE7;&#xF5;es b&#xE1;sicas e est&#xE1; pronto para ir al&#xE9;m, explorando recursos que podem impulsionar sua efici&#xEA;ncia, seguran&#xE7;a e escalabilidade. Neste guia avan&#xE7;ado, voc&#xEA; descobrir&#xE1; como aproveitar ao m&#xE1;ximo o Google Cloud Platform, aproveitando suas ferramentas e servi&#xE7;os de alto n&#xED;vel para resolver problemas complexos e alcan&#xE7;ar objetivos ambiciosos.</p><p>Ao longo deste artigo, vamos explorar t&#xF3;picos como Seguran&#xE7;a e Conformidade Avan&#xE7;ada, Alta Disponibilidade e Recupera&#xE7;&#xE3;o de Desastres, Integra&#xE7;&#xE3;o com Firebase com Servi&#xE7;os Avan&#xE7;ados e muito mais. Prepare-se para mergulhar no n&#xED;vel avan&#xE7;ado da nuvem e expandir suas habilidades de computa&#xE7;&#xE3;o em nuvem para um novo patamar.</p><p>Seja bem-vindo &#xE0; &#xFA;ltima parte de nossa s&#xE9;rie sobre o Google Cloud Platform, onde a jornada se torna ainda mais emocionante e desafiadora. Vamos juntos explorar o potencial ilimitado dessa plataforma e dominar suas ferramentas avan&#xE7;adas. Estamos prestes a abrir portas para um mundo de oportunidades, ent&#xE3;o, vamos come&#xE7;ar!</p><blockquote class="kg-blockquote-alt"><em>Dito isso, vamos avan&#xE7;ar para a etapa final deste mundo emocionante de Google Cloud Platform!</em></blockquote><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--11.png" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--11.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--11.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="seguran%C3%A7a-e-conformidade-avan%C3%A7ada-no-google-cloud-platform-gcp">Seguran&#xE7;a e Conformidade Avan&#xE7;ada no Google Cloud Platform (GCP)</h2><p>Em um ambiente de computa&#xE7;&#xE3;o em nuvem, a seguran&#xE7;a &#xE9; fundamental. &#xC0; medida que migramos nossas aplica&#xE7;&#xF5;es e dados cr&#xED;ticos para o Google Cloud Platform (GCP), &#xE9; imperativo fortalecer a seguran&#xE7;a da infraestrutura para proteger contra amea&#xE7;as cada vez mais sofisticadas. Neste guia, exploraremos como voc&#xEA; pode elevar a seguran&#xE7;a da sua infraestrutura no GCP a um n&#xED;vel avan&#xE7;ado, abrangendo pol&#xED;ticas de IAM (<em>Identity and Access Management</em>), auditorias e monitoramento.</p><p><strong>1. Pol&#xED;ticas de IAM Avan&#xE7;adas:</strong></p><p>O IAM &#xE9; a base da seguran&#xE7;a no GCP, permitindo que voc&#xEA; controle o acesso de usu&#xE1;rios e recursos. No n&#xED;vel avan&#xE7;ado, voc&#xEA; pode criar pol&#xED;ticas de IAM detalhadas e personalizadas para garantir que apenas as pessoas certas tenham acesso aos recursos certos. Isso inclui a implementa&#xE7;&#xE3;o de pol&#xED;ticas de <em>least privilege</em>, que concedem o m&#xED;nimo de privil&#xE9;gios necess&#xE1;rios para cada fun&#xE7;&#xE3;o, a seguir um exemplo de c&#xF3;digo, vejamos:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfM5if4XXus4G4G8atRRaGXqt_jnppOQEQEPOjKaxl93SqsFCb1nutk9gNmVlBdgLO8hpvKJGbcJ9lTU9OXBJG9s2egE0dXvHLmtvIL_BR05_lbn86COooPwx6sBF2_9wYhA_cWZU4hHsdF1OYT2xCEK0VioyYHxYZcRTQskw?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><p><strong>2. Regras de Auditoria e Trilha de Auditoria:</strong></p><p>A auditoria desempenha um papel cr&#xED;tico na seguran&#xE7;a. No GCP, voc&#xEA; pode configurar regras de auditoria avan&#xE7;adas para registrar atividades suspeitas ou de alto risco. Isso permite que voc&#xEA; rastreie quem acessou seus recursos, quando o fizeram e quais a&#xE7;&#xF5;es foram executadas. Voc&#xEA; pode definir alertas para atividades incomuns e tomar medidas imediatas, a seguir um exemplo de c&#xF3;digo, vejamos:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfUPO5_YF9rI7UQwWbLTVgnAmDj4fZBFYAxpYURXYGrehBpRVDh5kQmzLObwljebk1oMwK207UZk7NmXdDdATf2q1pR1ayhaL4m_Dahyzym0BYjRsNF3gWhc_w9E25dckmUGLJ6SnmMAQE8oCRjvEKlh-MM9dLt18vPXUya?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><p><strong>3. Monitoramento Avan&#xE7;ado:</strong></p><p>O monitoramento constante &#xE9; essencial para identificar amea&#xE7;as em tempo real. Utilize as ferramentas de monitoramento avan&#xE7;ado do GCP, como o <em>Cloud Monitoring e o Cloud Logging</em>, para coletar e analisar dados de log e m&#xE9;tricas. Configure alertas personalizados para detectar anomalias, ataques ou atividades n&#xE3;o autorizadas, a seguir um exemplo de c&#xF3;digo, vejamos:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc7-T8ndQKJa8EtxLoKiVW24pay-QstjnbtYNn3psBo-EKVPgKUHBtSHD3xurKQm49VJF5MCKkKR2UhzgkF9c_ZqWPSf45MYyF9LK5LviDnYHm0Ib3DrxKXeopMMPc5vraiXPDqo_S1lQKqjeYtHxzmVhibxHszDR9z8hZgjA?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><p><strong>4. Gerenciamento de Chaves Criptogr&#xE1;ficas:</strong></p><p>Para proteger seus dados, &#xE9; crucial gerenciar chaves criptogr&#xE1;ficas de forma eficaz. O GCP oferece servi&#xE7;os avan&#xE7;ados de gerenciamento de chaves, como o Cloud Key Management Service (KMS), que permite criar, gerenciar e girar chaves de criptografia de maneira segura.</p><p><strong>5. Controle de Identidade Federada:</strong></p><p>Em cen&#xE1;rios complexos, onde a autentica&#xE7;&#xE3;o &#xE9; necess&#xE1;ria em v&#xE1;rios sistemas, o GCP suporta controle de identidade federada. Isso permite que voc&#xEA; integre seu sistema de identidade existente com o GCP, simplificando o acesso e melhorando a seguran&#xE7;a.</p><p><strong>6. Conformidade e Certifica&#xE7;&#xF5;es:</strong></p><p>O GCP est&#xE1; em conformidade com v&#xE1;rias normas de seguran&#xE7;a, como SOC 2, ISO 27001 e HIPAA. No n&#xED;vel avan&#xE7;ado, voc&#xEA; pode utilizar essas certifica&#xE7;&#xF5;es para garantir a conformidade regulat&#xF3;ria em sua organiza&#xE7;&#xE3;o e configurar pol&#xED;ticas de conformidade personalizadas.</p><p><strong>7. Prote&#xE7;&#xE3;o de Dados Sens&#xED;veis:</strong></p><p>Identifique e classifique dados sens&#xED;veis em seu ambiente GCP. Implemente pol&#xED;ticas de prote&#xE7;&#xE3;o de dados avan&#xE7;adas, como o uso de criptografia e mascaramento de dados, para garantir que informa&#xE7;&#xF5;es confidenciais permane&#xE7;am seguras.</p><p><strong>8. Testes de Intrus&#xE3;o e Simula&#xE7;&#xF5;es de Ataques:</strong></p><p>Para garantir que sua infraestrutura seja resistente a ataques, realize testes de intrus&#xE3;o e simula&#xE7;&#xF5;es de ataques de penetra&#xE7;&#xE3;o. Isso ajudar&#xE1; a identificar vulnerabilidades e aprimorar as medidas de seguran&#xE7;a.</p><p><strong>9. Autentica&#xE7;&#xE3;o Multifatorial (MFA):</strong></p><p>Implemente a autentica&#xE7;&#xE3;o multifatorial em todas as contas cr&#xED;ticas. Isso adiciona uma camada extra de seguran&#xE7;a, exigindo que os usu&#xE1;rios forne&#xE7;am m&#xFA;ltiplos fatores de autentica&#xE7;&#xE3;o para acessar recursos.</p><p><strong>10. Resposta a Incidentes:</strong></p><p>Desenvolva um plano de resposta a incidentes detalhado. No n&#xED;vel avan&#xE7;ado, voc&#xEA; pode automatizar a detec&#xE7;&#xE3;o de incidentes e a resposta a eles, garantindo uma rea&#xE7;&#xE3;o r&#xE1;pida a amea&#xE7;as.</p><p>Fortalecer a seguran&#xE7;a e garantir a conformidade avan&#xE7;ada no Google Cloud Platform &#xE9; uma jornada cont&#xED;nua. &#xC0; medida que novas amea&#xE7;as surgem e a infraestrutura evolui, &#xE9; essencial estar atualizado e adotar as melhores pr&#xE1;ticas de seguran&#xE7;a. Este guia fornece uma base s&#xF3;lida para come&#xE7;ar a proteger sua infraestrutura no GCP em um n&#xED;vel avan&#xE7;ado.</p><blockquote class="kg-blockquote-alt"><em>Estes s&#xE3;o apenas exemplos simples para ilustrar os conceitos. Na pr&#xE1;tica, a configura&#xE7;&#xE3;o de pol&#xED;ticas de IAM, regras de auditoria, monitoramento e outras pr&#xE1;ticas avan&#xE7;adas de seguran&#xE7;a no GCP pode envolver configura&#xE7;&#xF5;es mais detalhadas e complexas, dependendo das necessidades espec&#xED;ficas do seu projeto.</em></blockquote><h2 id="alta-disponibilidade-e-recupera%C3%A7%C3%A3o-de-desastres-protegendo-suas-aplica%C3%A7%C3%B5es-no-google-cloud-platform">Alta Disponibilidade e Recupera&#xE7;&#xE3;o de Desastres: Protegendo suas Aplica&#xE7;&#xF5;es no Google Cloud Platform</h2><p>A alta disponibilidade (HA) e a recupera&#xE7;&#xE3;o de desastres (DR) s&#xE3;o componentes cr&#xED;ticos da estrat&#xE9;gia de seguran&#xE7;a e continuidade de neg&#xF3;cios em qualquer ambiente de nuvem, incluindo o Google Cloud Platform (GCP). Garantir que suas aplica&#xE7;&#xF5;es e servi&#xE7;os estejam sempre dispon&#xED;veis e prontos para lidar com eventos adversos &#xE9; essencial para atender &#xE0;s expectativas dos clientes e mitigar os riscos associados a interrup&#xE7;&#xF5;es n&#xE3;o planejadas.</p><p><strong>1. Alta Disponibilidade no GCP:</strong></p><p>Alta disponibilidade refere-se &#xE0; capacidade de manter seus sistemas em funcionamento sem interrup&#xE7;&#xF5;es significativas, mesmo quando ocorrem falhas. O GCP oferece v&#xE1;rias ferramentas e recursos para ajudar a alcan&#xE7;ar esse objetivo:</p><ul><li><strong>Balanceamento de Carga</strong>: Utilize o balanceamento de carga do GCP para distribuir o tr&#xE1;fego entre v&#xE1;rias inst&#xE2;ncias, zonas ou regi&#xF5;es, garantindo que a carga seja distribu&#xED;da de maneira uniforme e que os servi&#xE7;os permane&#xE7;am acess&#xED;veis, mesmo em caso de falha em uma inst&#xE2;ncia, vejamos o exemplo de c&#xF3;digo:</li></ul><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcy5FZOh2Sf1kuqVlnQXvKdaApbDAvL9AoWknVNyOV7eoZ-G8koHCqDdEVfViJxUVqBLpeXu4dczLbUUMOIr1ZdNauGIn70NZwdy3VuYaeYewFON7DTeLBovFgv0RQJ3b13G0fM8aUmdZHD7ik4EAmg4qpt_hkPldaiKAmbLw?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><ul><li><strong>Zonas e Regi&#xF5;es M&#xFA;ltiplas</strong>: Distribua seus recursos em diferentes zonas e regi&#xF5;es para evitar que uma &#xFA;nica falha afete todo o seu sistema. O GCP oferece redund&#xE2;ncia geogr&#xE1;fica para melhorar a disponibilidade.<br></li><li><strong>Inst&#xE2;ncias de M&#xE1;quinas Virtuais (VMs) Replicadas</strong>: Implemente inst&#xE2;ncias VM replicadas em v&#xE1;rias zonas ou regi&#xF5;es. Se uma inst&#xE2;ncia falhar, o tr&#xE1;fego &#xE9; automaticamente redirecionado para as inst&#xE2;ncias em funcionamento.<br></li><li><strong>Servi&#xE7;os Gerenciados</strong>: Use servi&#xE7;os gerenciados do GCP, como o Google Kubernetes Engine (GKE) e o App Engine, que lidam automaticamente com tarefas de escalabilidade e recupera&#xE7;&#xE3;o de falhas.</li></ul><p><strong>2. Recupera&#xE7;&#xE3;o de Desastres no GCP:</strong></p><p>Al&#xE9;m de garantir a alta disponibilidade, &#xE9; crucial ter planos de recupera&#xE7;&#xE3;o de desastres eficazes para lidar com eventos graves que possam causar interrup&#xE7;&#xF5;es prolongadas. O GCP oferece recursos e pr&#xE1;ticas recomendadas para implementar uma estrat&#xE9;gia de recupera&#xE7;&#xE3;o de desastres s&#xF3;lida:</p><ul><li><strong>C&#xF3;pias de Seguran&#xE7;a (Backups) e Snapshots</strong>: Fa&#xE7;a c&#xF3;pias de seguran&#xE7;a regulares de seus dados e crie snapshots de suas VMs. Isso permite restaurar rapidamente os sistemas em caso de falha, vejamos o exemplo de c&#xF3;digo:</li></ul><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdTZMM72fL4jTHe6Q936Lkj0W0rLnVVNTynN7AMtgnRQHOm6QcPDDwH5y340iBh2meYpiL-aZHRMvJekS1wuE8Bqw5c8dqKsMTXjuuR0QN-zBaQwO0wYCU1Kk6_H9CvxoSGhqWCyoq05VtxkORqS1EAz1bibqpyTfA8jmZFyA?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><ul><li><strong>Replica&#xE7;&#xE3;o de Dados</strong>: Utilize servi&#xE7;os como o Cloud Storage para replicar seus dados em locais geograficamente dispersos, garantindo a redund&#xE2;ncia de dados.<br></li><li><strong>Planos de Continuidade de Neg&#xF3;cios (BCP) e Recupera&#xE7;&#xE3;o de Desastres (DRP)</strong>: Desenvolva planos abrangentes de BCP e DRP que definam os procedimentos a serem seguidos em caso de desastre. Teste regularmente esses planos para garantir sua efic&#xE1;cia.<br></li><li><strong>Backup e Replica&#xE7;&#xE3;o de Bancos de Dados</strong>: Para bancos de dados cr&#xED;ticos, implemente estrat&#xE9;gias de backup e replica&#xE7;&#xE3;o para garantir a disponibilidade dos dados em caso de falha.<br></li><li><strong>Failover Automatizado</strong>: Configure sistemas de failover automatizado para redirecionar o tr&#xE1;fego para recursos de backup ou de recupera&#xE7;&#xE3;o em caso de falha.<br></li><li><strong>Testes de Recupera&#xE7;&#xE3;o de Desastres</strong>: Realize testes peri&#xF3;dicos de recupera&#xE7;&#xE3;o de desastres para avaliar a prontid&#xE3;o de sua infraestrutura e equipe em situa&#xE7;&#xF5;es de crise.</li></ul><p>Garantir a alta disponibilidade e a recupera&#xE7;&#xE3;o de desastres no GCP &#xE9; um esfor&#xE7;o cont&#xED;nuo que exige planejamento cuidadoso e implementa&#xE7;&#xE3;o diligente. Ao adotar as melhores pr&#xE1;ticas e usar os recursos dispon&#xED;veis no GCP, voc&#xEA; pode proteger suas aplica&#xE7;&#xF5;es e dados contra interrup&#xE7;&#xF5;es indesejadas e manter a continuidade dos neg&#xF3;cios, independentemente dos desafios que possam surgir. A seguran&#xE7;a e a resili&#xEA;ncia devem ser prioridades fundamentais em sua jornada na nuvem.</p><h2 id="integra%C3%A7%C3%A3o-com-firebase-expandindo-o-google-cloud-com-servi%C3%A7os-avan%C3%A7ados">Integra&#xE7;&#xE3;o com Firebase: Expandindo o Google Cloud com Servi&#xE7;os Avan&#xE7;ados</h2><p>O Firebase, uma plataforma de desenvolvimento de aplicativos m&#xF3;veis e web, &#xE9; conhecido por sua simplicidade e efic&#xE1;cia na cria&#xE7;&#xE3;o de aplicativos de alta qualidade. No entanto, quando se trata de estender seu aplicativo para um n&#xED;vel mais avan&#xE7;ado, o Google Cloud Platform (GCP) &#xE9; uma escolha natural. A boa not&#xED;cia &#xE9; que voc&#xEA; pode integrar o Firebase com o GCP para aproveitar os servi&#xE7;os avan&#xE7;ados da nuvem e expandir significativamente a funcionalidade de seus aplicativos. Neste guia, exploraremos como realizar essa integra&#xE7;&#xE3;o de maneira eficaz.</p><blockquote class="kg-blockquote-alt"><em>Antes de mais nada, certifique-se de consultar a documenta&#xE7;&#xE3;o oficial do Firebase e do GCP para obter informa&#xE7;&#xF5;es detalhadas sobre como realizar essas integra&#xE7;&#xF5;es.</em></blockquote><p><strong>1. Configurando a Integra&#xE7;&#xE3;o Inicial:</strong></p><p>A primeira etapa para estender seu aplicativo Firebase com os servi&#xE7;os avan&#xE7;ados do GCP &#xE9; configurar a integra&#xE7;&#xE3;o. Certifique-se de que sua conta Firebase e conta GCP estejam vinculadas e que voc&#xEA; tenha permiss&#xF5;es adequadas em ambas as contas. Isso permitir&#xE1; que voc&#xEA; acesse recursos do GCP, como Cloud Functions e Cloud Storage, diretamente do Firebase, vejamos o exemplo de c&#xF3;digo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc9TxFPsmMimd7GmzUeaafn0kjICLhsUupo-yof8mO8jufn295pU9a_pz2FnHtfhOOE_3nLGIMZxo3JJJRmC-lCkxO88q6Ij_1v0WnVr2uga958UazGRp0_JGcNTPD9-7Huc-q8DsTfatNWGT-U3eiXVyHFSup7VwC4YrmSUQ?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><p><strong>2. Usando o Cloud Functions:</strong></p><p>Uma das maneiras mais poderosas de estender seu aplicativo Firebase &#xE9; por meio das Cloud Functions. Essas fun&#xE7;&#xF5;es permitem que voc&#xEA; execute c&#xF3;digo do lado do servidor em resposta a eventos espec&#xED;ficos, como acionadores de banco de dados ou eventos de autentica&#xE7;&#xE3;o. Voc&#xEA; pode aproveitar isso para processar dados, automatizar tarefas ou executar l&#xF3;gica avan&#xE7;ada no GCP, vejamos o exemplo de c&#xF3;digo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe2edcg6u_FfMNnxpGrr9byjWYGnhtjR0hk0HUXLZRfXTDUdpjxL21ewL0R4Hh_BEWBMRPcNpqjennuirJ26M14lje3AvIfkx3-GmVziHAAaCLYMZtHQnKzL3O1f71-LnTFXvHUkLmcQuZ8IJOePKscXLuHxqKZnuq5NihaYw?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><p><strong>3. Armazenamento Avan&#xE7;ado com o Cloud Storage:</strong></p><p>Enquanto o Firebase oferece armazenamento em nuvem para arquivos, o Cloud Storage do GCP fornece recursos avan&#xE7;ados de armazenamento, incluindo classes de armazenamento, controle de acesso refinado e a capacidade de gerenciar grandes volumes de dados de maneira eficiente, vejamos o exemplo de c&#xF3;digo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdWBG69w8peZ33H37vA5zfY957SHu7zbgUQUf7xVupKGVe8F7UOmVfVknGxNo1JuO_ICEIr455ubuH_mO2sWVkKwF43FItBz5kuUXIo1IuYb0fSTOVbVX3yUFacwUb2Se05srQO95NMN1QlXQlzT5txmCOMr7uVutfWXmTBYA?key=drtpRZ0NQ1NdfK6PtDnQgQ" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy"></figure><p></p><p><strong>4. Bancos de Dados Escal&#xE1;veis:</strong></p><p>O Firebase Realtime Database &#xE9; excelente para aplicativos em tempo real, mas para casos de uso mais avan&#xE7;ados, como an&#xE1;lise de dados em grande escala, o BigQuery do GCP &#xE9; uma escolha ideal. Voc&#xEA; pode integrar o BigQuery ao Firebase para executar consultas complexas em seus dados e obter insights valiosos.</p><p><strong>5. Autentica&#xE7;&#xE3;o e Autoriza&#xE7;&#xE3;o Avan&#xE7;adas:</strong></p><p>O Firebase oferece recursos de autentica&#xE7;&#xE3;o robustos, mas o GCP complementa isso com pol&#xED;ticas de autentica&#xE7;&#xE3;o e autoriza&#xE7;&#xE3;o avan&#xE7;adas usando o Identity and Access Management (IAM). Voc&#xEA; pode controlar o acesso granularmente e definir permiss&#xF5;es espec&#xED;ficas para recursos no GCP.</p><p><strong>6. An&#xE1;lise de Dados e Machine Learning:</strong></p><p>O GCP oferece uma gama de servi&#xE7;os avan&#xE7;ados de an&#xE1;lise de dados e machine learning, como o BigQuery ML e o AI Platform. Integrando esses servi&#xE7;os ao Firebase, voc&#xEA; pode criar modelos de machine learning personalizados e obter insights mais profundos sobre o comportamento dos usu&#xE1;rios.</p><p><strong>7. Escalabilidade e Confiabilidade:</strong></p><p>&#xC0; medida que seus aplicativos crescem, a escalabilidade e confiabilidade se tornam cr&#xED;ticas. O GCP oferece op&#xE7;&#xF5;es de escalabilidade el&#xE1;stica e ferramentas avan&#xE7;adas de monitoramento e diagn&#xF3;stico para garantir que seus aplicativos permane&#xE7;am dispon&#xED;veis e com desempenho otimizado.</p><p><strong>8. Monitoramento e Depura&#xE7;&#xE3;o:</strong></p><p>Utilize as ferramentas de monitoramento e depura&#xE7;&#xE3;o avan&#xE7;adas do GCP para rastrear o desempenho de seus aplicativos Firebase e solucionar problemas de maneira eficaz. O <em>Stackdriver</em> fornece insights valiosos sobre o funcionamento de seus servi&#xE7;os em nuvem.</p><p>Ao dominar essa integra&#xE7;&#xE3;o, voc&#xEA; estar&#xE1; bem posicionado para desenvolver aplicativos de alto desempenho e oferecer experi&#xEA;ncias excepcionais aos usu&#xE1;rios. Portanto, comece a explorar as possibilidades e aproveite ao m&#xE1;ximo essa combina&#xE7;&#xE3;o poderosa.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--13.png" class="kg-image" alt="Guia Avan&#xE7;ado de Google Cloud Platform" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--13.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--13.png 720w" sizes="(min-width: 720px) 720px"></a></figure><blockquote class="kg-blockquote-alt"><em>Integrar o Firebase com o Google Cloud Platform permite que voc&#xEA; aproveite o melhor de ambos os mundos: a simplicidade do Firebase e os recursos avan&#xE7;ados do GCP. Isso possibilita a cria&#xE7;&#xE3;o de aplicativos mais robustos e escal&#xE1;veis, atendendo &#xE0;s demandas de crescimento e complexidade.</em></blockquote><p>Chegamos ao nosso destino final nesta incr&#xED;vel jornada pelo Google Cloud Platform. Este artigo marca o cap&#xED;tulo final de nossa s&#xE9;rie de tr&#xEA;s partes, onde exploramos as complexidades e desafios avan&#xE7;ados dessa plataforma de nuvem poderosa. Ao longo dessa jornada, voc&#xEA; aprendeu a orquestrar cont&#xEA;ineres com precis&#xE3;o, implementar estrat&#xE9;gias avan&#xE7;adas de gerenciamento de dados e at&#xE9; mesmo a integrar o Firebase para expandir seus horizontes de desenvolvimento.</p><p>&#xC9; com grande entusiasmo que encerramos esta s&#xE9;rie, sabendo que voc&#xEA; agora possui um conhecimento s&#xF3;lido e est&#xE1; preparado para se aventurar em territ&#xF3;rio avan&#xE7;ado. No entanto, lembre-se de que a jornada de aprendizado na nuvem &#xE9; cont&#xED;nua. &#xC0; medida que a tecnologia evolui e novos desafios surgem, estar atualizado &#xE9; essencial. Continue explorando, experimentando e expandindo suas habilidades. O GCP oferece um vasto horizonte de oportunidades, e agora voc&#xEA; est&#xE1; preparado para explor&#xE1;-lo plenamente.</p><blockquote class="kg-blockquote-alt"><em>Aqui encerro este &#xFA;ltimo cap&#xED;tulo da s&#xE9;rie sobre o Google Cloud Platform. Agora, gostar&#xED;amos muito de ouvir a sua opini&#xE3;o. Como t&#xEA;m sido suas experi&#xEA;ncias com nossos guias recentes sobre o Google Cloud Platform? Ficar&#xED;amos gratos se compartilhasse seus pensamentos e coment&#xE1;rios conosco na se&#xE7;&#xE3;o de coment&#xE1;rios deste artigo.</em><strong><strong>- Gabriel Reis Duarte.</strong></strong></blockquote><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Disponibilizando um modelo de classificação (Keras + Flask + Heroku)]]></title><description><![CDATA[<p></p><p>Desde que comecei a estudar Machine Learning pensei em como iria disponibilizar o modelo de classifica&#xE7;&#xE3;o que treinei para que seja acessado por usu&#xE1;rios ou aplica&#xE7;&#xF5;es. A principal barreira que me deparei foi o fato de que a aplica&#xE7;&#xE3;o</p>]]></description><link>https://community.revelo.com.br/disponibilizando-um-modelo-de-classificacao-keras-flask-heroku/</link><guid isPermaLink="false">672024127a5ec80001aa4064</guid><category><![CDATA[Machine learning]]></category><category><![CDATA[Tech]]></category><dc:creator><![CDATA[João Felipe Lopes de Sus]]></dc:creator><pubDate>Mon, 11 Nov 2024 18:45:18 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Disponibilizando-um-modelo-de-classificac-a-o--Keras---Flask---Heroku-.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Disponibilizando-um-modelo-de-classificac-a-o--Keras---Flask---Heroku-.png" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)"><p></p><p>Desde que comecei a estudar Machine Learning pensei em como iria disponibilizar o modelo de classifica&#xE7;&#xE3;o que treinei para que seja acessado por usu&#xE1;rios ou aplica&#xE7;&#xF5;es. A principal barreira que me deparei foi o fato de que a aplica&#xE7;&#xE3;o web que faria uso do modelo de classifica&#xE7;&#xE3;o n&#xE3;o era feita em Python, com isso n&#xE3;o foi poss&#xED;vel simplesmente chamar o classificador em uma controller ou service.</p><p>Nesses casos, a solu&#xE7;&#xE3;o foi a cria&#xE7;&#xE3;o de uma API que servisse apenas ao prop&#xF3;sito de receber uma requisi&#xE7;&#xE3;o com os atributos de um novo exemplar e retornar o resultado gerado pelo classificador. Como o prop&#xF3;sito da API &#xE9; muito simples, busquei um framework que atendesse apenas a este prop&#xF3;sito e com isso me deparei com o Flask.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--10.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--10.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--10.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="flask">Flask</h2><p>O Flask &#xE9; um micro-framework escrito em Python que simplifica o desenvolvimento de APIs, permitindo iniciar um projeto de forma simples e ir evoluindo &#xE0; medida que forem aparecendo novas necessidades, como a adi&#xE7;&#xE3;o de um ORM, caso seja necess&#xE1;rio persistir informa&#xE7;&#xF5;es em um banco de dados.</p><h3 id="cria%C3%A7%C3%A3o-e-persist%C3%AAncia-de-um-modelo-pr%C3%A9-treinado">Cria&#xE7;&#xE3;o e persist&#xEA;ncia de um modelo pr&#xE9; treinado</h3><p>Iniciaremos pela implementa&#xE7;&#xE3;o do modelo de classifica&#xE7;&#xE3;o e como o foco do artigo &#xE9; a disponibiliza&#xE7;&#xE3;o do modelo, n&#xE3;o darei tanta &#xEA;nfase a parte de Machine learning. Primeiro devemos criar um novo diret&#xF3;rio para nosso projeto, recomendo a utiliza&#xE7;&#xE3;o do virtualenv para isolar a instala&#xE7;&#xE3;o das bibliotecas e do Python que iremos utilizar.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.55.39.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="456" height="151"></figure><p>Com o projeto criado, devemos inicializar o reposit&#xF3;rio git para que os arquivos sejam versionados atrav&#xE9;s da execu&#xE7;&#xE3;o do comando git init dentro do diret&#xF3;rio do projeto. Com o reposit&#xF3;rio git criado, iremos alterar o arquivo .gitignore para que os arquivos gerados pelo virtualenv sejam ignorados.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.56.12.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="202" height="276"></figure><p>Como iremos utilizar a base de dados IRIS, que &#xE9; uma base de dados utilizada largamente na avalia&#xE7;&#xE3;o de modelos de classifica&#xE7;&#xE3;o, a forma mais simples de carreg&#xE1;-la &#xE9; atrav&#xE9;s da biblioteca scikit-learn. A outra biblioteca utilizada ser&#xE1; o tensorflow-cpu, que &#xE9; uma biblioteca utilizada em projetos de Deep learning, por&#xE9;m iremos utilizar uma API de alto n&#xED;vel chamada keras que simplifica o desenvolvimento de redes neurais.</p><p>Antes de continuarmos, vale &#xE0; pena esclarecer o motivo de estarmos trabalhando com o tensorflow-cpu e n&#xE3;o com o tensorflow. Primeiramente, a aus&#xEA;ncia de GPU e das instala&#xE7;&#xF5;es necess&#xE1;rias para que o tensorflow seja executado atrav&#xE9;s da GPU, e em segundo lugar, o tamanho m&#xE1;ximo permitido pelo Heroku para uma aplica&#xE7;&#xE3;o ap&#xF3;s instala&#xE7;&#xE3;o de suas depend&#xEA;ncias e compacta&#xE7;&#xE3;o, que no momento da escrita deste artigo &#xE9; de 500MB e apenas a biblioteca tensorflow possui aproximadamente 600MB. Contudo, &#xE9; poss&#xED;vel utilizar o tensorflow durante o desenvolvimento do modelo fazendo uso de GPU durante as etapas de treino e teste, e uma vez finalizado, utilizar o tensorflow-cpu em produ&#xE7;&#xE3;o.</p><p>Ap&#xF3;s executar o comando pip install scikit-learn tensorflow-cpu para instalar as bibliotecas utilizadas, iremos criar um novo arquivo chamado classifier.py e nele iremos treinar e salvar nosso modelo de classifica&#xE7;&#xE3;o.</p><p>O c&#xF3;digo abaixo define uma rede neural contendo duas camadas ocultas com 128 e 64 neur&#xF4;nios, respectivamente. Ambas as camadas aplicam a fun&#xE7;&#xE3;o de ativa&#xE7;&#xE3;o ReLu e t&#xEA;m os valores dos pesos inicializados utilizando a t&#xE9;cnica RandomNormal que est&#xE1; fixada com um SEED para que o resultado seja reproduz&#xED;vel. Uma vez que a base IRIS cont&#xE9;m tr&#xEA;s classes, a ultima camada possui tr&#xEA;s neur&#xF4;nios e utiliza a fun&#xE7;&#xE3;o de ativa&#xE7;&#xE3;o softmax.</p><p>Ap&#xF3;s feita a compila&#xE7;&#xE3;o e o treinamento da rede neural, atingiu-se uma acur&#xE1;cia de 0.966 no grupo separado para teste, o que &#xE9; o suficiente para o objetivo deste artigo. Com isso, ao final do script salvamos um arquivo chamado model.h5 que cont&#xE9;m nosso modelo treinado. Existem outras m&#xE9;tricas e arquiteturas que podem ser testadas e podem gerar resultados melhores, por&#xE9;m nosso foco &#xE9; a disponibiliza&#xE7;&#xE3;o de um modelo j&#xE1; treinado e n&#xE3;o encontrar o melhor modelo de classifica&#xE7;&#xE3;o.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.57.19.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="621" height="438" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.57.19.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.57.19.png 621w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.58.10.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="615" height="521" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.58.10.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.58.10.png 615w"></figure><h2 id="api-flask">API Flask</h2><p>Com nosso modelo treinado, chegou a hora de criarmos uma API para disponibiliz&#xE1;-lo. Como dito anteriormente, iremos utilizar o micro-framework Flask para cria&#xE7;&#xE3;o da API, assim o primeiro passo &#xE9; instalar o Flask executando o comando pip install flask.</p><p>Uma vez instalado, ser&#xE1; criado um arquivo chamado main.py, contendo o c&#xF3;digo a seguir. Neste c&#xF3;digo &#xE9; declarada a rota /predict que responde ao m&#xE9;todo HTTP POST, e ao receber uma lista de atributos de um exemplar da base IRIS, retorna uma lista contendo a probabilidade para cada uma das classes poss&#xED;veis.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.58.58.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="438" height="411"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.59.20.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="659" height="318" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.59.20.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--17.59.20.png 659w"></figure><p><strong>Como descrito nos coment&#xE1;rios do c&#xF3;digo, seguem alguns pontos importantes:</strong></p><ul><li>o modelo &#xE9; carregado antes de inicializar a aplica&#xE7;&#xE3;o, uma vez que este processo &#xE9; custoso e faz&#xEA;-lo durante cada requisi&#xE7;&#xE3;o aumentaria consideravelmente o tempo de resposta da API;</li><li>o resultado do m&#xE9;todo keras.Sequential.predict() deve ser convertido para um objeto do tipo lista, uma vez que a fun&#xE7;&#xE3;o jsonify n&#xE3;o consegue serializar objetos numpy.</li></ul><p>A aplica&#xE7;&#xE3;o &#xE9; iniciada a partir da execu&#xE7;&#xE3;o do comando python main.py, e fica dispon&#xED;vel em localhost:5000. Para testar a API, basta fazer uma request executando a chamada cURL a seguir ou atrav&#xE9;s de aplica&#xE7;&#xF5;es como Postman ou Insomina.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--18.00.00.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="548" height="386"></figure><h2 id="deploy-heroku">Deploy Heroku</h2><p>Com a conclus&#xE3;o da API, chegou o momento do deploy que ser&#xE1; feito na plataforma <a href="https://www.heroku.com/">Heroku</a>. O Heroku &#xE9; uma Platform as a Service (PaaS) que disponibiliza um ambiente cloud utilizado para o provisionamento de aplica&#xE7;&#xF5;es web. Devido a simplicidade e baixa necessidade de configura&#xE7;&#xF5;es, &#xE9; uma boa escolha para quem busca disponibilizar uma aplica&#xE7;&#xE3;o web sem dedicar muito tempo a configura&#xE7;&#xE3;o de ambiente.</p><p>Antes de criar a aplica&#xE7;&#xE3;o no Heroku, &#xE9; necess&#xE1;rio que sejam feitos alguns ajustes na API para que esta fique pronta para o ambiente de produ&#xE7;&#xE3;o. O primeiro passo &#xE9; instalar o servidor WSGI gunicorn atendendo ao warning exibido ao iniciar a aplica&#xE7;&#xE3;o. Tal mensagem cont&#xE9;m: &#x201C;WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instea.&#x201D;, informando que o servidor atual deve ser utilizado apenas em desenvolvimento e para o ambiente de produ&#xE7;&#xE3;o, deve ser adicionado um servidor WSGI pr&#xF3;prio, que nesse caso ser&#xE1; o gunicorn.</p><p>Ao final da instala&#xE7;&#xE3;o do gunicorn, iremos gerar um arquivo .txt com todas as depend&#xEA;ncias de nossa aplica&#xE7;&#xE3;o executando o comando pip freeze &gt; requirements.txt. Note que foi gerado um arquivo chamado requirements.txt que cont&#xE9;m a lista de depend&#xEA;ncias bem como a vers&#xE3;o espec&#xED;fica de cada biblioteca.</p><p>Por fim, &#xE9; necess&#xE1;rio definir que a aplica&#xE7;&#xE3;o seja iniciada utilizando o servidor gunicorn, isto &#xE9; feito adicionando uma linha com a configura&#xE7;&#xE3;o web: gunicorn main:app a um arquivo chamado Procfile. O arquivo Procfile &#xE9; utilizado pelo Heroku para definir as configura&#xE7;&#xF5;es de inicializa&#xE7;&#xE3;o de um ambiente.</p><p>Como faremos o deploy atrav&#xE9;s da integra&#xE7;&#xE3;o que o Heroku possui com o Github, ser&#xE1; necess&#xE1;rio fazer um commit com as altera&#xE7;&#xF5;es at&#xE9; aqui e criar um novo <a href="https://github.com/joaofelipesus/disponibilizando-um-modelo-de-classificacao">reposit&#xF3;rio</a> como o que criei com o c&#xF3;digo deste projeto.</p><p>Com sua conta no Heroku criada atrav&#xE9;s do <a href="https://signup.heroku.com/">link</a>, chegou o momento de fazer o deploy da aplica&#xE7;&#xE3;o. Ao clicar no bot&#xE3;o new e selecionando a op&#xE7;&#xE3;o Create new app, voc&#xEA; ser&#xE1; redirecionado para a tela de cria&#xE7;&#xE3;o de um novo app. Lembre-se de que n&#xE3;o existem mais Dynos gratuitos, e um Dyno b&#xE1;sico &#xE9; o suficiente para reproduzir a aplica&#xE7;&#xE3;o descrita neste artigo e custa em torno de sete d&#xF3;lares por m&#xEA;s.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXczEfzGZdaSJpHfp3D0o6tNrcy_NZdkPqgvUO1SGXev5sXqjc6jcWsbrljEJPysAQb7IaSuRyXhwT0-0AJg25qamEUAcjHzDc_b69ZclTeVuWwd781nCjQF5v8gW4k69Qxc7Csz5QeIJTX3U9ZyrZtdqkcq?key=l6z0IBWO5efHywfoWbLgiw" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy"></figure><p>Agora deve ser preenchido um nome para a aplica&#xE7;&#xE3;o, que no meu caso foi `iris-prediction-api`. Como o nome &#xE9; &#xFA;nico, deve ser escolhido algo que fa&#xE7;a sentido para sua aplica&#xE7;&#xE3;o.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd4JSYKMaUKftx-9hsKhhhW9q9fSJsJXZHRYu5XHvsAwEdFpNNU8xV7jfKer-3dHgNnv7xWwwemRw5W1XLf2mmIMhpL5btyEHRUVXAam0CkiZFLoV_VZREQlToR5ZTBhRrwTwU9OZG89a-jNCOlQrUF6Og?key=l6z0IBWO5efHywfoWbLgiw" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy"></figure><p>Com o nome da aplica&#xE7;&#xE3;o definido, chegou a hora de enviar nosso c&#xF3;digo ao `Heroku`. &#xC9; poss&#xED;vel faz&#xEA;-lo atrav&#xE9;s de um cliente de terminal que o pr&#xF3;prio `Heroku` disponibiliza, por&#xE9;m faremos via integra&#xE7;&#xE3;o com o `Github`. Com isso, clique na op&#xE7;&#xE3;o `Github` presente na sess&#xE3;o `Deployment method` e siga os passos para dar acesso ao `Heroku` a seus reposit&#xF3;rios presentes no `Github`.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfekKBNFaGeYrKd6_zdehf8Ljk9qLs06hiLPWHoS0Ceiq3iIv76ZRS8GgU1sQXM7W72WDO8UcNyaK0S0Kth-0Ea2whe2GcGVKNlQqmbzlf0-2z-pXS02Z1yPKiUySqSReBgIXECdV8YIAO9TwYddGwNfh8?key=l6z0IBWO5efHywfoWbLgiw" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy"></figure><p>Uma vez que a integra&#xE7;&#xE3;o estiver conclu&#xED;da, utilize o filtro para selecionar o nome do reposit&#xF3;rio e clique em `connect`. Ap&#xF3;s conectado com o reposit&#xF3;rio, selecione a `branch` que cont&#xE9;m o c&#xF3;digo de produ&#xE7;&#xE3;o, que no meu caso &#xE9; a branch `main` e clique no bot&#xE3;o `Deploy branch` para que seja iniciado o processo de deploy. Note que existe uma op&#xE7;&#xE3;o que permite ligar o deploy autom&#xE1;tico e, com isso, sempre que a branch selecionada for atualizada ser&#xE1; feito um novo deploy automaticamente.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfBlgptl7jPxUqzaey-4m0rFiLdpJUh0noCKXlfRznAL8kXWf1ex2fvo8huczTcQfyvBGR1emHoWhaLkH7VdqgEAbT4qCs9jrHbCpXrIk-02f3jRJxSupS6CaSuoqTCahuGV5iZKjFMqzr-NWG3FuvcK7TF?key=l6z0IBWO5efHywfoWbLgiw" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy"></figure><p>&#xC9; poss&#xED;vel acompanhar os passos que est&#xE3;o sendo executados bem como o status do `deploy`.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfM5Wfs-XmHb6ayI8u9eHyakKMs6kZlCEZMvgaybIfPSa3kPJXE1i8qM3Zj-9C9bb4U6Ik92I49e2C91pKAPnaomhw8zMra7nRv44_qEpPu3maVKdVn6ZFNQ2RuRnyqy7AtaLqDuavreD5_n_qHu9Q_bX89?key=l6z0IBWO5efHywfoWbLgiw" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXegVz38e0JHprDTj34I2AUMo3XQDl26L2C9iF2h2Ri-n7Ai3axEDx9IxsDC0CYm1-ZXy_mf0na58HARN0c6I0YxtPcERs4dBUxgnpU98FvNJx7a9-d5r2VPuKVobF30rZZNyloMBnNO3uBEkgk0QXMP3JTV?key=l6z0IBWO5efHywfoWbLgiw" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy"></figure><p>Com o fim da etapa de deploy, chegou o momento de testar se a API est&#xE1; funcionando corretamente. Clique no bot&#xE3;o `Open app` e copie a `URL` da aba que foi aberta. Esta &#xE9; a `URL` que aponta para a `API` e com isso &#xE9; poss&#xED;vel fazer uma requisi&#xE7;&#xE3;o via `cURL` apontando para o servidor de produ&#xE7;&#xE3;o.</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--18.01.02.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="652" height="283" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--18.01.02.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-28-a-la-s--18.01.02.png 652w"></figure><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--12.png" class="kg-image" alt="Disponibilizando um modelo de classifica&#xE7;&#xE3;o (Keras + Flask + Heroku)" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--12.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--12.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Por fim,temos uma API `Flask` que disponibiliza um modelo de classifica&#xE7;&#xE3;o para que seja utilizado por outros apps. O c&#xF3;digo utilizado como exemplo ao longo do artigo est&#xE1; neste <a href="https://github.com/joaofelipesus/disponibilizando-um-modelo-de-classificacao">reposit&#xF3;rio</a>.</p><p>At&#xE9; o pr&#xF3;ximo artigo!</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[React Router: Como usar as rotas no React? - Parte III]]></title><description><![CDATA[<p></p><p><a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-ii/">Na parte 2 desse m&#xF3;dulo</a><strong> </strong>aprendemos a como utilizar os par&#xE2;metros da URL, para possibilitar uma navega&#xE7;&#xE3;o ainda mais fluida e completa dentro da nossa aplica&#xE7;&#xE3;o. Nessa terceira parte do artigo iremos aprender a como tratar erros e por consequ&</p>]]></description><link>https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-iii/</link><guid isPermaLink="false">671c2c3e7a5ec80001aa4010</guid><category><![CDATA[React]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Antônio André]]></dc:creator><pubDate>Mon, 04 Nov 2024 19:39:20 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---React-Router_-Como-usar-as-rotas-no-React_---Parte-III.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---React-Router_-Como-usar-as-rotas-no-React_---Parte-III.png" alt="React Router: Como usar as rotas no React? - Parte III"><p></p><p><a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-ii/">Na parte 2 desse m&#xF3;dulo</a><strong> </strong>aprendemos a como utilizar os par&#xE2;metros da URL, para possibilitar uma navega&#xE7;&#xE3;o ainda mais fluida e completa dentro da nossa aplica&#xE7;&#xE3;o. Nessa terceira parte do artigo iremos aprender a como tratar erros e por consequ&#xEA;ncia enviar um feedback, isto &#xE9;, uma resposta para o usu&#xE1;rio de que ocorreu algum erro dentro da nossa aplica&#xE7;&#xE3;o. Para isso, iremos dar continuidade ao projeto que estamos utilizando desde a parte 1 do artigo, se voc&#xEA; chegou aqui de paraquedas e quer pegar essa explica&#xE7;&#xE3;o desde o in&#xED;cio <a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-ii/">acesse esse link</a></p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--9.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--9.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--9.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="qual-%C3%A9-a-import%C3%A2ncia-de-lidar-com-erros">Qual &#xE9; a import&#xE2;ncia de lidar com erros?</h2><p>Lidar com erros de maneira eficaz &#xE9; fundamental para criar uma experi&#xEA;ncia de usu&#xE1;rio positiva e funcional em qualquer aplica&#xE7;&#xE3;o ou sistema. A import&#xE2;ncia de tratar erros est&#xE1; relacionada a diversos aspectos que impactam diretamente a usabilidade, a confiabilidade e a credibilidade da aplica&#xE7;&#xE3;o. Vamos explorar algumas raz&#xF5;es pelas quais &#xE9; essencial lidar com erros de forma adequada:</p><p><strong>Experi&#xEA;ncia do Usu&#xE1;rio (UX) Melhorada</strong>: Erros n&#xE3;o tratados ou mensagens de erro confusas podem frustrar os usu&#xE1;rios e dificultar o uso da aplica&#xE7;&#xE3;o. Quando os usu&#xE1;rios n&#xE3;o entendem o que deu errado e por que, eles podem se sentir desencorajados a continuar usando o aplicativo. Por outro lado, tratar erros de maneira clara e fornecer feedback compreens&#xED;vel pode melhorar a experi&#xEA;ncia do usu&#xE1;rio, permitindo que eles compreendam o problema e saibam como resolv&#xEA;-lo. N&#xF3;s n&#xE3;o queremos que o usu&#xE1;rio veja um erro desse tipo, seria um susto para ele:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf5W-dsfsw9hoOrvOoQyVx4EVfdPAbaaUkIDAufyE5Q974Q6iYdfc_dFekRkYEHNYPRh148OwfFlEuK_CJb8Lv8ksi9qht6f8Vd3H5oUbAFH6BOOmFSUExzrGm7VR6KZSzep3XLa93dc8Rr8wh0kQmyITtzsO_6w4nWqB9lQMI2FelIsRb-QPw?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p><strong>Identifica&#xE7;&#xE3;o e Resolu&#xE7;&#xE3;o de Problemas</strong>: Ao lidar com erros de forma estruturada, a equipe de desenvolvimento (que somos n&#xF3;s, desenvolvedores) pode coletar informa&#xE7;&#xF5;es &#xFA;teis sobre o que deu errado e por qu&#xEA;. Isso facilita a identifica&#xE7;&#xE3;o e a resolu&#xE7;&#xE3;o de problemas, permitindo que os desenvolvedores abordem as quest&#xF5;es subjacentes e melhorem a qualidade do aplicativo ao longo do tempo.</p><p><strong>Navega&#xE7;&#xE3;o Fluida</strong>: Lidar com erros na URL, como mencionado na introdu&#xE7;&#xE3;o, &#xE9; um exemplo de como tratar erros pode melhorar a navega&#xE7;&#xE3;o fluida na aplica&#xE7;&#xE3;o. Se a aplica&#xE7;&#xE3;o n&#xE3;o consegue lidar com URLs inv&#xE1;lidas ou malformadas, os usu&#xE1;rios podem ficar presos em p&#xE1;ginas de erro ou redirecionamentos inesperados, o que prejudica a usabilidade.</p><p><strong>Exemplificando erros: </strong>No desenvolvimento da nossa aplica&#xE7;&#xE3;o estamos usando um contexto baseado em um site que possui alguns produtos, que nesse caso s&#xE3;o jogos. Voltando para a parte 2 do artigo, n&#xF3;s utilizamos o useParams() para usar os par&#xE2;metros da URL, mas vamos supor que o usu&#xE1;rio tentou acessar um produto que n&#xE3;o existe dentro do nosso banco de dados: o arquivo database.json. Isso dar&#xE1; um erro na nossa aplica&#xE7;&#xE3;o, sem d&#xFA;vidas. Para acessar o que seria mostrado para o usu&#xE1;rio, na URL da aplica&#xE7;&#xE3;o, ao inv&#xE9;s de acessarmos um valor v&#xE1;lido de ID (que no caso vai de 1 at&#xE9; 5) vamos passar um valor inv&#xE1;lido que seja maior do que 5 e menor do que 1. Veja s&#xF3;, irei passar o valor 1000:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeQNTrXalPvH3BGv6l2soaXxcBmZD63Muz3skgPsmA2JMLB-Pigxw1uqUwXfD7Hl-TjKOmpNi8n3pnQ_XyGtJ7xpki-skQ0x0vnm3zNHy428CEQUNX8jonsFl-EUivzJHQb1qN1UwCca-jkwb-0a-kOu2g4tLnW4dpqzc9gqNOPCTW3MRYjO-0?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Como voc&#xEA; pode observar, o produto 1000 evidentemente n&#xE3;o existe na lista dos nossos produtos e como consequ&#xEA;ncia disso a nossa aplica&#xE7;&#xE3;o dar um erro! Inclusive, o pr&#xF3;prio React nos dar uma dica: &#x201C;&#x1F4BF; Hey developer &#x1F44B;</p><p>You can provide a way better UX than this when your app throws errors by providing your own ErrorBoundary or errorElement prop on your route.&#x201D; Ele avisa para n&#xF3;s desenvolvedores que n&#xF3;s poder&#xED;amos criar uma tela de erro que possu&#xED;sse um melhor UX do que a tela de erro padr&#xE3;o do React (que &#xE9; imagem acima), usando <em>ErrorBoundary ou errorElement. </em></p><p>Ent&#xE3;o &#xE9; isso que aprenderemos nesse artigo!</p><h2 id="configurando-mecanismos-de-erros">Configurando mecanismos de erros</h2><p>Dentro da pasta src, iremos criar duas novas pastas separadas: <em>loaders </em>e <em>errorBoundaries</em>.</p><p><strong>Explicando o loader: </strong>o loader &#xE9; uma propriedade dispon&#xED;vel dentro dos caminhos das rotas da nossa aplica&#xE7;&#xE3;o, e elas servem exatamente para carregar algum conte&#xFA;do: seja ele uma requisi&#xE7;&#xE3;o &#xE0; API, carregar informa&#xE7;&#xF5;es de um banco de dados e entre outros. O loader &#xE9; uma fun&#xE7;&#xE3;o que deve retornar alguma coisa, algum carregamento.</p><p><strong>Explicando errorBoundary: </strong>o errorBoundary &#xE9; um elemento que vai ficar &#x201C;observando&#x201D; se determinada rota vai ocorrer algum tipo de erro, e se caso aconte&#xE7;a ir&#xE1; ser tratado de alguma forma de acordo com o que foi projetado.</p><p>As pastas devem estar assim:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd56BHRxchF8tCO4axMxFHo92qcjrQYaxPALzbXG7LfUVkmQCLgjBt01_zPLWz3P3tUknTItKaxkc_JJ9ryuyxOq0x91S1ram5h9TcP4PvwKn4KJp5TpHqj5cjrd3iprZE9N48Q1PSFqwoEx8XUaSu55uZ4byRwKqjJ2feot9oJD843uhOquw?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Agora dentro da pasta <em>loaders </em>iremos criar um arquivo chamado <em>products</em>. Isso seria o arquivo respons&#xE1;vel por fazer alguma requisi&#xE7;&#xE3;o e retornar algo, por exemplo. No nosso exemplo, a &#x201C;requisi&#xE7;&#xE3;o&#x201D; ser&#xE1; feita para o database.json retornar o produto que queremos acessar a partir do <em><strong>par&#xE2;metro da fun&#xE7;&#xE3;o da rota que estamos usando o loader (que nesse caso &#xE9; o productId).</strong></em><strong> </strong>Por esse motivo, usamos a prop <em>params</em> que j&#xE1; &#xE9; uma prop dispon&#xED;vel em todo loader, que vai usar o par&#xE2;metro espec&#xED;fico da rota em que est&#xE1; inserida. Dentro desse arquivo estar&#xE1; assim:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc5Tr_v2mVjC-7pLgZP68U9kIzczDC-rYBPNjegjjW2j_OEslWbEn2GxEDlbsutoihKpF2FIen7bTOZZR4pu8f3w3Uy0ZgNZEGdp2QQX0889caMLE780qSSeI2F603nbRK4UIiF2WDMHggXLpeedrSPtjIaW9xXnvaNkhanefpdw2Wc6tzxlw?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Agora vamos retornar o produto espec&#xED;fico que queremos, igual fizemos no arquivo Product.jsx anteriormente em outro artigo. Iremos procurar esse produto baseado no seu par&#xE2;metro e retorn&#xE1;-lo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf0K0iTWU-5Asb7Iz5xgcA14XJZuTwY7T9N4IQu3UFCELsnWpWV-b-0ZKGhlqfu6v7QfP_0Z6cxj44QzFKfdfRTfqPV9bPFb3GaY250HXLECTHw5GUwktR34HH4SGSuDhRNs7SR3lfV5cQ1WBAYjj8bxDyl4GOAiQzMKnxFxNVKcpLE_HvmNw?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>No arquivo Product.jsx podemos deix&#xE1;-lo assim:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXduRVS0inWVuq-OUV2ABHorRDFhbQcEcwzdkYdtiAg9s2kWPCs2pqiJBR9cJfXTsQNBCdlKn97djazb0aDnr0zbhkGqK_EoWGfTOLhQGKILqzt566T2EqAaZr91Vxvopfbm-YCJwtIGp65sC3NUbMsNY5VWoVuYmUAMbjqmm5hPHChtyF9VXi4?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Agora, dentro do arquivo <em>router.jsx </em>&#xE9; necess&#xE1;rio incluir o nosso loader:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfKtmoEwwveRdisUhAhsD_SvVeFzeq14ltl-j60LSRO_qesLFJ-SmSJrKwxN0riXEW2PyLc8ej9Q4eHrTfU6USrm4N_kYuH8dA9MVtUNgt1NFNgwUj3RDsdlXzlSd3HL9otjUiM5DVGYF811m-Inm-jqByeY0yLaQQhr8XPQ9mhySuxnBZ5FQ?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Agora falta a &#xFA;ltima etapa para concluir o carregamento do loader, que &#xE9; us&#xE1;-lo. Se formos at&#xE9; o arquivo Product.jsx vamos ver que n&#xE3;o retornamos nada para <em>product:</em></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfm9QnbhSJ_zFNu5dHeyH2lQgCRXkTOHpriPX8qIEKZZVMV2_Ucwnibq1koaIYCFuEGowc7-oDnY03p1-nB2ZZJ2nMvO6YfnkXjdFGKWOf1QKDZ3WbM5KN-QAotSrqH1TnPcMuFuFq0Pk1tI4Ab70KCHymoMDn6-W-OzdFOoAN7VLkbIm-umw?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Isso est&#xE1; acontecendo justamente porque ainda n&#xE3;o usamos o loader, que &#xE9; o respons&#xE1;vel por <strong>carregar nossa &#x201C;requisi&#xE7;&#xE3;o&#x201D;, que s&#xE3;o os produtos. </strong>Para isso vamos usar um hook chamado <em>userLoaderData(), </em>que vai basicamente capturar o retorno da fun&#xE7;&#xE3;o do loader que criamos! Logo, o arquivo Product.jsx ficar&#xE1; assim:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfLD09jbjwgA3cmheAOuAo7OosKyBEErAHMUjd26m5gtiF464qyfhnnZ9CB5aeaTvXL75YqSVWU_nk_Ag2zh8YwwIlnzHoJ5S8g3dNsLJ3af8IkN-l0skkkB_K65xbkNG65HcjGBUFz1sjfrVnnFFl4v4ofrsPYX4ZaeXrSlS9CUAUZbt5upI0?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p><em><strong>OBSERVA&#xC7;&#xC3;O IMPORTANTE: no arquivo product.js, que est&#xE1; dentro da pasta loaders, altere o nome da fun&#xE7;&#xE3;o para loadProduct! Se voc&#xEA; n&#xE3;o fizer isso haver&#xE1; conflito com o database.json:</strong></em></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd1LUnILSMkmGBv2-TYx6aD5zXWjU2ICwIzeKETmxTbi-qs5BEEDyHB9I8ql60Np_58kx8spCZDZZ7tdde0DNqMUclArMi2GHRX9XBwRs2_cfceiYFgEsB4zgHarYpEmNPKGeew66wyyTh5Y3bvHyiuekc2F18OwJHAC4TiOqaBU5w2yy30nA?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><h2 id="usando-o-errorelement">Usando o errorElement</h2><p>Ap&#xF3;s terminarmos todas as configura&#xE7;&#xF5;es do loader acima, vamos come&#xE7;ar a tratar e visualizar de fato os erros. Antes de prosseguir, vale ressaltar que para que possamos utilizar o errorElement de maneira completa e eficiente &#xE9; necess&#xE1;ria a configura&#xE7;&#xE3;o de um loader para a rota que queremos tratar erros, logo &#xE9; um requisito obrigat&#xF3;rio essa configura&#xE7;&#xE3;o que fizemos anteriormente.</p><p>Dentro da pasta errorBoundaries, vamos criar um componente chamado <em>ProductBoundary, </em>e dentro dele deve ter o seguinte conte&#xFA;do:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe-PjSK0rxvZFE1Uqo7L6pVAGMWaK-R006C20msLrfJlQ3opWmQowe-WHyC86iZFMFgtCqPInkbLRfMu9Tk4RVYOxVGpy-QYFOX7LmveH-IAD5dsqKJf9V5ng7YpFDN8gMQorvyf_LYpFIEqAGx9HgcUj6YNzWKxBoX6OGoFji3zckruwfAd5k?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p><strong>const error = useRouterError();</strong></p><p>A linha de c&#xF3;digo acima &#xE9; um outro hook do React Router DOM, que vai retornar o erro mais pr&#xF3;ximo da rota em que ele estar inserido. E por meio desse erro, podemos trat&#xE1;-los de acordo com a necessidade.</p><p><br><strong>if (isRouteErrorResponse(error)) {</strong></p><p><strong>}</strong></p><p>A linha de c&#xF3;digo acima verifica se o erro que foi retornado &#xE9; um erro de <em><strong>resposta de rota:</strong></em></p><p><em><strong>404 - N&#xE3;o Encontrado: </strong>O servidor n&#xE3;o encontrou o recurso solicitado. Isso &#xE9; frequentemente usado para representar que uma rota n&#xE3;o corresponde a nenhuma das rotas definidas na aplica&#xE7;&#xE3;o.</em></p><p><em><strong>401 - N&#xE3;o Autorizado: </strong>O acesso ao recurso &#xE9; negado devido &#xE0; falta de autentica&#xE7;&#xE3;o v&#xE1;lida ou &#xE0; autentica&#xE7;&#xE3;o inv&#xE1;lida. Isso pode ser usado para roteamento quando um usu&#xE1;rio n&#xE3;o tem permiss&#xE3;o para acessar determinada rota.</em></p><p><em><strong>403 - Proibido:</strong> O servidor entendeu a solicita&#xE7;&#xE3;o, mas se recusa a autoriz&#xE1;-la. Diferente do 401, aqui o usu&#xE1;rio est&#xE1; autenticado, mas n&#xE3;o possui as permiss&#xF5;es necess&#xE1;rias.</em></p><p><em><strong>500 - Erro Interno do Servidor</strong>: Indica que o servidor encontrou uma situa&#xE7;&#xE3;o com a qual n&#xE3;o sabe lidar. Pode ser usado para indicar um erro interno ao renderizar uma rota.</em></p><p><em><strong>502 - Bad Gateway: </strong>Indica que um servidor, enquanto atuando como gateway ou proxy, recebeu uma resposta inv&#xE1;lida do servidor upstream que estava acessando para atender a solicita&#xE7;&#xE3;o.</em></p><p><em><strong>503 - Servi&#xE7;o Indispon&#xED;vel: </strong>O servidor n&#xE3;o est&#xE1; pronto para manipular a solicita&#xE7;&#xE3;o. Isso pode ocorrer, por exemplo, quando o servidor est&#xE1; sobrecarregado ou em manuten&#xE7;&#xE3;o.</em></p><p><em><strong>504 - Gateway Timeout:</strong> O servidor, enquanto atuando como gateway ou proxy, n&#xE3;o recebeu uma resposta oportuna do servidor upstream ou algum outro servidor necess&#xE1;rio para lidar com a solicita&#xE7;&#xE3;o.</em></p><p>Essa verifica&#xE7;&#xE3;o decorrente desse Hook, possibilita acessar uma propriedade do objeto pela qual ele retorna chamada: <em>status. </em>Dessa forma, podemos tratar os erros com uma precis&#xE3;o muito melhor:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-25-a-la-s--17.41.08.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy" width="594" height="435"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-25-a-la-s--17.41.28.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy" width="573" height="266"></figure><p></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdAw6276PplqdGvY5ZGFZCpp-n9Zx7fKmyFLBfsJhrD_WWTEan86ShdGyo9glfGr4_QCMGpSssZIygqGJya1lMQx6TtW2jy8NuomPdoMulGlfHnvKTsRDiYeqWsvhiYOCn92skfZ-LUk4dHA93HX0Zw5Yz1R7VVpDoPmiB051Dy1rLMtT1G4w?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Agora basta usarmos o errorElement passando o componente que criamos, dentro do arquivo <em>router.jsx:</em></p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-25-a-la-s--17.42.23.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy" width="537" height="412"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-25-a-la-s--17.42.53.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy" width="548" height="549"></figure><p><br></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdpAeSUaAqgRihqhJqZptq9QFgwpuMpm2bbaAWwDSZJl_trQUK2dv32wA3qa1M4LaBLGTFof2WeFdANjuLmY3ZwlAbO1P2dQ1Foiw6deSFFeYa1pjPmg73D-JgFdXTdTMApt3JowwovbNPDcH1h10V1WxoYD10uZI6qmGQYewPb_mEmsDA_oPk?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Agora, no navegador podemos tentar acessar algum produto que n&#xE3;o existe, e veremos que est&#xE1; tudo funcionando:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdEHPb9binnC-DlCjFk9P2hLeu_b3DIho3guuol8njhc8xfd_Opi-7T9wXqrqNvxw1Obtkeh223Iaa8QR-ewe191uMpM7tsXD1zVlEBmHJtLex2BEL6qK6yYuHh7jHgGj-zcBOBl2rnoeiWTcvCXNOydTiCU9KAOflzTiXIXRZTMa9S0IO6fGs?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><h2 id="analisando-os-outros-tipos-de-erros-de-resposta-de-rota">Analisando os outros tipos de erros de resposta de rota</h2><p>Dentro do nosso arquivo loader chamado <em>product.js </em>vamos lan&#xE7;ar um erro de resposta personalizado para que possamos analisar e verificar se todos os erros realmente est&#xE3;o funcionando. Para isso, seu arquivo deve analisar se caso o produto n&#xE3;o exista, lan&#xE7;ar um erro de resposta de forma manual:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-25-a-la-s--17.43.38.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy" width="618" height="372" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-25-a-la-s--17.43.38.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-25-a-la-s--17.43.38.png 618w"></figure><p>}</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeTg0zt4ngnNp8a1XOFZNGD35Iko9AjCCamvC8w2eIoYc3_9zasIsUJeXYG1ZTads4mNs3kKVjlNPVzeWxB6zQJ1Obbc1kEBmKrqjHz6X2ZMkdjhgUMlN2ZQm45JmcO1HGd7gP9Y0ZOf8FLK0JahJENibV2DVQVWxo3cH1KnhdJn6Yd9WZNYA?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>No navegador, a mensagem de erro mudar&#xE1; pois lan&#xE7;amos um erro do tipo 404 e mensagem aparecer&#xE1; de acordo com o que definimos no switch case:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc9DTekeiY_JIQwboK4t-JGBDT2AgTxR7ha8QnTTvHH4Sz_CVGI85pG2RYzb-7S9ifkrKGV-WsnvrjMoR080ovckEgw4-PTNVS2OJs-rHKfax4g8595g6KHJD5atuKDDBstUiMDX7HXIZTF7BcRMCPWL3becI5IItOCvXpO5s8qswtxL9rFrWM?key=RU5gm1QAMqDDt6v_myTlbg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy"></figure><p>Para verificar os outros erros basta mudar o status do erro lan&#xE7;ado. N&#xE3;o esque&#xE7;a de atualizar a p&#xE1;gina no seu navegador para que veja o novo erro!</p><h2 id="conclus%C3%A3o">Conclus&#xE3;o</h2><p>Em conclus&#xE3;o, esta terceira parte do artigo aprofundou nosso conhecimento sobre a import&#xE2;ncia de tratar erros de forma adequada em aplica&#xE7;&#xF5;es. Como vimos ao longo do artigo, lidar com erros n&#xE3;o &#xE9; apenas uma quest&#xE3;o t&#xE9;cnica, mas tamb&#xE9;m desempenha um papel fundamental na cria&#xE7;&#xE3;o de uma experi&#xEA;ncia de usu&#xE1;rio positiva e funcional.</p><p>Atrav&#xE9;s da abordagem cuidadosa de tratamento de erros, conseguimos compreender como a usabilidade, a confiabilidade e a credibilidade de uma aplica&#xE7;&#xE3;o podem ser diretamente impactadas. Ao proporcionar mensagens de erro claras e informativas, podemos evitar frustra&#xE7;&#xF5;es por parte dos usu&#xE1;rios e incentiv&#xE1;-los a continuar utilizando a aplica&#xE7;&#xE3;o, mesmo diante de adversidades.</p><p>Assim como um sistema bem projetado &#xE9; capaz de minimizar erros t&#xE9;cnicos, um tratamento de erros eficaz pode minimizar as consequ&#xEA;ncias negativas de eventuais problemas. Ao investir tempo e esfor&#xE7;o na implementa&#xE7;&#xE3;o de estrat&#xE9;gias de feedback e comunica&#xE7;&#xE3;o de erros, estamos contribuindo para a constru&#xE7;&#xE3;o de produtos de qualidade e para a satisfa&#xE7;&#xE3;o duradoura dos usu&#xE1;rios.</p><p>Portanto, ao prosseguir com o projeto que acompanhamos desde a primeira parte deste artigo, convido voc&#xEA; a aplicar os conhecimentos adquiridos aqui. Implemente uma abordagem de tratamento de erros que n&#xE3;o apenas solucione problemas, mas tamb&#xE9;m ofere&#xE7;a uma experi&#xEA;ncia que inspire confian&#xE7;a e facilite a resolu&#xE7;&#xE3;o de dificuldades por parte dos usu&#xE1;rios.</p><p>Agrade&#xE7;o por ter me acompanhado nesta jornada de aprendizado e aprimoramento. Com as bases s&#xF3;lidas estabelecidas nas tr&#xEA;s partes deste artigo, voc&#xEA; est&#xE1; bem equipado para criar aplica&#xE7;&#xF5;es mais robustas, eficazes e amig&#xE1;veis com React Router DOM. Lembre-se sempre de que a busca pela excel&#xEA;ncia no tratamento de erros &#xE9; um passo essencial para o sucesso de qualquer projeto de desenvolvimento.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--11.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte III" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--11.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--11.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Se voc&#xEA; deseja revisitar alguma parte deste artigo, pode encontrar os links para as partes anteriores abaixo:</p><p><strong><a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-i/">Parte 1</a></strong></p><p><strong><a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-ii/">Parte 2</a></strong></p><p>Continuarei a explorar temas relevantes como este para enriquecer seu conhecimento e habilidades no desenvolvimento de software. Fique atento para mais conte&#xFA;do envolvente e educativo. </p><p>At&#xE9; a pr&#xF3;xima jornada!</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Deploy de um Projeto React com Next.js no Vercel (Via Site)]]></title><description><![CDATA[<p></p><p>Realizar o deploy de um projeto &#xE9; um passo crucial para o desenvolvimento web. Dentre tantas plataformas de hospedagem existentes hoje em dia, a Vercel &#xE9; uma que se destaca pela facilidade de uso e pela integra&#xE7;&#xE3;o perfeita com frameworks como o Next.js. Neste artigo, vamos</p>]]></description><link>https://community.revelo.com.br/deploy-de-um-projeto-react-com-next-js-no-vercel-via-site/</link><guid isPermaLink="false">671c15c77a5ec80001aa3fb8</guid><category><![CDATA[Next.js]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Bruno Gabryell Cabral Da Silva]]></dc:creator><pubDate>Mon, 04 Nov 2024 17:49:51 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Deploy-de-um-Projeto-React-com-Next.js-no-Vercel--Via-Site-.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Deploy-de-um-Projeto-React-com-Next.js-no-Vercel--Via-Site-.png" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)"><p></p><p>Realizar o deploy de um projeto &#xE9; um passo crucial para o desenvolvimento web. Dentre tantas plataformas de hospedagem existentes hoje em dia, a Vercel &#xE9; uma que se destaca pela facilidade de uso e pela integra&#xE7;&#xE3;o perfeita com frameworks como o Next.js. Neste artigo, vamos realizar juntos o deploy diretamente pelo site da Vercel de um projeto React com Next.js, de forma simples e eficaz, para que voc&#xEA; tamb&#xE9;m possa aplicar em seus projetos.</p><p>Se voc&#xEA; ainda n&#xE3;o est&#xE1; entendendo nada do que eu estou falando, vamos por partes: que tal revisar o que &#xE9; o React, o Next.js e a Vercel e por que eles s&#xE3;o uma combina&#xE7;&#xE3;o t&#xE3;o poderosa para o desenvolvimento e implanta&#xE7;&#xE3;o de aplica&#xE7;&#xF5;es web modernas?</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--8.png" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--8.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--8.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="o-que-%C3%A9-o-react">O que &#xE9; o React?</h2><p>O React &#xE9; uma biblioteca JavaScript de c&#xF3;digo aberto desenvolvida pelo Facebook que permite aos desenvolvedores construir interfaces de usu&#xE1;rio interativas e din&#xE2;micas para aplicativos web e m&#xF3;veis. Ele utiliza um modelo de componentes reutiliz&#xE1;veis, onde cada parte da interface &#xE9; encapsulada em componentes independentes, facilitando o desenvolvimento, manuten&#xE7;&#xE3;o e escalabilidade de aplicativos. Al&#xE9;m disso, esta biblioteca utiliza uma abordagem de &quot;renderiza&#xE7;&#xE3;o virtual&quot; para otimizar o desempenho, atualizando apenas partes espec&#xED;ficas da interface quando necess&#xE1;rio, resultando em uma experi&#xEA;ncia de usu&#xE1;rio mais responsiva.</p><h2 id="o-que-%C3%A9-o-nextjs">O que &#xE9; o Next.js?</h2><p>O Next.js &#xE9; um framework de c&#xF3;digo aberto constru&#xED;do sobre o React que simplifica o desenvolvimento web. Destaca-se por oferecer renderiza&#xE7;&#xE3;o no lado do servidor (SSR) para melhor desempenho e SEO, integra&#xE7;&#xE3;o f&#xE1;cil com TypeScript, sistema de rotas intuitivo e suporte a diversos plugins, tornando-o uma escolha popular para criar aplica&#xE7;&#xF5;es web modernas e eficientes. Para utilizar o Next.js, voc&#xEA; precisa ter o Node.js instalado em seu terminal. Caso esteja usando um sistema operacional Mac ou Windows, voc&#xEA; pode acessar o site https://nodejs.org/en/ para fazer o download da vers&#xE3;o LTS (Long Term Support) mais recente e est&#xE1;vel do Node.js e, em seguida, realizar a instala&#xE7;&#xE3;o usando o arquivo baixado. Caso esteja utilizando o sistema operacional Linux, voc&#xEA; pode executar as seguintes linhas de comando no seu terminal para instalar o Node.js:</p><blockquote class="kg-blockquote-alt"><em>sudo apt-get update</em><br><em>sudo apt-get install node.js</em></blockquote><p>Se a instala&#xE7;&#xE3;o do <em>Node</em> foi conclu&#xED;da corretamente para qualquer um dos casos citados, ao executarmos o comando abaixo, receberemos como informa&#xE7;&#xE3;o no nosso terminal a vers&#xE3;o do <em>Node</em> instalada:</p><blockquote class="kg-blockquote-alt"><em>node --version</em></blockquote><h2 id="o-que-%C3%A9-o-vercel">O que &#xE9; o Vercel?</h2><p>A Vercel &#xE9; uma plataforma de hospedagem de aplicativos web que se destaca por sua especializa&#xE7;&#xE3;o em aplicativos front-end e oferece uma variedade de recursos e benef&#xED;cios para desenvolvedores.</p><p>A Vercel &#xE9; amplamente reconhecida por sua efic&#xE1;cia na hospedagem de projetos constru&#xED;dos com frameworks front-end populares, como Next.js e React, mas tamb&#xE9;m &#xE9; adequada para uma variedade de outros frameworks e tecnologias. Com suporte a dom&#xED;nios personalizados, certificados SSL gratuitos e uma s&#xE9;rie de ferramentas de colabora&#xE7;&#xE3;o e monitoramento, a Vercel se torna uma escolha preferencial para aqueles que buscam uma plataforma robusta e amig&#xE1;vel para hospedar seus projetos web.</p><p>Voc&#xEA; deve possuir uma conta na Vercel para realizar o deploy por l&#xE1;. Se n&#xE3;o tiver uma, &#xE9; poss&#xED;vel criar uma gratuitamente clicando <a href="https://vercel.com">aqui</a> e se cadastrando.</p><h2 id="primeiros-passos">Primeiros passos</h2><p>Agora, com a conta na Vercel criada e o Node.js instalado para o uso do Next.js, vamos prosseguir com o passo a passo. Primeiramente, crie um projeto React na sua m&#xE1;quina, por meio do c&#xF3;digo a seguir:</p><blockquote class="kg-blockquote-alt"><em>npx create-next-app pokedex</em></blockquote><p>Responda aos questionamentos que surgir&#xE3;o de acordo com as configura&#xE7;&#xF5;es que voc&#xEA; deseja para a sua aplica&#xE7;&#xE3;o e, ao concluir todos os passos, inicialize um terminal no diret&#xF3;rio raiz da sua aplica&#xE7;&#xE3;o. Caso tenha dado tudo certo, a seguinte p&#xE1;gina ficar&#xE1; disponibilizada no endpoint fornecido no terminal:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdd9jX312Lg7X3vcUMphWuC0PGLnr1aG-gMLeUA3KGngmm8Ib8FZ8__g5-7CfQerNCZ5GL2KmlKFfJENLvYxhcZ-fL-YvSZf5rH6gzg-8HWSEpCKGVjczcRABq_lEyiKd0Bc-v0zXgxbkvsucWXf07Ppsj4?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 1 - Aplica&#xE7;&#xE3;o em execu&#xE7;&#xE3;o</em></figcaption></figure><p>Ap&#xF3;s isso, l&#xE1; no GitHub, iremos criar um reposit&#xF3;rio que ir&#xE1; armazenar o projeto que temos. Na p&#xE1;gina inicial do Github, clique no bot&#xE3;o &#x201C;new&#x201D;. Ap&#xF3;s isso, preencha os dados necess&#xE1;rios (propriet&#xE1;rio, nome do reposit&#xF3;rio e descri&#xE7;&#xE3;o), mantenha o reposit&#xF3;rio como p&#xFA;blico e, por fim, clique em &#x201C;Criar reposit&#xF3;rio&#x201D;.</p><p>Feitas todas estas configura&#xE7;&#xF5;es no Github, voc&#xEA; deve executar, em um terminal inicializado no diret&#xF3;rio raiz do seu projeto, os comandos a seguir, com o intuito de realizar o &#x201C;push&#x201D; de sua aplica&#xE7;&#xE3;o para o GitHub:</p><blockquote class="kg-blockquote-alt"><em>git add .</em><br><em>git add README.md</em><br><em>git commit -m &quot;first commit&quot;</em><br><em>git branch -M main</em><br><em>git remote add origin git@github.com {usu&#xE1;rio}/{projeto}.git</em><br><em>git push -u origin main</em></blockquote><p>OBS - Substitua &#x201C;{usu&#xE1;rio}&#x201D; por seu nome de usu&#xE1;rio existente l&#xE1; no Github. Fa&#xE7;a o mesmo para &#x201C;{projeto}&#x201D;, inserindo o nome exato que voc&#xEA; deu ao projeto no ato de cria&#xE7;&#xE3;o.</p><p>Uma vez com seu projeto devidamente atualizado e armazenado no Github, podemos ir para o Vercel.</p><h2 id="configurando-o-vercel">Configurando o Vercel</h2><p>No painel principal da Vercel (depois de estar devidamente logado), voc&#xEA; deve seguir os seguintes passos:</p><p>1. Clique no bot&#xE3;o &#x201C;Add New&#x2026;&#x201C;. Surgir&#xE3;o diversas op&#xE7;&#xF5;es, mas, voc&#xEA; deve escolher a op&#xE7;&#xE3;o Project. Voc&#xEA; ser&#xE1; direcionado para uma nova p&#xE1;gina, onde poder&#xE1; configurar qual das suas contas do Github, caso tenha mais de uma, est&#xE1; localizado o projeto.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe7JOz6diDpB_MgQCeYZZlvCGoMkk-YxD6tc4t5pOshIvj9pE9LdCZqkK6qY3zD7isB1FPGPONinLkfzP9sXqNOYzLWmJHHQk0CrFVrmHryseSV5ecQkBRrz7Zd3e-xgApuTMpE9MbeYJ1p5evwy0eiZ7-6?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 2 - Bot&#xE3;o &#x201C;Add New&#x2026;&#x201D;</em></figcaption></figure><p>2. Abaixo de Import Git Repository, garanta que &#xE9; o usu&#xE1;rio certo que est&#xE1; conectado e, caso n&#xE3;o seja, realize a mudan&#xE7;a em &#x201C;Add Github Account&#x201D;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfX927Nl0xDRNGoWA63gV2ONdvNqrSKoqMwUfLSPyYCq2TIgMOrbHmH_J9-UWrMzktlga8kJsEUcpjzadgWQvH7z7o1Fn1cKRQwV5TxJyf7U7LjOKSJn1T-oK7KwXoFWp9fwyPaPU3g1o4XcnNZvDlokbxG?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 3 - Op&#xE7;&#xE3;o de &#x201C;Add Github Account&#x201D;, para o caso de n&#xE3;o possuir uma conta Github cadastrada</em></figcaption></figure><p>OBS - O exemplo que escolhemos fazer utiliza a integra&#xE7;&#xE3;o entre o Vercel e o GitHub, mas voc&#xEA; tamb&#xE9;m pode utilizar o GitLab ou Bitbucket tranquilamente, sem extremas mudan&#xE7;as.</p><p>3. Procure o projeto pelo nome que voc&#xEA; deu a ele no ato de cria&#xE7;&#xE3;o do mesmo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcHd8gozz_kikVwJZhB6c8MehFDKMoQVJzlu0rO9ncVWyut46uLQK3fJzNSAQndnjtmOOR_5_d8BCoHM7TokAcb7j_R7ERzoU9J4pn-IdlBKJAfbWDPkNjBn2brgmEWZd3qgf38p44vrorQbxezlHQM4Mq9?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 4 - Buscando pelo reposit&#xF3;rio na conta Github vinculada</em></figcaption></figure><p>4. Ap&#xF3;s conectar o reposit&#xF3;rio, a Vercel detecta automaticamente o tipo de projeto. No caso de um projeto Next.js, ele ser&#xE1; identificado como um projeto Node.js, como podemos ver na figura 4.</p><p>5. Ap&#xF3;s encontrar o seu reposit&#xF3;rio, clique em &#x201C;Import&#x201D;.</p><p>6. Escolha um nome para seu projeto na Vercel. Este nome ser&#xE1; usado na URL da aplica&#xE7;&#xE3;o.</p><p>7. Configure as op&#xE7;&#xF5;es de implanta&#xE7;&#xE3;o, como a branch a ser implantada e o diret&#xF3;rio onde o projeto est&#xE1; localizado.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcY26VVoZnMvc7NWL6a45vA33fC7mJu4mQkoN-kwBiTYX69ijqRGRWk9CCOX8yvJJGL_444tq2dWxYd89vG05Sj9RjHzd91SArxUulukHLw_5WLMFWUK6SI1ImEAfui3kp_rViDqjUt7ARJJeNEL0KVSPU?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 5 - Configurando o Projeto no Vercel</em></figcaption></figure><p>8. Este tamb&#xE9;m &#xE9; o momento de criar vari&#xE1;veis de ambiente, caso seja necess&#xE1;rio. Vari&#xE1;veis de ambiente s&#xE3;o valores que s&#xE3;o confidenciais demais para estarem soltos dentro do c&#xF3;digo que n&#xF3;s estamos desenvolvendo. Essas vari&#xE1;veis s&#xE3;o usadas para armazenar informa&#xE7;&#xF5;es tempor&#xE1;rias ou configura&#xE7;&#xF5;es que podem ser acessadas pelo sistema operacional ou por aplicativos em execu&#xE7;&#xE3;o. S&#xE3;o comumente utilizadas para guardar dados de conex&#xE3;o com a devida seguran&#xE7;a, como usu&#xE1;rio e senha de um banco de dados, ou a porta que o mesmo funciona, etc. Como elas n&#xE3;o v&#xE3;o para reposit&#xF3;rios p&#xFA;blicos (para n&#xE3;o vazar informa&#xE7;&#xF5;es confidenciais), precisamos cri&#xE1;-las no Vercel.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXch6CqiF00MKDLENr24eGp9tsffpObhxslIV852E3KzSCylkoWtkHWFN2xOg7ZuNgqn6pfC8k3xxfmWJm90_AlDzbDY3DDqBOYX-lDLKB4xfYKAoKnlLXEqIXVyi6SMfNPFl6IDRmbRITpj5TJ3rlJfTI0N?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 6 - Criando vari&#xE1;veis de ambiente no projeto Vercel</em></figcaption></figure><p>OBS - Caso seja necess&#xE1;rio criar vari&#xE1;veis de ambiente que funcionam no lado cliente, voc&#xEA; pode cri&#xE1;-las com o prefixo &#x201C;NEXT_PUBLIC_&#x201D; junto ao nome da vari&#xE1;vel, al&#xE9;m de realizar estas cria&#xE7;&#xF5;es dentro de um arquivo env.local, no diret&#xF3;rio raiz do projeto.</p><p>9. Por fim, e n&#xE3;o menos importante, clique em <strong>Deploy</strong> e aguarde o prazo para que este seja conclu&#xED;do.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe9uaL3frsFUlcUhpjQtQprSgx-hF1rGguHZx-XUJR9o0hOLPRHWFgQoOETJHFwBct4mRWOvyx4YSApL8bLlA71cCRvfZLVAWYV7MyJCgMzC7WnflHEnH6bdaQkbnAuBgj5GTCIS3KUqpzwC3jnxpTz3Wgc?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 7 - Aguardando a conclus&#xE3;o do Deploy do projeto</em></figcaption></figure><p>A Vercel iniciar&#xE1; o processo de implanta&#xE7;&#xE3;o, e voc&#xEA; poder&#xE1; acompanhar o progresso diretamente no painel. Ap&#xF3;s a conclus&#xE3;o bem-sucedida da implanta&#xE7;&#xE3;o, a Vercel fornecer&#xE1; um URL p&#xFA;blico onde sua aplica&#xE7;&#xE3;o estar&#xE1; acess&#xED;vel na web. Voc&#xEA; pode acessar esse URL para verificar o funcionamento de sua aplica&#xE7;&#xE3;o.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeMp1c8DNC8F79kD7UtVw9xdGclqggfxLnS13aj5-kpHkdebAhZXiUudNfmWCmDrb7CL2XUgQHmzuSURqEGnAnVD5IA6pluyrJbwrb1Z7F0r2euWZJ2izkEoSJRLI042ieTQfvjOtR_VrWdTlPRmCmvv9WQ?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 8 - Conclus&#xE3;o do Deploy no Vercel</em></figcaption></figure><p>A partir do painel da Vercel, voc&#xEA; pode gerenciar seu projeto, configurar dom&#xED;nios personalizados, definir vari&#xE1;veis de ambiente e muito mais.</p><p>E, por fim, se voc&#xEA; quiser atualizar o seu projeto, basta atualizar a sua vers&#xE3;o armazenada no reposit&#xF3;rio Github que voc&#xEA; realizou a integra&#xE7;&#xE3;o no Vercel, que automaticamente, depois de alguns minutos, sua vers&#xE3;o em deploy tamb&#xE9;m ser&#xE1; atualizada!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdlISQee8iWjFCXUHhhFZn3EoZ9oKtggVxjXzDtrexWYniSzLFVhZO2fdggrbviLoqR31bFJfClclFt77D0y3xU-7hVe2aKW7K8JL1co8vjJOqGvfCvKbBYnN7axfB0_M-USEWS_RieEFlSLuJOybgD9FY8?key=MW1lnMImTo2txJ7Gx553mA" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy"><figcaption><em>Figura 9 - Painel de administra&#xE7;&#xE3;o do projeto criado no Vercel</em></figcaption></figure><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--9.png" class="kg-image" alt="Deploy de um Projeto React com Next.js no Vercel (Via Site)" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--9.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--9.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="considera%C3%A7%C3%B5es-finais">Considera&#xE7;&#xF5;es finais</h2><p>Realizar o deploy de um projeto React com Next.js no Vercel diretamente pelo site da plataforma &#xE9; um processo simplificado e eficaz. A Vercel oferece uma plataforma s&#xF3;lida para hospedar aplicativos front-end, e a integra&#xE7;&#xE3;o com o Next.js &#xE9; suave e intuitiva. Lembre-se de que, ao implantar em um ambiente de produ&#xE7;&#xE3;o, &#xE9; fundamental garantir que seu c&#xF3;digo esteja otimizado, configurar vari&#xE1;veis de ambiente apropriadas e considerar a escalabilidade de sua aplica&#xE7;&#xE3;o.</p><p>Desejamos que aproveitem ao m&#xE1;ximo as poderosas ferramentas e recursos oferecidos por essas tecnologias para criar aplicativos web incr&#xED;veis e compartilh&#xE1;-los com o mundo, inclusive conosco. Ap&#xF3;s ler este artigo, voc&#xEA; est&#xE1; pronto para implantar seu projeto Next.js na Vercel atrav&#xE9;s do site da plataforma, simplificando o processo e compartilhando suas cria&#xE7;&#xF5;es com efici&#xEA;ncia. </p><p>Pratique, replique e ensine, pois n&#xE3;o h&#xE1; forma melhor de fixar um conhecimento adquirido!Se voc&#xEA; achou esse artigo interessante, gostaria de tirar quaisquer d&#xFA;vidas ou somente est&#xE1; a fim de trocar uma ideia sobre esses e mais assuntos, voc&#xEA; tamb&#xE9;m pode entrar em contato comigo, seja por meio do e-mail <a href="mailto:bruno.cabral.silva2018@gmail.com">bruno.cabral.silva2018@gmail.com</a> ou pelo meu perfil do <a href="https://www.linkedin.com/in/brunocabralsilva">LinkedIn</a>!</p><p>Te espero ansiosamente!</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Threat Intelligence]]></title><description><![CDATA[<p></p><p>Threat Intelligence &#xE9; o conhecimento que possibilita a preven&#xE7;&#xE3;o e a redu&#xE7;&#xE3;o de&#x202F;ataques cibern&#xE9;ticos. &#xC9; um processo de coleta, an&#xE1;lise e dissemina&#xE7;&#xE3;o de informa&#xE7;&#xF5;es sobre amea&#xE7;as cibern&#xE9;ticas. Essas</p>]]></description><link>https://community.revelo.com.br/desenvolvimento-de-um-sistema-de-estacionamento-inteligente-utilizando-sensores-iot-para-indicar-disponibilidade-de-vagas-2/</link><guid isPermaLink="false">671c09597a5ec80001aa3f48</guid><category><![CDATA[Cibersegurança]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Angela Talyta Gomes Silva]]></dc:creator><pubDate>Mon, 04 Nov 2024 17:41:24 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Threat-Intelligence.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/11/-----BLOG-COMMUNITY-BR---Threat-Intelligence.png" alt="Threat Intelligence"><p></p><p>Threat Intelligence &#xE9; o conhecimento que possibilita a preven&#xE7;&#xE3;o e a redu&#xE7;&#xE3;o de&#x202F;ataques cibern&#xE9;ticos. &#xC9; um processo de coleta, an&#xE1;lise e dissemina&#xE7;&#xE3;o de informa&#xE7;&#xF5;es sobre amea&#xE7;as cibern&#xE9;ticas. Essas informa&#xE7;&#xF5;es podem ser usadas para proteger organiza&#xE7;&#xF5;es de ataques, melhorar a resposta a incidentes e tomar decis&#xF5;es informadas sobre seguran&#xE7;a cibern&#xE9;tica.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--9.png" class="kg-image" alt="Threat Intelligence" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--4--9.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--9.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Cyber Threat Intelligence &#xE9; uma ferramenta valiosa para organiza&#xE7;&#xF5;es de todos os tamanhos. Ela pode ajudar a proteger as organiza&#xE7;&#xF5;es contra uma variedade de amea&#xE7;as, incluindo:</p><ul><li><strong><strong><strong>Ataques de ransomware</strong></strong></strong></li></ul><p>Os ataques de ransomware s&#xE3;o um tipo de ataque cibern&#xE9;tico em que os invasores criptografam os dados de uma v&#xED;tima e exigem um resgate para descriptograf&#xE1;-los. Os ataques de ransomware est&#xE3;o se tornando cada vez mais comuns e sofisticados, e podem ter um impacto devastador nas organiza&#xE7;&#xF5;es.</p><blockquote><strong>As organiza&#xE7;&#xF5;es que s&#xE3;o v&#xED;timas de ataques de ransomware podem sofrer uma s&#xE9;rie de danos, incluindo:</strong></blockquote><p><strong>Perda de dados</strong>: Os dados criptografados podem ser irrepar&#xE1;veis, o que pode levar &#xE0; perda de dados valiosos, como informa&#xE7;&#xF5;es de clientes, registros financeiros e segredos comerciais.</p><p><strong>Interrup&#xE7;&#xE3;o dos neg&#xF3;cios</strong>: Os ataques de ransomware podem interromper as opera&#xE7;&#xF5;es de neg&#xF3;cios, o que pode levar a perda de receita e danos &#xE0; reputa&#xE7;&#xE3;o.</p><p><strong>Custos de recupera&#xE7;&#xE3;o</strong>: As organiza&#xE7;&#xF5;es podem precisar gastar dinheiro para recuperar seus dados e restaurar suas opera&#xE7;&#xF5;es, o que pode ser caro e demorado.</p><ul><li><strong><strong><strong>Ataques de phishing</strong></strong></strong></li></ul><p>Os ataques de phishing s&#xE3;o um tipo de ataque cibern&#xE9;tico em que os invasores se passam por uma fonte confi&#xE1;vel, como uma empresa ou uma organiza&#xE7;&#xE3;o, para enganar as v&#xED;timas a fornecer informa&#xE7;&#xF5;es pessoais ou clicar em um link malicioso. Os ataques de phishing s&#xE3;o uma das formas mais comuns de ataques cibern&#xE9;ticos e podem ter um impacto devastador nas v&#xED;timas.</p><blockquote><strong>As v&#xED;timas de ataques de phishing podem sofrer uma s&#xE9;rie de danos, incluindo:</strong></blockquote><p><strong>Roubo de identidade</strong>: Os invasores podem usar as informa&#xE7;&#xF5;es pessoais da v&#xED;tima para abrir contas em seu nome, fazer compras online ou obter empr&#xE9;stimos.</p><p><strong>Perda financeira</strong>: Os invasores podem usar as informa&#xE7;&#xF5;es financeiras da v&#xED;tima para fazer compras online ou sacar dinheiro de suas contas.</p><p><strong>Infec&#xE7;&#xE3;o por malware</strong>: O malware instalado no dispositivo da v&#xED;tima pode roubar dados, danificar os sistemas ou at&#xE9; mesmo controlar o dispositivo remotamente.</p><ul><li><strong><strong><strong>Ataques de malware</strong></strong></strong></li></ul><p>Os ataques de malware s&#xE3;o um tipo de ataque cibern&#xE9;tico em que os invasores usam software malicioso, ou malware, para causar danos a um sistema ou rede. O malware pode ser usado para roubar dados, danificar sistemas ou at&#xE9; mesmo controlar sistemas remotamente.</p><p><strong>Ataques de phishing</strong>: Os invasores enviam um e-mail ou mensagem de texto malicioso que, quando aberto, instala o malware no dispositivo da v&#xED;tima.</p><p><strong>Ataques de download</strong>: Os invasores tentam convencer a v&#xED;tima a baixar um arquivo malicioso, geralmente camuflado como um arquivo leg&#xED;timo.</p><p><strong>Ataques de explora&#xE7;&#xE3;o</strong>: Os invasores exploram vulnerabilidades de software para instalar o malware em um sistema.</p><p><strong>Inje&#xE7;&#xE3;o de c&#xF3;digo</strong>: Os invasores injetam c&#xF3;digo malicioso em um sistema ou rede.</p><p><strong>Ataques de dia zero</strong>: Os invasores usam vulnerabilidades de software que ainda n&#xE3;o foram corrigidas.</p><ul><li><strong><strong><strong>Ataques de nega&#xE7;&#xE3;o de servi&#xE7;o (DoS)</strong></strong></strong></li></ul><p>Um ataque de nega&#xE7;&#xE3;o de servi&#xE7;o (DoS) &#xE9; um tipo de ataque cibern&#xE9;tico em que os invasores inundam um sistema ou rede com tr&#xE1;fego malicioso, tornando-o inacess&#xED;vel aos usu&#xE1;rios leg&#xED;timos.</p><p><strong>Ataques de inunda&#xE7;&#xE3;o</strong>: Os invasores enviam uma grande quantidade de tr&#xE1;fego malicioso para um sistema ou rede, fazendo com que ele n&#xE3;o consiga lidar com a carga e fique indispon&#xED;vel.</p><p><strong>Ataques de reflex&#xE3;o</strong>: Os invasores usam um dispositivo comprometido para enviar tr&#xE1;fego malicioso para um sistema ou rede, fazendo com que o dispositivo comprometido pare&#xE7;a ser a fonte do ataque.</p><p><strong>Ataques de fragmenta&#xE7;&#xE3;o</strong>: Os invasores enviam pacotes de dados fragmentados para um sistema ou rede, fazendo com que o sistema ou rede n&#xE3;o consiga mont&#xE1;-los corretamente.</p><ul><li><strong><strong><strong>Ataques de roubo de dados</strong></strong></strong></li></ul><p>Os ataques de roubo de dados s&#xE3;o um tipo de ataque cibern&#xE9;tico em que os invasores roubam dados confidenciais de uma organiza&#xE7;&#xE3;o ou indiv&#xED;duo. Os dados roubados podem ser usados para fins diversos, como fraude, chantagem ou espionagem.</p><p><strong>Ataques de engenharia social</strong>: Os invasores usam t&#xE9;cnicas de engenharia social para enganar a v&#xED;tima a fornecer dados confidenciais.</p><p><strong>Ataques de for&#xE7;a bruta</strong>: Os invasores usam software para tentar adivinhar as senhas da v&#xED;tima.</p><p><strong>Ataques de sequestro de dados</strong>: Os invasores sequestram os dados da v&#xED;tima e exigem um resgate para devolv&#xEA;-los.</p><p>Threat Intelligence pode ser usada para identificar novas amea&#xE7;as por meio da coleta de informa&#xE7;&#xF5;es de uma variedade de fontes, como:</p><ul><li><strong><strong><strong>Relat&#xF3;rios de seguran&#xE7;a;</strong></strong></strong></li><li><strong><strong><strong>An&#xE1;lises de seguran&#xE7;a;</strong></strong></strong></li><li><strong><strong><strong>Not&#xED;cias e m&#xED;dias sociais;</strong></strong></strong></li><li><strong><strong><strong>Informa&#xE7;&#xF5;es de intelig&#xEA;ncia.</strong></strong></strong></li></ul><p>&#xC9; usada para analisar tend&#xEA;ncias de amea&#xE7;as por meio da identifica&#xE7;&#xE3;o de padr&#xF5;es em dados de seguran&#xE7;a. Esses padr&#xF5;es podem ser usados para identificar amea&#xE7;as emergentes e para prever ataques futuros.</p><h2 id="etapas-threat-intelligence">Etapas Threat Intelligence</h2><p><strong>1 - Coleta de dados: </strong>A coleta de dados &#xE9; a primeira etapa do processo de intelig&#xEA;ncia de amea&#xE7;as. Nesta etapa, a organiza&#xE7;&#xE3;o coleta informa&#xE7;&#xF5;es de uma variedade de fontes, incluindo:</p><ul><li><strong>Relat&#xF3;rios de seguran&#xE7;a</strong>: Esses relat&#xF3;rios s&#xE3;o publicados por organiza&#xE7;&#xF5;es de seguran&#xE7;a cibern&#xE9;tica, como o SANS Institute e o MITRE Corporation. Eles fornecem informa&#xE7;&#xF5;es sobre novas amea&#xE7;as, tend&#xEA;ncias de amea&#xE7;as e t&#xE9;cnicas de ataque.</li><li><strong>An&#xE1;lises de seguran&#xE7;a:</strong> Essas an&#xE1;lises s&#xE3;o realizadas por organiza&#xE7;&#xF5;es de seguran&#xE7;a cibern&#xE9;tica e consultores de seguran&#xE7;a. Eles fornecem informa&#xE7;&#xF5;es mais detalhadas sobre amea&#xE7;as espec&#xED;ficas.</li><li><strong>Not&#xED;cias e m&#xED;dias sociais:</strong> As not&#xED;cias e a m&#xED;dia social podem ser fontes valiosas de informa&#xE7;&#xF5;es sobre amea&#xE7;as cibern&#xE9;ticas.</li><li><strong>Informa&#xE7;&#xF5;es de intelig&#xEA;ncia:</strong> As informa&#xE7;&#xF5;es de intelig&#xEA;ncia podem ser obtidas de ag&#xEA;ncias governamentais e outras fontes. Elas fornecem informa&#xE7;&#xF5;es sobre amea&#xE7;as emergentes e amea&#xE7;as que est&#xE3;o sendo direcionadas a organiza&#xE7;&#xF5;es espec&#xED;ficas.<br></li></ul><p><strong>2 - An&#xE1;lise dos dados coletados:</strong> Nesta etapa, a organiza&#xE7;&#xE3;o analisa os dados coletados para identificar amea&#xE7;as e tend&#xEA;ncias de amea&#xE7;as.</p><p>O processo de an&#xE1;lise de dados pode ser dividido em v&#xE1;rias etapas:</p><ul><li><strong>Filtragem</strong>: Os dados coletados s&#xE3;o filtrados para remover informa&#xE7;&#xF5;es irrelevantes.</li><li><strong>Filtragem baseada em regras</strong>: Este m&#xE9;todo usa regras predefinidas para determinar se um dado deve ser mantido ou removido. As regras podem ser baseadas em crit&#xE9;rios como o tipo de dados, o valor dos dados ou a fonte dos dados.</li><li><strong>Filtragem baseada em aprendizado de m&#xE1;quina</strong>: Este m&#xE9;todo usa algoritmos de aprendizado de m&#xE1;quina para aprender padr&#xF5;es nos dados e usar esses padr&#xF5;es para identificar informa&#xE7;&#xF5;es relevantes.</li><li><strong>Filtragem baseada em Intelig&#xEA;ncia Artificial</strong>: Este m&#xE9;todo usa t&#xE9;cnicas de intelig&#xEA;ncia artificial, como aprendizado de m&#xE1;quina e processamento de linguagem natural, para identificar informa&#xE7;&#xF5;es relevantes.</li><li><strong>Normaliza&#xE7;&#xE3;o</strong>: Os dados s&#xE3;o normalizados para facilitar a an&#xE1;lise.</li><li><strong>Padroniza&#xE7;&#xE3;o de formatos</strong>: Este m&#xE9;todo usa um formato comum para representar os dados. Isso pode ajudar a garantir que os dados possam ser lidos e interpretados por diferentes sistemas.</li><li><strong>Padroniza&#xE7;&#xE3;o de nomes</strong>: Este m&#xE9;todo usa um nome comum para representar as mesmas informa&#xE7;&#xF5;es. Isso pode ajudar a garantir que os dados possam ser facilmente localizados e identificados.</li><li><strong>Padroniza&#xE7;&#xE3;o de valores</strong>: Este m&#xE9;todo usa um valor comum para representar a mesma informa&#xE7;&#xE3;o. Isso pode ajudar a garantir que os dados possam ser comparados de forma eficaz.</li><li><strong>An&#xE1;lise</strong>: Os dados s&#xE3;o analisados para identificar padr&#xF5;es e tend&#xEA;ncias.</li><li><strong>An&#xE1;lise estat&#xED;stica</strong>: Este m&#xE9;todo usa m&#xE9;todos estat&#xED;sticos para identificar tend&#xEA;ncias e padr&#xF5;es nos dados.</li><li><strong>An&#xE1;lise de texto</strong>: Este m&#xE9;todo usa t&#xE9;cnicas de processamento de linguagem natural para identificar tend&#xEA;ncias e padr&#xF5;es nos dados de texto.</li><li><strong>An&#xE1;lise de rede</strong>: Este m&#xE9;todo usa t&#xE9;cnicas de an&#xE1;lise de rede para identificar relacionamentos entre os dados.</li><li><strong>Seguran&#xE7;a</strong>: Os dados s&#xE3;o analisados para identificar vulnerabilidades de seguran&#xE7;a.</li><li><strong>Usar senhas fortes e exclusivas</strong>: As senhas s&#xE3;o a primeira linha de defesa contra ataques cibern&#xE9;ticos. &#xC9; importante usar senhas fortes e exclusivas para todos os sistemas e contas.</li><li><strong>Manter os sistemas atualizados</strong>: As atualiza&#xE7;&#xF5;es de software geralmente incluem corre&#xE7;&#xF5;es de seguran&#xE7;a que podem ajudar a proteger contra ataques cibern&#xE9;ticos. &#xC9; importante manter todos os sistemas atualizados com as &#xFA;ltimas atualiza&#xE7;&#xF5;es de seguran&#xE7;a.</li><li><strong>Usar software antiv&#xED;rus e anti-malware</strong>: O software antiv&#xED;rus e anti-malware pode ajudar a proteger contra uma variedade de amea&#xE7;as cibern&#xE9;ticas, incluindo v&#xED;rus, malware e ransomware.</li><li><strong>Implementar medidas de seguran&#xE7;a de rede</strong>: As medidas de seguran&#xE7;a de rede, como firewalls e intrusion detection systems (IDSs), podem ajudar a proteger contra ataques cibern&#xE9;ticos de entrada e sa&#xED;da.</li><li><strong>Educar os funcion&#xE1;rios sobre seguran&#xE7;a cibern&#xE9;tica</strong>: Os funcion&#xE1;rios s&#xE3;o muitas vezes o elo mais fraco na seguran&#xE7;a cibern&#xE9;tica. &#xC9; importante educar os funcion&#xE1;rios sobre as amea&#xE7;as cibern&#xE9;ticas e como se proteger.<br></li></ul><p><strong>3 - Dissemina&#xE7;&#xE3;o de informa&#xE7;&#xF5;es</strong>: A terceira etapa &#xE9; a dissemina&#xE7;&#xE3;o das informa&#xE7;&#xF5;es analisadas. Essas informa&#xE7;&#xF5;es podem ser compartilhadas com uma variedade de partes interessadas, incluindo:</p><ul><li><strong>Equipes de seguran&#xE7;a cibern&#xE9;tica</strong>: Essas equipes s&#xE3;o respons&#xE1;veis por proteger a organiza&#xE7;&#xE3;o de ataques.</li><li><strong>Executivos:</strong> esses executivos tomam decis&#xF5;es sobre a seguran&#xE7;a cibern&#xE9;tica da organiza&#xE7;&#xE3;o.</li><li><strong>Funcion&#xE1;rios</strong>: esses funcion&#xE1;rios s&#xE3;o respons&#xE1;veis por ajudar a proteger a organiza&#xE7;&#xE3;o de ataques.<br></li></ul><h3 id="formas-espec%C3%ADficas-de-dissemina%C3%A7%C3%A3o-de-informa%C3%A7%C3%B5es">Formas espec&#xED;ficas de dissemina&#xE7;&#xE3;o de informa&#xE7;&#xF5;es</h3><ul><li><strong>Relat&#xF3;rios de intelig&#xEA;ncia de amea&#xE7;as</strong>: esses relat&#xF3;rios fornecem uma vis&#xE3;o geral das amea&#xE7;as cibern&#xE9;ticas atuais e emergentes.</li><li><strong>Alertas de seguran&#xE7;a</strong>: esses alertas fornecem informa&#xE7;&#xF5;es sobre amea&#xE7;as espec&#xED;ficas ou eventos de seguran&#xE7;a.</li><li><strong>Treinamentos de seguran&#xE7;a</strong>: esses treinamentos ajudam as pessoas a identificar e evitar amea&#xE7;as cibern&#xE9;ticas.</li></ul><p>A dissemina&#xE7;&#xE3;o de informa&#xE7;&#xF5;es pode ajudar as equipes de seguran&#xE7;a cibern&#xE9;tica a identificar e responder a ataques.</p><p>Ajudar os executivos a tomar decis&#xF5;es adequadas sobre a seguran&#xE7;a cibern&#xE9;tica.<br></p><p><strong>4 - A&#xE7;&#xE3;o</strong>: Etapa em que a organiza&#xE7;&#xE3;o toma medidas para proteger a organiza&#xE7;&#xE3;o de ataques com base nas informa&#xE7;&#xF5;es compartilhadas na etapa anterior.</p><p>As medidas que as organiza&#xE7;&#xF5;es podem tomar incluem:</p><ul><li><strong>Implementa&#xE7;&#xE3;o de corre&#xE7;&#xF5;es de seguran&#xE7;a</strong>: as corre&#xE7;&#xF5;es de seguran&#xE7;a podem ajudar a fechar as vulnerabilidades que os cibercriminosos podem explorar.</li><li><strong>Treinamento de funcion&#xE1;rios</strong>: o treinamento de funcion&#xE1;rios pode ajudar os funcion&#xE1;rios a identificar e evitar amea&#xE7;as cibern&#xE9;ticas.</li><li><strong>Melhoria dos controles de seguran&#xE7;a</strong>: os controles de seguran&#xE7;a podem ajudar a proteger a organiza&#xE7;&#xE3;o de ataques.</li></ul><p>A organiza&#xE7;&#xE3;o deve desenvolver um plano de a&#xE7;&#xE3;o eficaz que garanta que as medidas sejam tomadas de forma oportuna e eficaz.</p><p>Uma organiza&#xE7;&#xE3;o pode implementar uma corre&#xE7;&#xE3;o de seguran&#xE7;a para fechar uma vulnerabilidade que foi identificada por meio da intelig&#xEA;ncia de amea&#xE7;as. Essa corre&#xE7;&#xE3;o pode ajudar a proteger a organiza&#xE7;&#xE3;o de ataques de malware que exploram essa vulnerabilidade.</p><p>Treinar seus funcion&#xE1;rios sobre como identificar e evitar ataques de phishing. Esse treinamento pode ajudar a proteger a organiza&#xE7;&#xE3;o de ataques de phishing que usam t&#xE9;cnicas de engenharia social para enganar os funcion&#xE1;rios.</p><p>Melhorar seus controles de seguran&#xE7;a para dificultar que os cibercriminosos acessem seus sistemas e dados. Essas melhorias podem ajudar a proteger a organiza&#xE7;&#xE3;o de ataques de ransomware que visam criptografar seus dados e exigir resgate.</p><p>A organiza&#xE7;&#xE3;o deve revisar e atualizar seu plano de a&#xE7;&#xE3;o regularmente para garantir que ele seja eficaz contra as amea&#xE7;as mais recentes.</p><p>A <strong>Cyber Threat Intelligence</strong> oferece uma variedade de benef&#xED;cios para organiza&#xE7;&#xF5;es de todos os tamanhos. Esses benef&#xED;cios incluem:</p><ul><li><strong><strong><strong>Melhor prote&#xE7;&#xE3;o contra ataques</strong></strong></strong></li><li><strong>Monitorando fontes abertas</strong>: As organiza&#xE7;&#xF5;es podem monitorar fontes abertas, como not&#xED;cias, blogs e f&#xF3;runs, para identificar novas amea&#xE7;as cibern&#xE9;ticas. Isso pode ajudar as organiza&#xE7;&#xF5;es a se preparar para essas amea&#xE7;as e tomar medidas para mitig&#xE1;-las.</li><li><strong>Usando ferramentas de an&#xE1;lise de dados</strong>: As organiza&#xE7;&#xF5;es podem usar ferramentas de an&#xE1;lise de dados para identificar tend&#xEA;ncias e padr&#xF5;es em dados de amea&#xE7;as. Isso pode ajudar as organiza&#xE7;&#xF5;es a identificar vulnerabilidades e desenvolver estrat&#xE9;gias de mitiga&#xE7;&#xE3;o.</li><li><strong>Trabalhando com parceiros</strong>: As organiza&#xE7;&#xF5;es podem trabalhar com parceiros de Intelig&#xEA;ncia para obter acesso a informa&#xE7;&#xF5;es e insights sobre amea&#xE7;as cibern&#xE9;ticas. Isso pode ajudar as organiza&#xE7;&#xF5;es a manter-se atualizadas sobre as &#xFA;ltimas amea&#xE7;as e tecnologias.</li><li><strong><strong><strong>Maior efici&#xEA;ncia na resposta a incidentes</strong></strong></strong></li><li><strong>Comunica&#xE7;&#xE3;o</strong>: Ajudar a organizar e coordenar a comunica&#xE7;&#xE3;o entre as diferentes equipes envolvidas na resposta a incidentes. Isso pode ajudar a garantir que todos estejam na mesma p&#xE1;gina e trabalhando juntos para resolver o problema.</li><li><strong>Anal&#xED;tica</strong>: Usar ferramentas de an&#xE1;lise de dados para identificar tend&#xEA;ncias e padr&#xF5;es em dados de incidentes. Isso pode ajudar as organiza&#xE7;&#xF5;es a aprender com os erros e melhorar suas respostas futuras.</li><li><strong>Automatiza&#xE7;&#xE3;o</strong>: Usar automa&#xE7;&#xE3;o para automatizar tarefas rotineiras relacionadas &#xE0; resposta a incidentes. Isso pode ajudar as organiza&#xE7;&#xF5;es a economizar tempo e recursos.</li><li><strong><strong><strong>Melhor tomada de decis&#xF5;es sobre seguran&#xE7;a cibern&#xE9;tica</strong></strong></strong></li><li><strong>Fornecer insights</strong>: A TI pode fornecer insights sobre as amea&#xE7;as cibern&#xE9;ticas que as organiza&#xE7;&#xF5;es enfrentam. Isso pode ajudar as organiza&#xE7;&#xF5;es a priorizar seus esfor&#xE7;os de seguran&#xE7;a.</li><li><strong>Modelagem de risco</strong>: A TI pode usar modelos de risco para ajudar as organiza&#xE7;&#xF5;es a avaliar o risco de ataques cibern&#xE9;ticos. Isso pode ajudar as organiza&#xE7;&#xF5;es a tomar decis&#xF5;es mais informadas sobre como alocar seus recursos de seguran&#xE7;a.</li><li><strong>Simula&#xE7;&#xE3;o de ataques</strong>: A TI pode usar simula&#xE7;&#xF5;es de ataques para ajudar as organiza&#xE7;&#xF5;es a testar suas defesas cibern&#xE9;ticas. Isso pode ajudar as organiza&#xE7;&#xF5;es a identificar vulnerabilidades e melhorar sua capacidade de responder a ataques.</li></ul><h2 id="desafios-da-threat-intelligence">Desafios da Threat Intelligence</h2><ul><li><strong><strong><strong>Volume de dados</strong></strong>: </strong>O volume de dados de amea&#xE7;as cibern&#xE9;ticas est&#xE1; crescendo exponencialmente. Isso ocorre porque h&#xE1; mais dispositivos conectados &#xE0; internet, mais dados sendo gerados e mais ataques cibern&#xE9;ticos sendo executados.</li></ul><p>O volume crescente de dados de amea&#xE7;as cibern&#xE9;ticas representa um desafio para as organiza&#xE7;&#xF5;es. &#xC9; dif&#xED;cil para as organiza&#xE7;&#xF5;es coletar, armazenar e analisar grandes quantidades de dados. Isso pode levar a atrasos na identifica&#xE7;&#xE3;o de amea&#xE7;as cibern&#xE9;ticas e na implementa&#xE7;&#xE3;o de medidas de mitiga&#xE7;&#xE3;o.</p><ul><li><strong><strong><strong>Complexidade dos dados</strong></strong>: </strong>Os dados de amea&#xE7;as cibern&#xE9;ticas podem ser complexos e dif&#xED;ceis de entender. Isso ocorre porque os dados podem ser provenientes de uma variedade de fontes, incluindo fontes abertas, fontes privadas e fontes governamentais. Os dados tamb&#xE9;m podem estar em diferentes formatos e idiomas.</li></ul><p>A complexidade dos dados de amea&#xE7;as cibern&#xE9;ticas representa um desafio para as organiza&#xE7;&#xF5;es. &#xC9; dif&#xED;cil para as organiza&#xE7;&#xF5;es entender os dados e extrair insights &#xFA;teis. Isso pode levar a decis&#xF5;es de seguran&#xE7;a incorretas.<br></p><ul><li><strong><strong><strong>Custos</strong></strong>: </strong>A<strong> </strong>coleta, armazenamento, an&#xE1;lise e distribui&#xE7;&#xE3;o de Threat Intelligence podem ser caros. As organiza&#xE7;&#xF5;es precisam investir em ferramentas e recursos para coletar e analisar dados de amea&#xE7;as cibern&#xE9;ticas. Elas tamb&#xE9;m precisam investir em treinamento e conscientiza&#xE7;&#xE3;o para que os funcion&#xE1;rios possam entender e usar as informa&#xE7;&#xF5;es de Intelig&#xEA;ncia.</li></ul><p>Os custos associados &#xE0; Intelig&#xEA;ncia de amea&#xE7;as representam um desafio para as organiza&#xE7;&#xF5;es, especialmente para as pequenas empresas. As pequenas empresas podem n&#xE3;o ter recursos financeiros para investir.</p><p>Al&#xE9;m dos desafios j&#xE1; mencionados, como volume de dados, complexidade dos dados e custos, a Threat Intelligence tamb&#xE9;m pode enfrentar desafios como:</p><ul><li><strong>Desinforma&#xE7;&#xE3;o: </strong>A desinforma&#xE7;&#xE3;o sobre amea&#xE7;as cibern&#xE9;ticas pode dificultar a identifica&#xE7;&#xE3;o e a an&#xE1;lise de amea&#xE7;as.</li><li><strong>Falta de recursos</strong>: Organiza&#xE7;&#xF5;es com poucos recursos podem ter dificuldade para implementar e manter um processo de TI eficaz.</li><li><strong>Resist&#xEA;ncia &#xE0; mudan&#xE7;a</strong>: Funcion&#xE1;rios e executivos podem resistir &#xE0; mudan&#xE7;a, o que pode dificultar a implementa&#xE7;&#xE3;o de novas medidas de seguran&#xE7;a recomendadas pela TI.</li></ul><h2 id="threat-intelligence-e-privacidade">Threat Intelligence e Privacidade</h2><p>A Threat Intelligence pode coletar um grande volume de dados sobre usu&#xE1;rios e organiza&#xE7;&#xF5;es. &#xC9; importante que as organiza&#xE7;&#xF5;es implementem medidas de seguran&#xE7;a para proteger a privacidade desses dados.</p><p>TI pode ser usada para proteger a privacidade:</p><ul><li><strong><strong><strong>Identificar e responder a viola&#xE7;&#xF5;es de dados.</strong></strong></strong></li><li><strong><strong><strong>Desenvolver pol&#xED;ticas e procedimentos de privacidade.</strong></strong></strong></li><li><strong><strong><strong>Treinar funcion&#xE1;rios sobre seguran&#xE7;a e privacidade.</strong></strong></strong></li><li><strong><strong><strong>Publicar pol&#xED;ticas de privacidade claras e concisas.</strong></strong></strong></li><li><strong><strong><strong>Fornecer aos usu&#xE1;rios ferramentas para gerenciar suas informa&#xE7;&#xF5;es pessoais.</strong></strong></strong></li><li><strong><strong><strong>Notificar os usu&#xE1;rios sobre viola&#xE7;&#xF5;es de dados.</strong></strong></strong></li></ul><h2 id="threat-intelligence-e-%C3%A9tica">Threat Intelligence e &#xC9;tica</h2><p>Threat Intelligence pode ser usada para coletar e analisar informa&#xE7;&#xF5;es sobre indiv&#xED;duos e organiza&#xE7;&#xF5;es. &#xC9; importante que as organiza&#xE7;&#xF5;es usem de forma &#xE9;tica e respons&#xE1;vel.</p><p>Coletar apenas as informa&#xE7;&#xF5;es necess&#xE1;rias. N&#xE3;o coletar informa&#xE7;&#xF5;es pessoais que n&#xE3;o sejam necess&#xE1;rias para o prop&#xF3;sito pretendido.</p><p>Usar as informa&#xE7;&#xF5;es de forma respons&#xE1;vel. N&#xE3;o usar informa&#xE7;&#xF5;es pessoais para outros fins que n&#xE3;o aqueles para os quais foram coletadas.</p><p>Proteger as informa&#xE7;&#xF5;es. Implemente medidas de seguran&#xE7;a para proteger as informa&#xE7;&#xF5;es pessoais de acesso n&#xE3;o autorizado, uso indevido e divulga&#xE7;&#xE3;o.</p><p>Dar aos usu&#xE1;rios controle sobre suas informa&#xE7;&#xF5;es. Dar aos usu&#xE1;rios a op&#xE7;&#xE3;o de escolher quais informa&#xE7;&#xF5;es pessoais s&#xE3;o coletadas e como s&#xE3;o usadas.</p><p>A intelig&#xEA;ncia de amea&#xE7;as &#xE9; uma ferramenta essencial para as guerras modernas. Ela pode ser usada para uma variedade de prop&#xF3;sitos, incluindo:</p><ul><li><strong>Espionagem</strong>: Pode ser usada para coletar informa&#xE7;&#xF5;es sobre o inimigo, como suas for&#xE7;as, capacidades e planos.</li></ul><p>As ag&#xEA;ncias de intelig&#xEA;ncia podem usar TI para coletar informa&#xE7;&#xF5;es sobre o inimigo, como suas for&#xE7;as, capacidades e planos. Por exemplo, os EUA usaram TI para coletar informa&#xE7;&#xF5;es sobre os planos de guerra do Iraque antes da invas&#xE3;o de 2003.</p><ul><li><strong>Atividades de sabotagem</strong>: Pode ser usada para causar danos ou interromper as opera&#xE7;&#xF5;es do inimigo.</li></ul><p>Causar danos ou interromper as opera&#xE7;&#xF5;es do inimigo. Por exemplo, os EUA usaram TI para causar danos &#xE0; infraestrutura cr&#xED;tica da S&#xED;ria durante a guerra civil s&#xED;ria.</p><ul><li><strong>Opera&#xE7;&#xF5;es psicol&#xF3;gicas</strong>: Pode ser usada para manipular a opini&#xE3;o p&#xFA;blica ou espalhar desinforma&#xE7;&#xE3;o.</li></ul><p>Manipular a opini&#xE3;o p&#xFA;blica ou espalhar desinforma&#xE7;&#xE3;o. Por exemplo, a R&#xFA;ssia usou TI para interferir nas elei&#xE7;&#xF5;es presidenciais dos EUA em 2016.</p><p>As guerras modernas s&#xE3;o cada vez mais dependentes da tecnologia. As organiza&#xE7;&#xF5;es militares precisam estar preparadas para enfrentar ataques cibern&#xE9;ticos e para usar a TI para sua pr&#xF3;pria vantagem.</p><p>Algumas dicas para organiza&#xE7;&#xF5;es militares se protegerem do uso da TI para opera&#xE7;&#xF5;es psicol&#xF3;gicas:</p><ul><li><strong>Educar os funcion&#xE1;rios sobre as amea&#xE7;as cibern&#xE9;ticas e opera&#xE7;&#xF5;es psicol&#xF3;gicas.</strong></li><li><strong>Investir em seguran&#xE7;a cibern&#xE9;tica e treinamento de seguran&#xE7;a.</strong></li><li><strong>Monitorar as redes e sistemas para atividades suspeitas.</strong></li><li><strong>Compartilhar informa&#xE7;&#xF5;es sobre amea&#xE7;as cibern&#xE9;ticas e opera&#xE7;&#xF5;es psicol&#xF3;gicas com outras organiza&#xE7;&#xF5;es.</strong></li></ul><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--8.png" class="kg-image" alt="Threat Intelligence" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--1---1--8.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--8.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>A Threat Intelligence &#xE9; uma ferramenta poderosa que pode ser usada para uma variedade de prop&#xF3;sitos, tanto pac&#xED;ficos quanto militares. &#xC0; medida que o mundo se torna cada vez mais digitalizado, a import&#xE2;ncia da Intelig&#xEA;ncia s&#xF3; aumentar&#xE1;. As organiza&#xE7;&#xF5;es e indiv&#xED;duos precisam estar cientes da import&#xE2;ncia da TI e tomar medidas para se proteger.</p><p>Nos vemos na pr&#xF3;xima edi&#xE7;&#xE3;o!</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Desenvolvimento de um Sistema de Estacionamento Inteligente: Utilizando Sensores IoT para Indicar Disponibilidade de Vagas]]></title><description><![CDATA[<p></p><p>Em uma popula&#xE7;&#xE3;o cada vez mais urbana e com tr&#xE2;nsito intenso, a busca por vagas de estacionamento pode se tornar uma tarefa frustrante e demorada. Para abordar esse desafio, a tecnologia vem desempenhando um papel crucial na cria&#xE7;&#xE3;o de solu&#xE7;&#xF5;</p>]]></description><link>https://community.revelo.com.br/desenvolvimento-de-um-sistema-de-estacionamento-inteligente-utilizando-sensores-iot-para-indicar-disponibilidade-de-vagas/</link><guid isPermaLink="false">671ae8964a604c0001f9f976</guid><category><![CDATA[Desenvolvimento Ágil]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Community]]></dc:creator><pubDate>Tue, 29 Oct 2024 23:56:07 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Desenvolvimento--de-um-Sistema--de-Estacionamento-Inteligente_-Utilizando-Sensores-IoT-para-Indicar-Disponibilidade--de-Vagas.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Desenvolvimento--de-um-Sistema--de-Estacionamento-Inteligente_-Utilizando-Sensores-IoT-para-Indicar-Disponibilidade--de-Vagas.png" alt="Desenvolvimento de um Sistema de Estacionamento Inteligente: Utilizando Sensores IoT para Indicar Disponibilidade de Vagas"><p></p><p>Em uma popula&#xE7;&#xE3;o cada vez mais urbana e com tr&#xE2;nsito intenso, a busca por vagas de estacionamento pode se tornar uma tarefa frustrante e demorada. Para abordar esse desafio, a tecnologia vem desempenhando um papel crucial na cria&#xE7;&#xE3;o de solu&#xE7;&#xF5;es inovadoras. </p><p>Neste tutorial, iremos nos aprofundar no desenvolvimento de um Sistema de Estacionamento Inteligente, que utiliza sensores IoT (Internet das Coisas) para informar aos motoristas a disponibilidade de vagas de estacionamento em uma cidade movimentada. Esse sistema n&#xE3;o apenas otimiza a busca por estacionamento, mas tamb&#xE9;m contribui para a melhoria da mobilidade urbana e para uma experi&#xEA;ncia mais conveniente para os motoristas.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--7.png" class="kg-image" alt="Desenvolvimento de um Sistema de Estacionamento Inteligente: Utilizando Sensores IoT para Indicar Disponibilidade de Vagas" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--4--7.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--7.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="o-papel-do-raspberry-pi-e-sistemas-embarcados">O Papel do Raspberry Pi e Sistemas Embarcados</h2><p>O Raspberry Pi &#xE9; um exemplo not&#xE1;vel de um sistema embarcado que desempenha um papel central em projetos de IoT. O Raspberry Pi &#xE9; um computador de placa &#xFA;nica (SBC - Single Board Computer) que oferece poder de processamento, conectividade e interface de E/S em um pacote compacto. Ele &#xE9; amplamente utilizado em projetos de IoT devido &#xE0; sua acessibilidade, versatilidade e suporte &#xE0; programa&#xE7;&#xE3;o Python e outras linguagens. Al&#xE9;m do Raspberry Pi, existem outras op&#xE7;&#xF5;es de sistemas embarcados, como Arduino, ESP8266 e ESP32, que tamb&#xE9;m s&#xE3;o populares em projetos de IoT e sistemas de monitoramento.</p><p>Projetado para fins educacionais, prototipagem e aplica&#xE7;&#xF5;es de computa&#xE7;&#xE3;o de baixo custo, o Raspberry Pi oferece poder de processamento, capacidade de entrada e sa&#xED;da, e suporte &#xE0; execu&#xE7;&#xE3;o de sistemas operacionais completos, tornando-se uma plataforma vers&#xE1;til para uma ampla variedade de projetos, desde aprendizado de programa&#xE7;&#xE3;o at&#xE9; automa&#xE7;&#xE3;o residencial e Internet das Coisas (IoT).</p><h2 id="internet-das-coisas-iot">Internet das Coisas (IoT)</h2><p>A IoT refere-se &#xE0; interconex&#xE3;o de dispositivos f&#xED;sicos, ve&#xED;culos, edif&#xED;cios e outros objetos incorporados com sensores, software e conectividade para coleta e troca de dados. No contexto do Sistema de Estacionamento Inteligente, os sensores IoT desempenham um papel vital na coleta de dados em tempo real sobre a ocupa&#xE7;&#xE3;o das vagas de estacionamento. Esses dados s&#xE3;o ent&#xE3;o processados e transmitidos para uma interface de usu&#xE1;rio, permitindo que os motoristas acessem informa&#xE7;&#xF5;es precisas e atualizadas sobre a disponibilidade de vagas.</p><p>Ao utilizar o Raspberry Pi e sensores IoT, estamos criando uma rede de dispositivos inteligentes que se comunicam e interagem para fornecer informa&#xE7;&#xF5;es valiosas aos usu&#xE1;rios. Esse tipo de abordagem est&#xE1; na vanguarda da revolu&#xE7;&#xE3;o tecnol&#xF3;gica, tornando as cidades mais eficientes, sustent&#xE1;veis e orientadas a dados.</p><p>Neste tutorial, vamos explorar a integra&#xE7;&#xE3;o desses elementos para criar um Sistema de Estacionamento Inteligente funcional e eficaz. Desde a configura&#xE7;&#xE3;o dos sensores at&#xE9; o desenvolvimento da interface do usu&#xE1;rio e a intera&#xE7;&#xE3;o entre esses componentes, voc&#xEA; aprender&#xE1; como criar um sistema que oferece uma solu&#xE7;&#xE3;o pr&#xE1;tica para um problema urbano comum. A ado&#xE7;&#xE3;o dessas tecnologias pode transformar a forma como interagimos com nosso ambiente urbano, melhorando a qualidade de vida e promovendo um futuro mais conectado e inteligente.</p><h3 id="etapa-1-defini%C3%A7%C3%A3o-do-projeto-e-objetivos">Etapa 1: Defini&#xE7;&#xE3;o do Projeto e Objetivos</h3><p>O projeto tem como objetivo criar um sistema que:</p><p>- Utiliza sensores IoT para monitorar e coletar dados sobre a ocupa&#xE7;&#xE3;o das vagas de estacionamento.</p><p>- Fornecer aos motoristas informa&#xE7;&#xF5;es em tempo real sobre a disponibilidade de vagas.</p><p>- Contribui para a redu&#xE7;&#xE3;o do congestionamento e do tempo gasto na busca por estacionamento.</p><h3 id="etapa-2-escolha-dos-componentes-e-tecnologias">Etapa 2: Escolha dos Componentes e Tecnologias</h3><p>Os componentes e tecnologias necess&#xE1;rios incluem:</p><p>- Sensores de Detec&#xE7;&#xE3;o de Presen&#xE7;a: Utilizaremos sensores infravermelhos para detectar a presen&#xE7;a de ve&#xED;culos nas vagas.</p><p>- Placa Raspberry Pi: Escolhemos a Raspberry Pi para processar os dados dos sensores e enviar informa&#xE7;&#xF5;es para a interface do usu&#xE1;rio.</p><p>- Conex&#xE3;o &#xE0; Internet: A Raspberry Pi ser&#xE1; conectada &#xE0; internet para atualizar os dados em tempo real.</p><p>- Aplicativo Web: Iremos desenvolver uma interface web para os motoristas visualizarem as vagas dispon&#xED;veis.</p><h3 id="etapa-3-configura%C3%A7%C3%A3o-dos-sensores-e-raspberry-pi">Etapa 3: Configura&#xE7;&#xE3;o dos Sensores e Raspberry Pi</h3><p>1. Conecte os sensores de detec&#xE7;&#xE3;o de presen&#xE7;a &#xE0; Raspberry Pi conforme as instru&#xE7;&#xF5;es do fabricante.</p><p>2. Utilize o Raspbian OS na Raspberry Pi e instale as bibliotecas necess&#xE1;rias para os sensores.</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># Importando as bibliotecas necess&#xE1;rias</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">import RPi.GPIO as GPIO</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#c586c0;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">import</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">time</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Configurando</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">o</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">modo</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dos</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">pinos</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GPIO</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">setmode</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GPIO</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">BOARD</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Definindo</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">o</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">pino</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">do</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sensor</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sensor_pin</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> = 12</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Configurando</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">o</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">pino</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">do</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sensor</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">como</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">entrada</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GPIO</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">setup</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sensor_pin</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GPIO</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">IN</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Loop</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">de</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">leitura</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dos</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sensores</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">try</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">:</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">while</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">True</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">:</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">if</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GPIO</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">input</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sensor_pin</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">):</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">print</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;Vaga ocupada&quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">else</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">:</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">print</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;Vaga dispon&#xED;vel&quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">time</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">sleep</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(2)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">except</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">KeyboardInterrupt</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">:</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GPIO</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">cleanup</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">()</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="etapa-4-desenvolvimento-da-interface-web">Etapa 4: Desenvolvimento da Interface Web</h3><p>1. Crie um diret&#xF3;rio para o projeto e inicie um ambiente virtual Python.</p><p>2. Utilize Flask, um framework web em Python, para criar a interface. Crie rotas para a p&#xE1;gina inicial e para atualizar os dados de disponibilidade.</p><p>3. Utilize HTML, CSS e JavaScript para criar a interface de usu&#xE1;rio e exibir os dados das vagas dispon&#xED;veis.</p><p>Crie um diret&#xF3;rio chamado web interface e dentro dele crie um arquivo chamado app.py:</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">from</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">flask</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#c586c0;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">import</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Flask</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">render_template</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">jsonify</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">app</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> = </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Flask</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">__name__</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"># </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Dados</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">de</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">disponibilidade</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">iniciais</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> (</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">fict&#xED;cios</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados_disponibilidade</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> = [</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;{&quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">id</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;: 1, &quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">status</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;: &quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">disponivel</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;},</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;{&quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">id</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;: 2, &quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">status</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;: &quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ocupado</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;},</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;# </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Adicione</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">mais</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">de</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">disponibilidade</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">]</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">@</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">app</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">route</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;/&apos;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">def</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">index</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">():</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">return</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">render_template</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;index.html&apos;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados_disponibilidade</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">@</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">app</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">route</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;/atualizar_dados&apos;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">def</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">atualizar_dados</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">():</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;# </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Atualizar</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">de</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">disponibilidade</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> (</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">realize</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">a</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">l&#xF3;gica</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">aqui</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">for</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dado</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">in</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados_disponibilidade</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">:</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dado</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">[</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;status&apos;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">] = </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&quot;disponivel&quot;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0; # </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">L&#xF3;gica</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">fict&#xED;cia</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">para</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">atualizar</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">os</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">return</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">jsonify</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dados_disponibilidade</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">if</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">__name__</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> == </span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#ce9178;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&apos;__main__&apos;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">:</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">app</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">.</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">run</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">debug</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">=</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#9cdcfe;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">True</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;});</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;&#xA0;&#xA0;&#xA0;});</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">}</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><br></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#6a9955;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">// Inicia o processo de leitura e inser&#xE7;&#xE3;o dos dados dos PDFs na pasta &apos;pdfsDirectory&apos;</span></p><p dir="ltr" style="line-height:1.6285714285714286;text-align: justify;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#dcdcaa;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">readAllPDFsFromDirectory</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#4fc1ff;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">pdfsDirectory</span><span style="font-size:12pt;font-family:&apos;Times New Roman&apos;,serif;color:#cccccc;background-color:#1f1f1f;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">);</span></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="etapa-5-integra%C3%A7%C3%A3o-dos-dados">Etapa 5: Integra&#xE7;&#xE3;o dos Dados</h3><p>1. Desenvolva um script Python na Raspberry Pi para ler os dados dos sensores.</p><p>2. Envie os dados para a interface web atrav&#xE9;s de uma requisi&#xE7;&#xE3;o HTTP usando uma biblioteca como `requests`.</p><p>Crie um arquivo chamado script_sensor.py na Raspberry Pi:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-24-a-la-s--18.45.04.png" class="kg-image" alt="Desenvolvimento de um Sistema de Estacionamento Inteligente: Utilizando Sensores IoT para Indicar Disponibilidade de Vagas" loading="lazy" width="543" height="519"></figure><p>Lembre-se de adaptar e ajustar o c&#xF3;digo conforme necess&#xE1;rio para o seu ambiente e requisitos espec&#xED;ficos. Esse &#xE9; apenas um exemplo b&#xE1;sico para demonstrar a ideia do sistema. Certifique-se de instalar as bibliotecas necess&#xE1;rias, como Flask e RPi.GPIO, em suas respectivas plataformas (Raspberry Pi e servidor web).</p><h3 id="etapa-6-implementa%C3%A7%C3%A3o-da-l%C3%B3gica-de-disponibilidade">Etapa 6: Implementa&#xE7;&#xE3;o da L&#xF3;gica de Disponibilidade</h3><p>1. Na Raspberry Pi, implemente a l&#xF3;gica para interpretar os dados dos sensores e determinar se uma vaga est&#xE1; dispon&#xED;vel ou ocupada.</p><p>2. Atualize os dados de disponibilidade no servidor.</p><h3 id="etapa-7-testes-e-ajustes">Etapa 7: Testes e Ajustes</h3><p>1. Realize testes para verificar se os sensores est&#xE3;o detectando corretamente a presen&#xE7;a de ve&#xED;culos.</p><p>2. Verifique se a interface web exibe corretamente os dados de disponibilidade.</p><p>3. Fa&#xE7;a ajustes na l&#xF3;gica e na interface conforme necess&#xE1;rio.</p><h3 id="etapa-8-implanta%C3%A7%C3%A3o">Etapa 8: Implanta&#xE7;&#xE3;o</h3><p>1. Instale a Raspberry Pi em locais reais de estacionamento.</p><p>2. Garanta que a Raspberry Pi esteja conectada &#xE0; internet.</p><h3 id="etapa-9-manuten%C3%A7%C3%A3o-e-monitoramento-cont%C3%ADnuo">Etapa 9: Manuten&#xE7;&#xE3;o e Monitoramento Cont&#xED;nuo</h3><p>1. Monitore o sistema para garantir que os sensores e a interface web estejam funcionando corretamente.</p><p>2. Realize atualiza&#xE7;&#xF5;es e manuten&#xE7;&#xF5;es conforme necess&#xE1;rio.<br></p><h2 id="conclus%C3%A3o">Conclus&#xE3;o</h2><p>A cria&#xE7;&#xE3;o deste Sistema de Estacionamento Inteligente, utilizando sensores IoT para indicar a disponibilidade de vagas, representa um passo significativo em dire&#xE7;&#xE3;o a uma maior efici&#xEA;ncia e conveni&#xEA;ncia nas &#xE1;reas urbanas movimentadas. Ao longo deste tutorial, exploramos desde a defini&#xE7;&#xE3;o do projeto at&#xE9; a integra&#xE7;&#xE3;o dos componentes, demonstrando como a tecnologia pode ser aplicada de maneira pr&#xE1;tica para resolver desafios cotidianos.</p><p>A tecnologia IoT desempenhou um papel crucial nesse projeto, permitindo a interconex&#xE3;o dos sensores de detec&#xE7;&#xE3;o de presen&#xE7;a, a Raspberry Pi e a interface web. Isso resultou em um ecossistema inteligente capaz de coletar dados em tempo real, process&#xE1;-los e disponibiliz&#xE1;-los aos motoristas de forma acess&#xED;vel e eficaz.</p><p>O Raspberry Pi e outros sistemas embarcados, como Arduino e ESP8266, apresentam uma gama de possibilidades para projetos de IoT e sistemas de monitoramento. Eles oferecem a capacidade de processamento e conectividade necess&#xE1;rias para criar solu&#xE7;&#xF5;es inovadoras, como o Sistema de Estacionamento Inteligente abordado aqui.</p><p>A Internet das Coisas (IoT) amplifica a conectividade entre dispositivos e a coleta de dados, transformando as cidades em ambientes mais inteligentes e interconectados. Ao aplicar essas tecnologias em solu&#xE7;&#xF5;es urbanas, como o Sistema de Estacionamento Inteligente, estamos contribuindo para a melhoria da qualidade de vida, a otimiza&#xE7;&#xE3;o dos recursos e a redu&#xE7;&#xE3;o dos problemas relacionados &#xE0; mobilidade.</p><p>Portanto, &#xE0; medida que continuamos avan&#xE7;ando na era da tecnologia, projetos como esse representam um vislumbre do potencial que a inova&#xE7;&#xE3;o e a conectividade podem trazer para as nossas vidas di&#xE1;rias. O Sistema de Estacionamento Inteligente n&#xE3;o &#xE9; apenas um exemplo de como a tecnologia pode resolver problemas complexos, mas tamb&#xE9;m um reflexo do papel transformador que ela desempenha na cria&#xE7;&#xE3;o de um futuro mais inteligente, eficiente e sustent&#xE1;vel. Este tutorial &#xE9; apenas o ponto de partida para explorar ainda mais as possibilidades oferecidas pela IoT e sistemas embarcados, incentivando voc&#xEA; a continuar a explorar, experimentar e criar solu&#xE7;&#xF5;es que tenham um impacto positivo em nossa sociedade em constante evolu&#xE7;&#xE3;o.</p><p>Este tutorial n&#xE3;o apenas fornece um exemplo pr&#xE1;tico de como desenvolver um Sistema de Estacionamento Inteligente, mas tamb&#xE9;m incentiva voc&#xEA; a aplicar esses conceitos e tecnologias em suas pr&#xF3;prias cria&#xE7;&#xF5;es. A revolu&#xE7;&#xE3;o da IoT est&#xE1; apenas come&#xE7;ando, e sua capacidade de criar solu&#xE7;&#xF5;es inovadoras tem o potencial de transformar o mundo ao seu redor. Lembre-se de que a aprendizagem cont&#xED;nua, a experimenta&#xE7;&#xE3;o e a colabora&#xE7;&#xE3;o com a comunidade s&#xE3;o elementos-chave para impulsionar o avan&#xE7;o tecnol&#xF3;gico e criar um impacto positivo em nossa sociedade.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--8.png" class="kg-image" alt="Desenvolvimento de um Sistema de Estacionamento Inteligente: Utilizando Sensores IoT para Indicar Disponibilidade de Vagas" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--8.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--8.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="refer%C3%AAncias-bibliogr%C3%A1ficas">Refer&#xEA;ncias Bibliogr&#xE1;ficas</h2><p>1. Raspberry Pi Foundation. (https://www.raspberrypi.org/)</p><p>2. Arduino. (https://www.arduino.cc/)</p><p>3. ESP8266 Community Forum. (https://www.esp8266.com/)</p><p>4. Shinar, D. (2018). A review of sensing technologies for smart parking. Sensors, 18(7), 2066. (https://www.mdpi.com/1424-8220/18/7/2066)</p><p>5. Internet of Things: How IoT is Reshaping the Automotive Industry. (https://www.iotforall.com/iot-reshaping-automotive-industry/)</p><p>6. Flask Documentation. (https://flask.palletsprojects.com/en/2.1.x/)</p><p>7. RPi.GPIO Documentation. (https://sourceforge.net/p/raspberry-gpio-python/wiki/)</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Usando scraping com Node.js para categorizar currículos em PDF e separar em pastas]]></title><description><![CDATA[<p></p><p>O mundo digital &#xE9; um vasto reposit&#xF3;rio de informa&#xE7;&#xF5;es em diversos formatos, e os arquivos PDF (Portable Document Format) s&#xE3;o amplamente empregados para compartilhar conte&#xFA;do de maneira confi&#xE1;vel e padronizada. Contudo, manipular e extrair dados espec&#xED;ficos de</p>]]></description><link>https://community.revelo.com.br/usando-scraping-com-node-js-para-categorizar-curriculos-em-pdf-e-separar-em-pastas/</link><guid isPermaLink="false">671992a04a604c0001f9f90e</guid><category><![CDATA[Node.js]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Community]]></dc:creator><pubDate>Fri, 25 Oct 2024 18:14:19 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Usando-scraping-com-Node.js-para-categorizar-curri-culos-em-PDF-e-separar-em-pastas.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Usando-scraping-com-Node.js-para-categorizar-curri-culos-em-PDF-e-separar-em-pastas.png" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas"><p></p><p>O mundo digital &#xE9; um vasto reposit&#xF3;rio de informa&#xE7;&#xF5;es em diversos formatos, e os arquivos PDF (Portable Document Format) s&#xE3;o amplamente empregados para compartilhar conte&#xFA;do de maneira confi&#xE1;vel e padronizada. Contudo, manipular e extrair dados espec&#xED;ficos de arquivos PDF pode ser um desafio, especialmente quando a meta &#xE9; automatizar esses processos em um ambiente de desenvolvimento.</p><p>Neste sentido, a linguagem de programa&#xE7;&#xE3;o node.js surge como uma ferramenta eficaz capaz de superar esses desafios. Este tutorial foi criado para guiar voc&#xEA; atrav&#xE9;s da supera&#xE7;&#xE3;o desse desafio, usando a poderosa plataforma de programa&#xE7;&#xE3;o Node.js em conjunto com a biblioteca &quot;pdf-parse&quot;. Com o Node.js, &#xE9; poss&#xED;vel construir um c&#xF3;digo eficaz para ler arquivos PDF e extrair informa&#xE7;&#xF5;es relevantes contidas neles. Al&#xE9;m disso, vamos explorar como integrar essa funcionalidade com um banco de dados PostgreSQL, permitindo armazenar e organizar os dados extra&#xED;dos dos arquivos PDF.</p><p>Portanto, leia para explorar, com maior exatid&#xE3;o, a possibilidade da extra&#xE7;&#xE3;o de dados de arquivos PDF, utilizando o node.js, enriquecendo suas habilidades de desenvolvimento com mais essa ferramenta valiosa em seu repert&#xF3;rio.</p><p>Antes de adentrarmos no tema, &#xE9; indispens&#xE1;vel preparar o ambiente adequado. Certifique-se de ter o Node.js instalado em seu sistema, j&#xE1; que ele servir&#xE1; como base para a constru&#xE7;&#xE3;o do c&#xF3;digo. Caso o Node.js n&#xE3;o esteja presente, voc&#xEA; pode baix&#xE1;-lo e instal&#xE1;-lo com facilidade diretamente do site oficial do Node.js (<a href="https://nodejs.org/">https://nodejs.org/</a>).</p><p>Depois de ter o Node.js instalado, vamos criar um novo diret&#xF3;rio para o nosso projeto e instalar as bibliotecas necess&#xE1;rias. O npm, que &#xE9; o gerenciador de pacotes padr&#xE3;o do Node.js, nos ajudar&#xE1; nessa tarefa. As bibliotecas fs e path s&#xE3;o recursos nativos do Node.js e s&#xE3;o utilizadas para manipula&#xE7;&#xE3;o de opera&#xE7;&#xF5;es de arquivos e caminhos de diret&#xF3;rios, respectivamente, enquanto a biblioteca pdf-parse ser&#xE1; nossa escolha para extrair o texto de arquivos PDF.</p><p>Este tutorial explora a cria&#xE7;&#xE3;o de um programa em Node.js para a organiza&#xE7;&#xE3;o automatizada de arquivos em pastas com base em palavras-chave. Tal abordagem oferece uma solu&#xE7;&#xE3;o pr&#xE1;tica e eficaz para a organiza&#xE7;&#xE3;o de documentos, resultando em uma economia consider&#xE1;vel de tempo. Ao implementar o c&#xF3;digo no terminal, o usu&#xE1;rio precisa apenas definir a quantidade de categorias desejadas e as palavras-chave correspondentes. Dessa forma, o processo de categoriza&#xE7;&#xE3;o e organiza&#xE7;&#xE3;o dos arquivos PDF se torna r&#xE1;pido, eficiente e altamente customiz&#xE1;vel, atendendo &#xE0;s necessidades individuais de cada projeto.</p><p>Agora que compreendemos a import&#xE2;ncia desse tutorial e o contexto no qual ele se insere, podemos avan&#xE7;ar com o passo a passo detalhado da implementa&#xE7;&#xE3;o. Vamos explorar cada aspecto do c&#xF3;digo, desde a intera&#xE7;&#xE3;o com o usu&#xE1;rio at&#xE9; a categoriza&#xE7;&#xE3;o dos arquivos PDF e sua organiza&#xE7;&#xE3;o em pastas. </p><p>Prepare-se para adentrar no mundo da automa&#xE7;&#xE3;o e efici&#xEA;ncia proporcionado pelo Node.js e pela biblioteca pdf-parse!</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--6.png" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--4--6.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--6.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Com as depend&#xEA;ncias instaladas, &#xE9; hora da pr&#xE1;tica de implementar o c&#xF3;digo. Criaremos um script em Node.js que ir&#xE1; ler todos os arquivos PDF de um diret&#xF3;rio espec&#xED;fico, extrair os dados relevantes de cada PDF utilizando a biblioteca pdf-parse.</p><p>Dentro do c&#xF3;digo, usaremos fun&#xE7;&#xF5;es ass&#xED;ncronas e promessas para garantir que as opera&#xE7;&#xF5;es sejam executadas de forma eficiente e sem bloquear o fluxo do programa.</p><h3 id="passo-1-configura%C3%A7%C3%A3o-inicial">Passo 1: Configura&#xE7;&#xE3;o Inicial</h3><p>Inicialmente, verifique se voc&#xEA; tem o Node.js instalado em seu sistema. Caso n&#xE3;o tenha, voc&#xEA; pode baix&#xE1;-los e instal&#xE1;-los a partir dos sites oficiais:</p><ul><li>Node.js:<a href="https://nodejs.org/"> https://nodejs.org/</a></li></ul><p>Ap&#xF3;s ter o Node.js instalado, crie uma pasta chamada &#x201C;curr&#xED;culos&#x201D; no mesmo diret&#xF3;rio em que ser&#xE1; colocado o script.</p><p>Dentro da pasta &#x201C;curr&#xED;culos&#x201D;, insira os arquivos PDF que contenham as informa&#xE7;&#xF5;es de curr&#xED;culos que voc&#xEA; ir&#xE1; utilizar.</p><p>Em seguida, execute o seguinte comando para criar o arquivo package.json e instalar as depend&#xEA;ncias necess&#xE1;rias:</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.6285714285714286;background-color:#1f1f1f;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ffffff;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">npm init -y</span></p></td></tr></tbody></table><!--kg-card-end: html--><h3 id="passo-2-instala%C3%A7%C3%A3o-de-deped%C3%AAncias">Passo 2: Instala&#xE7;&#xE3;o de Deped&#xEA;ncias</h3><p>Agora, instalaremos as bibliotecas necess&#xE1;rias. Execute o comando abaixo no terminal:</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:451.27559055118115pt"><colgroup><col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#ffffff;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">npm install fs path readline pdf-parse</span><span style="font-size:10.5pt;font-family:&apos;Courier New&apos;,monospace;color:#000000;background-color:#000000;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">&#xA0;</span></p></td></tr></tbody></table><!--kg-card-end: html--><p><strong>Explica&#xE7;&#xE3;o das depend&#xEA;ncias:</strong></p><ul><li>fs: M&#xF3;dulo nativo do Node.js para lidar com opera&#xE7;&#xF5;es de arquivo.</li><li>path: M&#xF3;dulo nativo do Node.js para manipular caminhos de arquivos e diret&#xF3;rios.</li><li>readline: M&#xF3;dulo nativo do Node.js que facilita a leitura de entradas do usu&#xE1;rio a partir da linha de comando.</li><li>pdf-parse: Biblioteca para extrair o texto de arquivos PDF.</li></ul><h3 id="passo-3-implementa%C3%A7%C3%A3o-do-c%C3%B3digo">Passo 3: Implementa&#xE7;&#xE3;o do C&#xF3;digo</h3><p>Agora, &#xE9; o momento de implementar o c&#xF3;digo. Crie um arquivo chamado &#x2018;node index.js&#x2019; e insira o seguinte c&#xF3;digo:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.21.01.png" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy" width="482" height="518"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.22.51.png" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy" width="600" height="518" srcset="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.22.51.png 600w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.13.png" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy" width="602" height="414" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.13.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.13.png 602w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.39.png" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy" width="601" height="559" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.39.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.39.png 601w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.57.png" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy" width="600" height="208" srcset="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--18.23.57.png 600w"></figure><p><strong>pdfsDirectory:</strong> &#xC9; o caminho do diret&#xF3;rio onde os arquivos PDF ser&#xE3;o lidos. No c&#xF3;digo atual, os PDFs devem estar na pasta ./curriculos (na mesma pasta do script).</p><p><strong>askForCategories:</strong> Essa fun&#xE7;&#xE3;o visa solicitar ao usu&#xE1;rio a quantidade e os nomes das categorias que ser&#xE3;o utilizadas para organizar os arquivos PDF.</p><p><strong>startCategorization:</strong> Fun&#xE7;&#xE3;o que possui como objetivo iniciar o processo de categoriza&#xE7;&#xE3;o, ela chama a fun&#xE7;&#xE3;o anterior (aksforcategories) para obter as categorias determinadas pelo usu&#xE1;rio, e em seguida chama a fun&#xE7;&#xE3;o &#x201C;readAndCategorizePDFsFromDirectory&#x201D; para categorizar os arquivos PDF.</p><p><strong>readPDF:</strong> Fun&#xE7;&#xE3;o respons&#xE1;vel por ler o conte&#xFA;do de um arquivo PDF e retornar uma promessa que cont&#xE9;m os dados do PDF analisado.</p><p><strong>readAndCategorizePDFsFromDirectory:</strong> Esta fun&#xE7;&#xE3;o tem como finalidade ler todos os arquivos PDF do diret&#xF3;rio e categoriz&#xE1;-los, com base nas palavras chave encontradas em seus conte&#xFA;dos.</p><h3 id="passo-4-executando-o-programa">Passo 4: Executando o Programa</h3><p>Agora, abra o terminal e digite o seguinte comando:</p><p>&#x201C;node index.js&#x201D;</p><p>Para ilustrar a execu&#xE7;&#xE3;o do programa e categoriza&#xE7;&#xE3;o dos curr&#xED;culos, solicitei ao programa que separasse os arquivos selecionados em quatro categorias: front end, back end, full stack e css, e o que n&#xE3;o se enquadra nessas palavras chaves, ser&#xE1; separado em uma pasta denominada como outros:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcgfy6D5iSZbgvQ4FaqJo37hrbP-bM4mhZ7upcWX8jAN38n_ApPLd1ObWJ81CT7B4AzjF2672VUlCDTv4DBhvxX2DLhPFWKXfugqI30W2rED8t_emcJ_FqxyXMbLSymHuXkbyQTJbmPgcIGc1EMwERd460V?key=YzpTLi9i2gzZkKOCGBmprw" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy"></figure><p>Ap&#xF3;s a categoriza&#xE7;&#xE3;o, realizada de forma interativa com o usu&#xE1;rio pelo terminal, o programa exibe como ficou a organiza&#xE7;&#xE3;o dos curr&#xED;culos nas pastas, atendendo aos crit&#xE9;rios solicitados pelo usu&#xE1;rio:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfvw8eRv0deMdSEMDUIdSL-EJpvfsDxKizrPjOFfQhUcX7enQFiqgAam8RJJNkyfOtr1nCfb1HniY0OgIBzzPEKM5pLHcLRdpf6WwrwXGM2CUyr_kPlM6V_XeLUgIJ0eMQ47ENYG-CJELI-hrAahgKU19U3?key=YzpTLi9i2gzZkKOCGBmprw" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy"></figure><p>Dessa forma, conforme o programa identificou as palavras-chave solicitadas, ap&#xF3;s categorizar os arquivos PDF, foi criada uma pasta referente &#xE0;s categorias, e o que n&#xE3;o se enquadra nos requisitos solicitados, foi movido para a pasta chamada de &#x201C;outros&#x201D;. Utilizando esse c&#xF3;digo, voc&#xEA; pode aprimorar e personalizar os arquivos conforme suas demandas.</p><h2 id="conclus%C3%A3o">Conclus&#xE3;o</h2><p>Neste tutorial, o objetivo foi mostrar uma solu&#xE7;&#xE3;o eficaz para quem procura automatizar processos de organiza&#xE7;&#xE3;o de arquivos no formato PDF, com a cria&#xE7;&#xE3;o de um programa em Node.js para automatizar arquivos em pastas com base em palavras-chave.</p><p>No decorrer deste tutorial, exploramos um cen&#xE1;rio pr&#xE1;tico em que a automa&#xE7;&#xE3;o de tarefas se mostrou uma solu&#xE7;&#xE3;o poderosa e eficiente. Ao utilizar a linguagem de programa&#xE7;&#xE3;o Node.js e a biblioteca pdf-parse, fomos capazes de desenvolver um programa capaz de extrair informa&#xE7;&#xF5;es relevantes de arquivos PDF e categoriz&#xE1;-los de acordo com palavras-chave espec&#xED;ficas. Esse processo n&#xE3;o apenas simplificou a organiza&#xE7;&#xE3;o de documentos, mas tamb&#xE9;m economizou um tempo valioso que poderia ser direcionado para tarefas mais estrat&#xE9;gicas.</p><p>O tutorial come&#xE7;ou com uma introdu&#xE7;&#xE3;o abordando a import&#xE2;ncia dos arquivos PDF no mundo digital e os desafios de manipul&#xE1;-los. Discutimos a prepara&#xE7;&#xE3;o do ambiente de desenvolvimento, incluindo a instala&#xE7;&#xE3;o do Node.js e das bibliotecas necess&#xE1;rias. Em seguida, detalhamos o c&#xF3;digo passo a passo, explicando cada fun&#xE7;&#xE3;o e componente envolvido. A introdu&#xE7;&#xE3;o da intera&#xE7;&#xE3;o com o usu&#xE1;rio por meio do readline trouxe uma experi&#xEA;ncia mais amig&#xE1;vel e personalizada &#xE0; aplica&#xE7;&#xE3;o.</p><p>O ponto central do tutorial foi a cria&#xE7;&#xE3;o da fun&#xE7;&#xE3;o que l&#xEA; e categoriza os arquivos PDF com base nas palavras-chave definidas pelo usu&#xE1;rio. A automa&#xE7;&#xE3;o desse processo resultou em um ganho significativo de efici&#xEA;ncia, reduzindo a necessidade de interven&#xE7;&#xE3;o manual repetitiva. Essa abordagem pode ser aplicada em diversos cen&#xE1;rios, desde a organiza&#xE7;&#xE3;o de curr&#xED;culos at&#xE9; a classifica&#xE7;&#xE3;o de documentos comerciais.</p><p>Ao final, discutimos brevemente o conceito de automa&#xE7;&#xE3;o, ressaltando sua relev&#xE2;ncia em otimizar tarefas rotineiras e liberar recursos para atividades mais estrat&#xE9;gicas e criativas. Atrav&#xE9;s deste tutorial, voc&#xEA; n&#xE3;o apenas aprendeu a criar um programa funcional, mas tamb&#xE9;m compreendeu a import&#xE2;ncia de automatizar tarefas em diversos contextos.</p><p>Em suma, a automa&#xE7;&#xE3;o &#xE9; uma ferramenta valiosa no mundo moderno, e este tutorial ofereceu um exemplo pr&#xE1;tico de como ela pode ser implementada por meio da programa&#xE7;&#xE3;o. Esperamos que voc&#xEA; tenha adquirido conhecimentos &#xFA;teis e inspira&#xE7;&#xE3;o para explorar ainda mais as possibilidades da automa&#xE7;&#xE3;o em suas atividades di&#xE1;rias e projetos futuros.</p><p>O processo de organiza&#xE7;&#xE3;o de arquivos que &#xE9; feito de forma manual pode ser extremamente demorado, especialmente quando h&#xE1; uma quantidade exorbitante de documentos para categorizar e organizar por pastas. Assim, ao implementar o c&#xF3;digo desenvolvido e apresentado neste tutorial, esse processo pode ser simplificado, com um comando no terminal, na qual os usu&#xE1;rios precisar&#xE3;o apenas fornecer a quantidade de categorias desejadas e as palavras-chave que ser&#xE3;o usadas para categorizar os arquivos.</p><p>Essa abordagem traz in&#xFA;meros benef&#xED;cios, como a redu&#xE7;&#xE3;o de erros e otimiza&#xE7;&#xE3;o do fluxo de trabalho, al&#xE9;m da melhor ger&#xEA;ncia do nosso tempo, ao possibilitar que o programa automatize tarefas repetitivas e propensas a erros, dessa forma o usu&#xE1;rio pode se concentrar em tarefas mais criativas e estrat&#xE9;gicas.</p><p>Portanto, se voc&#xEA; est&#xE1; buscando otimizar a organiza&#xE7;&#xE3;o de documentos, este tutorial pode ser a solu&#xE7;&#xE3;o pr&#xE1;tica e acess&#xED;vel. Agora, voc&#xEA; possui em m&#xE3;os um poderoso instrumento para automatizar a categoriza&#xE7;&#xE3;o de arquivos PDF com base em crit&#xE9;rios definidos, visando economizar tempo e tornar a atividade mais eficiente.</p><p>A economia de tempo obtida por meio dessa automa&#xE7;&#xE3;o &#xE9; inestim&#xE1;vel, pois libera o usu&#xE1;rio para utilizar seu tempo em atividades mais produtivas, e a medida que nos aprofundamos na programa&#xE7;&#xE3;o e desenvolvemos solu&#xE7;&#xF5;es mais complexas, o conhecimento adquirido aqui servir&#xE1; como base s&#xF3;lida para futuras empreitadas.</p><p>No contexto do desenvolvimento de software, a automatiza&#xE7;&#xE3;o desempenha um papel vital, melhora a qualidade do c&#xF3;digo e acelera o ciclo de desenvolvimento. Muitas tarefas podem ser automatizadas e amplamente utilizadas em atividades rotineiras do dia a dia.</p><p>Por fim, voc&#xEA; pode prosseguir com confian&#xE7;a, sabendo que automa&#xE7;&#xE3;o tem um poderoso potencial em produtividade e aplicabilidade em v&#xE1;rios contexto, espero que esse tutorial tenha inspirado voc&#xEA; a explorar mais a fundo as capacidades do node.js e a criar solu&#xE7;&#xF5;es inteligentes para desafios do mundo real.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--7.png" class="kg-image" alt="Usando scraping com Node.js para categorizar curr&#xED;culos em PDF e separar em pastas" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--1---1--7.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--7.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="refer%C3%AAncia-bibliogr%C3%A1fica">Refer&#xEA;ncia Bibliogr&#xE1;fica</h2><ul><li>Documenta&#xE7;&#xE3;o oficial do Node.js:<a href="https://nodejs.org/"> https://nodejs.org/</a></li><li>Documenta&#xE7;&#xE3;o da biblioteca pdf-parse:<a href="https://www.npmjs.com/package/pdf-parse"> https://www.npmjs.com/package/pdf-parse</a></li><li>Documenta&#xE7;&#xE3;o da biblioteca fs (Node.js):<a href="https://nodejs.org/api/fs.html"> https://nodejs.org/api/fs.html</a></li><li>Documenta&#xE7;&#xE3;o da biblioteca path (Node.js):<a href="https://nodejs.org/api/path.html"> https://nodejs.org/api/path.html</a></li><li>Documenta&#xE7;&#xE3;o da biblioteca readline (Node.js):<a href="https://nodejs.org/api/readline.html"> https://nodejs.org/api/readline.html</a></li></ul><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[React Router: Como usar as rotas no React? - Parte II]]></title><description><![CDATA[<p></p><p>Na <a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-i/">parte 1 desse m&#xF3;dulo</a> aprendemos a como criar uma estrutura funcional com React Router DOM. Nessa segunda parte do artigo iremos aprender a como usar os Par&#xE2;metros da URL junto com React Router. Para isso, iremos dar continuidade ao projeto que estamos utilizando desde a</p>]]></description><link>https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-ii/</link><guid isPermaLink="false">6719895a4a604c0001f9f8ac</guid><category><![CDATA[React]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Antônio André]]></dc:creator><pubDate>Fri, 25 Oct 2024 18:08:49 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---React-Router_-Como-usar-as-rotas-no-React_---Parte-II.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---React-Router_-Como-usar-as-rotas-no-React_---Parte-II.png" alt="React Router: Como usar as rotas no React? - Parte II"><p></p><p>Na <a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-i/">parte 1 desse m&#xF3;dulo</a> aprendemos a como criar uma estrutura funcional com React Router DOM. Nessa segunda parte do artigo iremos aprender a como usar os Par&#xE2;metros da URL junto com React Router. Para isso, iremos dar continuidade ao projeto que estamos utilizando desde a parte 1 do artigo, se voc&#xEA; chegou aqui de paraquedas e quer pegar essa explica&#xE7;&#xE3;o desde o in&#xED;cio <a href="https://community.revelo.com.br/react-router-como-usar-as-rotas-no-react-parte-i/">acesse esse link</a>.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--7.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--7.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--7.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="o-que-s%C3%A3o-os-par%C3%A2metros-da-url">O que s&#xE3;o os par&#xE2;metros da URL?</h2><p>Os par&#xE2;metros da URL se referem a valores vari&#xE1;veis que podem ser inclu&#xED;dos na pr&#xF3;pria URL para representar informa&#xE7;&#xF5;es espec&#xED;ficas, como IDs, nomes ou outros dados relevantes para a p&#xE1;gina ou componente que est&#xE1; sendo renderizado. Os par&#xE2;metros da URL s&#xE3;o uma parte essencial do<em> roteamento din&#xE2;mico</em>, permitindo que voc&#xEA; crie p&#xE1;ginas reutiliz&#xE1;veis e din&#xE2;micas que exibem informa&#xE7;&#xF5;es diferentes com base nos valores fornecidos na URL.</p><p>Vamos ver isso na pr&#xE1;tica!</p><h3 id="configurando-os-par%C3%A2metros-da-url">Configurando os par&#xE2;metros da URL:</h3><p>Para que possamos utilizar esse recurso ser&#xE1; necess&#xE1;rio fazer a configura&#xE7;&#xE3;o b&#xE1;sica dele. Vamos supor que o usu&#xE1;rio est&#xE1; na aba de produtos e ele quer ver dados de um jogo X, &#xE9; justamente a&#xED; que entra esse recurso.</p><p>No arquivo <em>router.jsx</em> vamos adicionar uma nova rota. Essa nova rota ter&#xE1; como caminho o /products mas al&#xE9;m disso, quando o usu&#xE1;rio clicar no produto a rota dever&#xE1; ser acessada por meio de algum par&#xE2;metro. Esse par&#xE2;metro deve ser um nome exclusivo, isto &#xE9;, um ID. Para criar esse par&#xE2;metro &#xE9; bem simples, basta passar no caminho /products/ o par&#xE2;metro <em><strong>:productId. </strong></em>E atrelado a esse caminho o elemento que ser&#xE1; carregado, isto &#xE9;, a tela de exibi&#xE7;&#xE3;o. Logo, o arquivo <em>router.jsx </em>ficar&#xE1; assim:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.45.12.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="441" height="223"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.46.35.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="243" height="567"></figure><p>Feito isso, &#xE9; necess&#xE1;rio criar a page Product, dentro da pasta page. Dentro da pasta page, crie o arquivo <em>Product.jsx </em>e dentro dele adicione o conte&#xFA;do:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.47.26.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="466" height="370"></figure><p>As pastas e arquivos devem estar assim at&#xE9; o momento:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdoEECUVh5mVd6VdTyulO-9WODHEUkADSts83YArF2cv-PeQw-G5WY97iYNDWn1ZGG8olMlhr2Df0T96ZswAhs4tV0oLML0qUESnm-krACFCC5v4EpU9pAKTkz60NJt57mQRtSHV-7Aljm0JEb94WIFJ8ega6Ra06BIWebfHQPsidgITSgdJjs?key=G96UnYL1XlL9wX5cSyqFLg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy"></figure><h3 id="ajustando-redirecionamento-para-os-par%C3%A2metros-da-url">Ajustando redirecionamento para os par&#xE2;metros da URL:</h3><p>Agora que fizemos a configura&#xE7;&#xE3;o inicial da p&#xE1;gina, nada mais justo do que cada produto acessar suas respectivas caracter&#xED;sticas. Para isso vamos adicionar o componente Link que o React Router DOM disponibiliza, no arquivo <em>Products.jsx:</em></p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.48.10.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="326" height="83"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.48.45.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="304" height="595"></figure><p>Agora, voc&#xEA; pode fazer um teste. Acessando a aba Produtos e clicando no bot&#xE3;o ver, vai ser redirecionado para a p&#xE1;gina padr&#xE3;o que criamos (a Product) e na URL estar&#xE1; /product/1 (se voc&#xEA; acessar o primeiro produto estar&#xE1; 1, caso contr&#xE1;rio estar&#xE1; qualquer outro valor).</p><p>P&#xE1;gina de Produtos:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXentnliiHErKJ1N0X3jTVFW1cRD-OWpxQiF0p-N5_3LkK-ghaf9rIm7rnx7mdlCDz-wt0JexpUSdFOTPNV3Z54Z6EhOV9VveSFhuEQnz1_9hUN6xYjo8H-Q-BM-MlUwypTzNhNtGLhHiEv6KWIayWphELfNz-dpLD8ieSqMdJ0XcRUW7ydBhac?key=G96UnYL1XlL9wX5cSyqFLg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy"></figure><p>Ap&#xF3;s clicar para ver o produto:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe0dzHJHypGz5Cl3ZR5Qw0yH2FOLY_Sgnp4iG2on1Q9P1rV0Vk4yEL4DojCzm7tDQLV8bLXPP9fgf14wekPg0VQDADQ_oi7iAolr0Wqyr8341FXSClNupLF6JV9aWPRYjutD3KJV9MaWg8vXu5J2LxzhXz7f5oaFK62O23IsDG7WDsRJCpKprQ?key=G96UnYL1XlL9wX5cSyqFLg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy"></figure><p>Veja que os par&#xE2;metros da URL foram alterados e o conte&#xFA;do tamb&#xE9;m!</p><h2 id="renderizando-os-dados-de-cada-produto-de-forma-din%C3%A2mica">Renderizando os dados de cada produto de forma din&#xE2;mica</h2><p>Criamos uma p&#xE1;gina Product, que por padr&#xE3;o tem apenas um Link e um t&#xED;tulo, mas n&#xE3;o &#xE9; isso que queremos mostrar para o usu&#xE1;rio, o que queremos mostrar s&#xE3;o as informa&#xE7;&#xF5;es gerais sobre o produto que ele est&#xE1; acessando.</p><p>Para isso, tamb&#xE9;m &#xE9; bem simples. Basta utilizarmos um hook do React Router DOM: useParams(). Que &#xE9; um hook que serve justamente para utilizarmos os par&#xE2;metros da URL e assim seja poss&#xED;vel capturar o valor, nesse caso, o ID do produto que o usu&#xE1;rio est&#xE1; acessando e renderizar na tela as informa&#xE7;&#xF5;es do produto que ele deseja visualizar!</p><p><strong>OBSERVA&#xC7;&#xC3;O IMPORTANTE: </strong>O hook useParams retorna um objeto. Portanto, voc&#xEA; pode acessar esse valor do par&#xE2;metro por meio da sintaxe <em>nomeDaVariavel.nomeDoPar&#xE2;metro </em>ou pode desestruturar esse objeto, j&#xE1; capturando o valor do par&#xE2;metro (vamos utilizar esse m&#xE9;todo nesse artigo).</p><p>Logo, no arquivo <em>Product.jsx </em>ficar&#xE1; assim:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.49.30.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="467" height="395"></figure><p>Agora, teremos que importar todos os produtos do nosso banco de dados fict&#xED;cio e procurar pelo produto que o usu&#xE1;rio est&#xE1; acessando usando o m&#xE9;todo <em>find()</em> na lista de produtos:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.50.13.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="607" height="462" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.50.13.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.50.13.png 607w"></figure><p><strong>OBSERVA&#xC7;&#xC3;O IMPORTANTE: </strong>no m&#xE9;todo find() utilizei antes de productId o sinal de &#x201C;+&#x201D; para converter de forma simples o tipo do valor de string para number. Caso essa convers&#xE3;o n&#xE3;o fosse feita, daria um erro. Voc&#xEA; pode testar retirando o sinal de &#x201C;+&#x201D;.</p><p>Por fim, vamos renderizar os dados do produto:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.51.00.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="651" height="506" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.51.00.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.51.00.png 651w"></figure><h2 id="analisando-o-c%C3%B3digo-no-ambiente-de-produ%C3%A7%C3%A3o">Analisando o c&#xF3;digo no ambiente de produ&#xE7;&#xE3;o</h2><p>Agora, podemos ver como est&#xE1; ficando o nosso projeto no navegador! Ao tentar ver os detalhes de qualquer produto deve carregar todas as suas informa&#xE7;&#xF5;es dessa forma:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdtQfvYuXC7ABFSAOET7Q7DK8CT8txWwcbHdalhrUi7qAHECF1Ysrhfjn1c28SJ8_GpjpCzDtELqd-QB5HiFVG5qbjAt4nfkr_kOARCbw04mQx9-AUJ27ec1NS-BSLQJgedtHHIMEzyaxm8BbPFY1ZstHF_84pNmx7Hk4IAHaanX2xScn6yCt0?key=G96UnYL1XlL9wX5cSyqFLg" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy"></figure><p>Se o seu projeto est&#xE1; dando algum erro, recomendo que o analise cuidadosamente e qualquer coisa basta acessar o reposit&#xF3;rio do projeto no Github!</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--7.png" class="kg-image" alt="React Router: Como usar as rotas no React? - Parte II" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--7.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--7.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="finaliza%C3%A7%C3%A3o">Finaliza&#xE7;&#xE3;o</h2><p>Em conclus&#xE3;o, neste artigo exploramos a import&#xE2;ncia e a utilidade dos par&#xE2;metros da URL no React Router DOM. Aprendemos como utilizar os par&#xE2;metros da URL para criar p&#xE1;ginas din&#xE2;micas e reutiliz&#xE1;veis, permitindo que nossos aplicativos renderizem conte&#xFA;do espec&#xED;fico com base nas informa&#xE7;&#xF5;es presentes na URL. Vimos como capturar esses par&#xE2;metros usando o useParams() hook e como utiliz&#xE1;-los para buscar e exibir dados relevantes.</p><p>No pr&#xF3;ximo artigo, darei continuidade a esta s&#xE9;rie, expandindo nosso conhecimento para lidar com um aspecto crucial do desenvolvimento de aplica&#xE7;&#xF5;es usando o React Router DOM: o tratamento de erros. Abordarei como criar p&#xE1;ginas de erro personalizadas, como lidar com situa&#xE7;&#xF5;es em que rotas n&#xE3;o correspondentes s&#xE3;o acessadas e como aprimorar a experi&#xEA;ncia do usu&#xE1;rio ao enfrentar problemas de navega&#xE7;&#xE3;o.</p><p>Gostaria de agradecer por acompanhar este artigo e pela dedica&#xE7;&#xE3;o em aprender mais sobre o React Router DOM e suas funcionalidades. Espero v&#xEA;-lo na terceira e &#xFA;ltima parte desta s&#xE9;rie, onde continuaremos a aprofundar nosso entendimento e aprimorar nossas habilidades de desenvolvimento com o React Router DOM. At&#xE9; l&#xE1;, continue explorando, codificando e expandindo seus horizontes no mundo do desenvolvimento web com React.</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Desmistificando os Papéis de QA e Testador de Software]]></title><description><![CDATA[<p></p><p>A qualidade do software &#xE9; de fato uma &quot;linha t&#xEA;nue&quot; que pode definir se um produto ser&#xE1; bem-sucedido ou n&#xE3;o, pois software de baixa qualidade pode resultar em problemas de usabilidade, seguran&#xE7;a e desempenho, afetando a satisfa&#xE7;&#xE3;o dos</p>]]></description><link>https://community.revelo.com.br/desmistificando-os-papeis-de-qa-e-testador-de-software/</link><guid isPermaLink="false">671986ac4a604c0001f9f894</guid><category><![CDATA[QA]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Community]]></dc:creator><pubDate>Fri, 25 Oct 2024 18:01:12 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Desmistificando-os-Pape-is-de--QA-e-Testador-de-Software.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Desmistificando-os-Pape-is-de--QA-e-Testador-de-Software.png" alt="Desmistificando os Pap&#xE9;is de QA e Testador de Software"><p></p><p>A qualidade do software &#xE9; de fato uma &quot;linha t&#xEA;nue&quot; que pode definir se um produto ser&#xE1; bem-sucedido ou n&#xE3;o, pois software de baixa qualidade pode resultar em problemas de usabilidade, seguran&#xE7;a e desempenho, afetando a satisfa&#xE7;&#xE3;o dos usu&#xE1;rios e a reputa&#xE7;&#xE3;o da empresa.</p><p>Duas fun&#xE7;&#xF5;es essenciais nesse processo s&#xE3;o as de um <strong>QA (Analista de Qualidade de Software)</strong> e de um <strong>Testador de Software</strong>. &#xA0;E embora muitas vezes esses termos sejam usados de forma intercambi&#xE1;vel, eles desempenham pap&#xE9;is distintos e complementares. </p><p>Neste artigo, exploraremos alguns aspectos sobre cada um desses pap&#xE9;is.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--5.png" class="kg-image" alt="Desmistificando os Pap&#xE9;is de QA e Testador de Software" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--4--5.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--5.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p><strong>1. Escopo de Atua&#xE7;&#xE3;o</strong></p><p>O papel do Testador de Software &#xE9; mais focado na execu&#xE7;&#xE3;o de testes para identificar defeitos e bugs no software. Eles seguem planos de teste predefinidos e reportam os resultados. Em outro vi&#xE9;s, o Analista de Qualidade de Software (QA) tem um escopo mais amplo. Eles definem as estrat&#xE9;gias gerais de qualidade, coordenam os processos e trabalham para melhorar a qualidade geral do desenvolvimento de software.</p><p><strong>2. Vis&#xE3;o Estrat&#xE9;gica vs. Execu&#xE7;&#xE3;o T&#xE1;tica</strong></p><p>Enquanto os Testadores executam testes conforme diretrizes espec&#xED;ficas, os QAs adotam uma abordagem estrat&#xE9;gica. Eles estabelecem processos de garantia de qualidade, como a defini&#xE7;&#xE3;o de padr&#xF5;es de teste, a cria&#xE7;&#xE3;o de m&#xE9;tricas de qualidade e a implementa&#xE7;&#xE3;o de melhores pr&#xE1;ticas.</p><p><strong>3. Envolvimento no Ciclo de Vida do Software</strong></p><p>Os Testadores de Software geralmente est&#xE3;o mais ativos na fase de testes do ciclo de vida do software. Eles realizam testes espec&#xED;ficos em diferentes est&#xE1;gios do desenvolvimento. Por outro lado, os QAs est&#xE3;o envolvidos desde o in&#xED;cio do projeto. Eles contribuem para a defini&#xE7;&#xE3;o de requisitos de qualidade, participam de revis&#xF5;es de design e ajudam a moldar o processo geral de desenvolvimento.</p><p><strong>4. Comunica&#xE7;&#xE3;o e Colabora&#xE7;&#xE3;o</strong></p><p>Os Testadores de Software interagem principalmente com os desenvolvedores, comunicando os problemas identificados nos testes. QAs, por outro lado, colaboram com toda a equipe, incluindo desenvolvedores, gerentes de projeto e partes interessadas. Sua fun&#xE7;&#xE3;o envolve uma comunica&#xE7;&#xE3;o eficaz para garantir que as expectativas de qualidade sejam compreendidas por todos os envolvidos.</p><p><strong>5. Habilidades Necess&#xE1;rias</strong></p><p>Enquanto ambas as fun&#xE7;&#xF5;es exigem habilidades t&#xE9;cnicas, os Testadores de Software precisam ser especialmente bons em executar procedimentos de teste e relatar resultados de maneira clara. Os QAs precisam de uma gama mais ampla de habilidades, incluindo gerenciamento de processos, an&#xE1;lise de requisitos e habilidades interpessoais fortes.</p><p><strong>6. Automa&#xE7;&#xE3;o de Testes</strong></p><p>A automa&#xE7;&#xE3;o de testes &#xE9; uma &#xE1;rea em crescimento dentro do desenvolvimento de software. Embora os Testadores possam se envolver na automa&#xE7;&#xE3;o de testes, essa responsabilidade muitas vezes recai sobre os QAs, que est&#xE3;o mais envolvidos na defini&#xE7;&#xE3;o de estrat&#xE9;gias de automa&#xE7;&#xE3;o e na sele&#xE7;&#xE3;o de ferramentas apropriadas.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--5.png" class="kg-image" alt="Desmistificando os Pap&#xE9;is de QA e Testador de Software" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--1---1--5.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--5.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Em s&#xED;ntese, os QAs e os Testadores de Software desempenham pap&#xE9;is complementares e vitais na busca pela excel&#xEA;ncia do software. Enquanto os Testadores s&#xE3;o os olhos que identificam as imperfei&#xE7;&#xF5;es, os QAs s&#xE3;o os alicerces que sustentam os padr&#xF5;es de qualidade da organiza&#xE7;&#xE3;o. Nesse equil&#xED;brio, a colabora&#xE7;&#xE3;o entre esses dois pilares emerge como a for&#xE7;a motriz por tr&#xE1;s do sucesso de um software de alto padr&#xE3;o. Juntos, eles moldam a qualidade que n&#xE3;o apenas atende, mas supera as expectativas.<br></p><h2 id="refer%C3%AAncias">Refer&#xEA;ncias</h2><p>Pressman, Roger S. Engenharia de software : uma abordagem profissional [recurso eletr&#xF4;nico] / Roger S. Pressman, Bruce R. Maxim ; [tradu&#xE7;&#xE3;o: Jo&#xE3;o Eduardo N&#xF3;brega Tortello ; revis&#xE3;o t&#xE9;cnica: Reginaldo Arakaki, Julio Arakaki, Renato Manzan de Andrade]. &#x2013; 8. ed. &#x2013; Porto Alegre : AMGH, 2016.</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Introdução às funções em Javascript: Conceitos e Métodos]]></title><description><![CDATA[<p></p><p>Neste artigo, voc&#xEA; aprender&#xE1; um pouco mais sobre o conceito de fun&#xE7;&#xF5;es na linguagem Javascript e tamb&#xE9;m conhecer&#xE1; as principais fun&#xE7;&#xF5;es utilizadas no desenvolvimento web.</p><h2 id="javascript">Javascript</h2><p>Javascript &#xE9; uma linguagem de programa&#xE7;&#xE3;o muito utilizada para o</p>]]></description><link>https://community.revelo.com.br/introducao-as-funcoes-em-javascript-conceitos-e-metodos/</link><guid isPermaLink="false">67197bf44a604c0001f9f76b</guid><category><![CDATA[Javascript]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Fernanda Amengual Tatsch]]></dc:creator><pubDate>Fri, 25 Oct 2024 17:56:21 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Introduc-a-o--a-s-func-o-es--em-Javascript_-Conceitos--e-Me-todos.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Introduc-a-o--a-s-func-o-es--em-Javascript_-Conceitos--e-Me-todos.png" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos"><p></p><p>Neste artigo, voc&#xEA; aprender&#xE1; um pouco mais sobre o conceito de fun&#xE7;&#xF5;es na linguagem Javascript e tamb&#xE9;m conhecer&#xE1; as principais fun&#xE7;&#xF5;es utilizadas no desenvolvimento web.</p><h2 id="javascript">Javascript</h2><p>Javascript &#xE9; uma linguagem de programa&#xE7;&#xE3;o muito utilizada para o desenvolvimento de aplica&#xE7;&#xF5;es web, pois, permite a cria&#xE7;&#xE3;o de componentes din&#xE2;micos e interativos, que tornam as p&#xE1;ginas intuitivas e muito atrativas para os usu&#xE1;rios.</p><h2 id="curiosidade">Curiosidade</h2><p>Um teste interessante para se fazer e visualizar diretamente os efeitos do Javascript em um site &#xE9; desativ&#xE1;-lo para sua visualiza&#xE7;&#xE3;o. &#xC9; poss&#xED;vel fazer isso pelo navegador Chrome seguindo estas etapas: insira no seu navegador Chrome://settings/content/javascript. Selecione a op&#xE7;&#xE3;o &#x201C;N&#xE3;o permitir que os sites usem Javascript&#x201D;. Acesse um site (um dica:<a href="http://google.com"> google.com</a>) e observe os efeitos da p&#xE1;gina sem a aplica&#xE7;&#xE3;o do Javascript. No Google, repare especialmente na barra de op&#xE7;&#xF5;es na qual est&#xE3;o dispostos os itens &#x201C;Imagens&#x201D;, &#x201C;V&#xED;deos&#x201D;, etc.</p><blockquote><em>Detalhe importante:</em> <em>ao fazer esse teste, voc&#xEA; apenas desabilita a visualiza&#xE7;&#xE3;o para voc&#xEA; e &#xE9; poss&#xED;vel retornar ao normal refazendo essas etapas e selecionando de volta a permiss&#xE3;o para a utiliza&#xE7;&#xE3;o do Javascript. As p&#xE1;ginas n&#xE3;o sofrem nenhum preju&#xED;zo, pois, essa altera&#xE7;&#xE3;o somente reflete no seu navegador.</em></blockquote><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--4.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--4--4.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--4.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="fun%C3%A7%C3%B5es">Fun&#xE7;&#xF5;es</h2><p>&#x201C;Uma fun&#xE7;&#xE3;o &#xE9; um bloco de c&#xF3;digo JavaScript definido uma vez, mas que pode ser executado (ou chamado) qualquer n&#xFA;mero de vezes&#x201D;. Essa defini&#xE7;&#xE3;o foi dada por David Flanagan no famoso livro JavaScript - O Guia Definitivo e resume muito bem o que s&#xE3;o as fun&#xE7;&#xF5;es na linguagem. Elas s&#xE3;o estruturas extremamente &#xFA;teis na rotina dos desenvolvedores, pois, possibilitam a cria&#xE7;&#xE3;o de c&#xF3;digos mais limpos, com trechos que podem ser reaproveitados. Al&#xE9;m disso, ao utilizar fun&#xE7;&#xF5;es &#xE9; minimizada a chance de erros na manipula&#xE7;&#xE3;o dos trechos, pois, ao alterar uma fun&#xE7;&#xE3;o, isto repercutir&#xE1; em todos os locais onde ela for utilizada. Uma caracter&#xED;stica important&#xED;ssima das fun&#xE7;&#xF5;es &#xE9; que elas possuem par&#xE2;metros que funcionam como vari&#xE1;veis locais. Os valores destes par&#xE2;metros s&#xE3;o passados justamente quando as fun&#xE7;&#xF5;es s&#xE3;o chamadas.</p><h2 id="defini%C3%A7%C3%B5es">Defini&#xE7;&#xF5;es</h2><p><strong>Functions declaration (declara&#xE7;&#xE3;o de fun&#xE7;&#xE3;o):</strong> a declara&#xE7;&#xE3;o de fun&#xE7;&#xE3;o &#xE9; realizada a partir do uso da palavra function seguida pelos s&#xED;mbolos (), dentro dos quais s&#xE3;o inseridos os par&#xE2;metros, e pelas chaves {}, que englobam as instru&#xE7;&#xF5;es da fun&#xE7;&#xE3;o. Confira o exemplo:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--16.47.45.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="357" height="93"></figure><p>No exemplo acima, a fun&#xE7;&#xE3;o multiplicarNumero recebe a e b como par&#xE2;metros e retorna o valor da opera&#xE7;&#xE3;o de multiplica&#xE7;&#xE3;o dos dois valores. Repare que n&#xE3;o passamos os valores em si, pois devemos inseri-los ao chamar a fun&#xE7;&#xE3;o, conforme o c&#xF3;digo abaixo:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--16.48.13.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="417" height="43"></figure><p><strong>Functions expression (express&#xE3;o de fun&#xE7;&#xE3;o):</strong> as fun&#xE7;&#xF5;es tamb&#xE9;m podem ser criadas por meio de uma express&#xE3;o e s&#xE3;o &#xFA;teis especialmente quando o objetivo &#xE9; passar uma fun&#xE7;&#xE3;o como argumento para outra fun&#xE7;&#xE3;o. Elas podem ser an&#xF4;nimas ou receberem um nome, conforme os exemplos abaixo:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--16.48.40.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="331" height="322"></figure><p><strong>Arrow Functions (fun&#xE7;&#xE3;o de flecha):</strong> esse tipo de sintaxe serve para escrever fun&#xE7;&#xF5;es de formas reduzidas, mas com o mesmo prop&#xF3;sito e resultado das fun&#xE7;&#xF5;es normais. O objetivo &#xE9; simplificar e tornar o c&#xF3;digo mais limpo. Confira um exemplo de arrow function:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--16.49.09.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="519" height="50"></figure><p>Na arrow function, n&#xE3;o &#xE9; utilizada a palavra <em>function </em>e sim o s&#xED;mbolo =&gt;, que remete justamente ao nome do tipo de fun&#xE7;&#xE3;o.<br><br><strong>Functions constructor (fun&#xE7;&#xE3;o construtora):</strong> estas fun&#xE7;&#xF5;es s&#xE3;o definidas, basicamente, da mesma forma que as outras declara&#xE7;&#xF5;es ou express&#xF5;es. Entretanto, existem algumas diferen&#xE7;as importantes. Geralmente, estas fun&#xE7;&#xF5;es s&#xE3;o nomeadas com palavras que possuem a primeira letra mai&#xFA;scula e, ao serem invocadas, necessitam do uso da palavra <em>new</em><strong>.</strong> Repare no exemplo abaixo:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--16.49.34.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="331" height="124"></figure><p>Na constante <em>user</em>, estamos criando um novo usu&#xE1;rio ao invocar a fun&#xE7;&#xE3;o Usuario, passando o nome Luiza como par&#xE2;metro.</p><p><strong>Generator Functions (Fun&#xE7;&#xE3;o geradora):</strong> as fun&#xE7;&#xF5;es geradoras possuem o s&#xED;mbolo * ap&#xF3;s a palavra <em>function </em>e podem ser pausadas e retomadas durante a execu&#xE7;&#xE3;o. Confira o exemplo, que iremos detalhar abaixo:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--16.50.11.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="596" height="307"></figure><p>Observe que dentro da fun&#xE7;&#xE3;o usamos a palavra yield que tem o objetivo de pausar a execu&#xE7;&#xE3;o e retornar um valor. Quando utilizamos o gerador.next(), a fun&#xE7;&#xE3;o &#xE9; executada at&#xE9; encontrar a pr&#xF3;xima instru&#xE7;&#xE3;o, ou seja, o pr&#xF3;ximo yield ou at&#xE9; finalizar. Repare no nosso exemplo que adicionamos quatro console.log(gerador.next()). At&#xE9; rodar a quarta vez, o valor estava sendo retornado conforme previsto na fun&#xE7;&#xE3;o e o done, que representaria o encerramento da fun&#xE7;&#xE3;o, como false. Quando chegamos ao fim, o valor retorna como undefined e o done como true, sinalizando que a fun&#xE7;&#xE3;o foi conclu&#xED;da.</p><h2 id="m%C3%A9todos">M&#xE9;todos</h2><p>Os m&#xE9;todos s&#xE3;o fun&#xE7;&#xF5;es prontas e utilizadas para realizar opera&#xE7;&#xF5;es espec&#xED;ficas em diversos tipos de dados, tais como <em>strings</em>, objetos ou <em>arrays</em>. Confira abaixo alguns exemplos, com seus conceitos e exemplos:</p><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.00.22.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="667" height="530" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.00.22.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.00.22.png 667w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.01.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="669" height="476" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.01.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.01.png 669w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.21.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="632" height="462" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.21.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.21.png 632w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.40.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="651" height="495" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.40.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.40.png 651w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.59.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="658" height="454" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.59.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.01.59.png 658w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.02.24.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="677" height="507" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.02.24.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.02.24.png 677w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.02.48.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="709" height="400" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.02.48.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.02.48.png 709w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.09.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="671" height="440" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.09.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.09.png 671w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.30.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="695" height="551" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.30.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.30.png 695w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.54.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="678" height="422" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.54.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.03.54.png 678w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.04.51.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="660" height="514" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.04.51.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.04.51.png 660w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.15.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="627" height="363" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.15.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.15.png 627w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.35.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="651" height="451" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.35.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.35.png 651w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.53.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="700" height="535" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.53.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.05.53.png 700w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.06.19.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="647" height="511" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.06.19.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.06.19.png 647w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.06.38.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="598" height="357"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.06.58.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="659" height="387" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.06.58.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.06.58.png 659w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.07.17.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="670" height="437" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.07.17.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.07.17.png 670w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.07.49.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="677" height="543" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.07.49.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.07.49.png 677w"></figure><figure class="kg-card kg-image-card"><img src="https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.08.08.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="651" height="258" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.08.08.png 600w, https://community.revelo.com.br/content/images/2024/10/Captura-de-Pantalla-2024-10-23-a-la-s--17.08.08.png 651w"></figure><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--4.png" class="kg-image" alt="Introdu&#xE7;&#xE3;o &#xE0;s fun&#xE7;&#xF5;es em Javascript: Conceitos e M&#xE9;todos" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--1---1--4.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--4.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Neste artigo, voc&#xEA; conheceu um pouco mais sobre as fun&#xE7;&#xF5;es, seus conceitos e defini&#xE7;&#xF5;es, na linguagem JavaScript. </p><p>Bons estudos!</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Modelagem UML]]></title><description><![CDATA[<p></p><p>Durante a constru&#xE7;&#xE3;o de um software, a modelagem &#xE9; uma das principais etapas executadas. Como o software trata-se de uma entidade abstrata, a visualiza&#xE7;&#xE3;o do sistema a ser constru&#xED;do &#xE9; fundamental aos desenvolvedores. A Modelagem UML (Unified Modeling Language) &#xE9; uma linguagem</p>]]></description><link>https://community.revelo.com.br/modelagem-uml/</link><guid isPermaLink="false">6716f74f4a604c0001f9f731</guid><category><![CDATA[Arquitetura de Software]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Community]]></dc:creator><pubDate>Thu, 24 Oct 2024 17:46:27 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Modelagem-UML.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Modelagem-UML.png" alt="Modelagem UML"><p></p><p>Durante a constru&#xE7;&#xE3;o de um software, a modelagem &#xE9; uma das principais etapas executadas. Como o software trata-se de uma entidade abstrata, a visualiza&#xE7;&#xE3;o do sistema a ser constru&#xED;do &#xE9; fundamental aos desenvolvedores. A Modelagem UML (Unified Modeling Language) &#xE9; uma linguagem visual utilizada para representar, especificar, construir e documentar sistemas de software e seus processos. A UML disp&#xF5;e de um conjunto de diagramas e nota&#xE7;&#xF5;es que permitem compreender melhor a estrutura, intera&#xE7;&#xF5;es e requisitos do sistema, al&#xE9;m de ser poss&#xED;vel avaliar a qualidade do resultado e reduzir as incertezas do processo.</p><p>Neste artigo, vamos abordar sobre os tipos de diagramas da UML e seus objetivos de uso.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--3.png" class="kg-image" alt="Modelagem UML" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--4--3.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--4--3.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="tipos-de-diagramas">Tipos de diagramas</h2><p>A UML apresenta dois tipos de diagramas: os <strong>Diagramas Estruturais</strong> e os <strong>Diagramas Comportamentais</strong>. A figura abaixo apresenta a &#xE1;rvore de tipos e subtipos de diagramas.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe3D3TAda-eUPYmg6NBrTblrPtjGOr807aFzijVMJHc-7dU3lg4TpajAg8WeyQV8RV1Nag3nTASnMi8Hn8cnxxtVBgVVCAvbxa5haFgvlSFmu9ZleHxsrWd5Gh2wLzNmcFienfya5DZQrUQudrOpI4oSo1n?key=EzA7di632O4lwmUocJDFhw" class="kg-image" alt="Modelagem UML" loading="lazy"></figure><p>A UML nasceu da uni&#xE3;o de tr&#xEA;s metodologias de modelagem: o m&#xE9;todo de Booch, o m&#xE9;todo OMT (Object Modeling Technique) de Jacobson e o m&#xE9;todo OOSE (Object-Oriented Software Engineering) de Rumbaugh. Atualmente, ela encontra-se na vers&#xE3;o 2.5.1 e sua documenta&#xE7;&#xE3;o oficial pode ser encontrada em seu <a href="https://www.uml.org/">site oficial</a>.</p><p>A UML apresenta uma variedade de tipos de diagramas, que podem ser utilizados isoladamente ou complementando entre si. Assim, &#xE9; poss&#xED;vel analisar as m&#xFA;ltiplas vis&#xF5;es do sistema, observando seus diferentes aspectos.</p><p>A seguir, vamos falar um pouco de cada um deles.</p><h3 id="diagramas-estruturais">Diagramas Estruturais</h3><p>Os diagramas estruturais focam na representa&#xE7;&#xE3;o da estrutura est&#xE1;tica de um sistema, ou seja, como os elementos do sistema est&#xE3;o organizados e relacionados entre si. A seguir, temos os tipos de diagramas estruturais.</p><h3 id="diagrama-de-classe">Diagrama de Classe</h3><p>O principal objetivo &#xE9; visualizar as classes que ir&#xE3;o compor o sistema em quest&#xE3;o e demonstrar a din&#xE2;mica da rela&#xE7;&#xE3;o que existe entre elas. Al&#xE9;m das classes, tamb&#xE9;m seus atributos e m&#xE9;todos. Este diagrama serve de apoio para a constru&#xE7;&#xE3;o dos demais diagramas da UML. A seguir, temos um exemplo:<br></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdLFj242AFuie8nJIDHCH4vadOzuOvsNaK0rkS5H0Zvj-sqBzbxFIlT5NfsnztiLDH4RGaj3Eg-m7YkvgHNzYCWKlEjPBZNc_sUipZ4GZxkriUZJ1RL5_271gucUgTV9wqehVEC--735soR8__A7DFLCgNx?key=EzA7di632O4lwmUocJDFhw" class="kg-image" alt="Modelagem UML" loading="lazy"></figure><p>Na figura acima temos um exemplo de um sistema banc&#xE1;rio. Na UML, uma classe apresenta tr&#xEA;s informa&#xE7;&#xF5;es, que est&#xE3;o representadas como um ret&#xE2;ngulo com tr&#xEA;s divis&#xF5;es:</p><ul><li>Primeiro ret&#xE2;ngulo: nome da classe, ContaCorrente;</li><li>Segundo ret&#xE2;ngulo: os atributos e tipos de dados da classe;</li><li>Terceiro ret&#xE2;ngulo: os m&#xE9;todos (a&#xE7;&#xF5;es) da classe.</li></ul><h3 id="diagrama-de-objetos">Diagrama de Objetos</h3><p>Representa uma vis&#xE3;o est&#xE1;tica de um conjunto de objetos e suas associa&#xE7;&#xF5;es em um momento espec&#xED;fico. Tem como objetivo fornecer uma vis&#xE3;o dos valores armazenados pelos objetos das classes, definidas no diagrama de classes. Veja o exemplo abaixo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcK0jBiYSuHG0tkH5s2yyYJMvLA6kfrRBePwjTWDVphu_L_tUQ5UeGEXUn7xdbzydQxTIx_E4MH7QeDh1YNYplsDn_JPIkWtj-j7DlZafoy8uBD2M8nRHeFkDWO1FlFZp3xU2K-DbifRVgLFEHJ_jL3flL2?key=EzA7di632O4lwmUocJDFhw" class="kg-image" alt="Modelagem UML" loading="lazy"></figure><p>Neste exemplo, temos o v&#xED;nculo entre o objeto pessoaFis1 da classe PessoaFisica e o objeto corrente1 da classe ContaCorrente. Para cada uma das representa&#xE7;&#xF5;es dos objetos, tem-se a listagem dos seus respectivos atributos. Assim, infere-se que uma pessoa f&#xED;sica possui uma conta corrente.</p><h3 id="diagrama-de-componentes">Diagrama de Componentes</h3><p>Exibe os componentes do sistema e suas depend&#xEA;ncias, incluindo bibliotecas, m&#xF3;dulos e outras partes do software. Em outras palavras, exibe o relacionamento entre os diferentes componentes de um sistema.</p><h3 id="diagrama-de-pacotes">Diagrama de Pacotes</h3><p>Organiza os elementos do sistema em grupos l&#xF3;gicos, denominados pacotes, demonstrando a depend&#xEA;ncia entre eles e ajudando a estruturar e modularizar o sistema. Pode ser utilizado, por exemplo, para modelar divis&#xF5;es da arquitetura de uma linguagem, simplificando diagramas de classe complexos.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXenHrAtxj2BMJN5k3Wg_eiec8bJFo8wqAvbqQJMOmhXWGfjzz1MaSonhnTd6HJEdCRAD6h1kNuWXjLorOWcVlyKWlNlNbv_MLe8icgkF-pcgInpu4BViT2QtrbAjNcGoDWrzXjz7Q0WNgmvMYQGa7t4mPjF?key=EzA7di632O4lwmUocJDFhw" class="kg-image" alt="Modelagem UML" loading="lazy"></figure><p>O exemplo acima apresenta o pacote chamado Sistema de controle Banc&#xE1;rio, o qual engloba diversos elementos, como as classes Pessoa e Conta e suas respectivas classes-filhas.</p><h3 id="diagrama-de-implanta%C3%A7%C3%A3o">Diagrama de Implanta&#xE7;&#xE3;o</h3><p>O diagrama de implanta&#xE7;&#xE3;o apresenta um mapeamento da rela&#xE7;&#xE3;o entre os componentes de software e sua infraestrutura (hardware). Ele ajuda na visualiza&#xE7;&#xE3;o dos processadores, n&#xF3;s e dispositivos vinculados.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfqcZWebDqN20zzVG6EcHzl9roVfawX1iCrhJ8eYfVaBXg0ApANrzexRaap8iAoA0XnDc-wAedLmrjj9CtVn9smD3TmAwZLsB9gqXTmaAh8BCt987cBsIUspnzDcl_MQabN94A3OE9wn9-xj0BfG2xilFNl?key=EzA7di632O4lwmUocJDFhw" class="kg-image" alt="Modelagem UML" loading="lazy"></figure><h2 id="diagramas-comportamentais">Diagramas Comportamentais</h2><p>Os diagramas comportamentais s&#xE3;o usados para descrever o comportamento din&#xE2;mico do sistema, ou seja, como os componentes interagem, se comportam e trocam informa&#xE7;&#xF5;es ao longo do tempo. Eles ajudam a modelar os aspectos funcionais e interativos do sistema. Veja os tipos de diagramas comportamentais a seguir.</p><h3 id="diagrama-de-casos-de-uso">Diagrama de Casos de Uso</h3><p>Este diagrama demonstra o comportamento externo do sistema. A partir da perspectiva do usu&#xE1;rio, mostra as intera&#xE7;&#xF5;es entre atores (usu&#xE1;rios) e os casos de uso do sistema, focando nos cen&#xE1;rios de intera&#xE7;&#xE3;o. &#xC9; utilizado geralmente no in&#xED;cio da modelagem, durante o processo de levantamento e an&#xE1;lise de requisitos. Na figura abaixo temos um exemplo deste diagrama.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe7M9Ux9arH-YEnc80JY5nJ7ZdJ5xEjhuarIBWRaR3x_-GMoIYOZdx6exK4xr5uYR83GhqsMISy2G0UHCobG6YfpiGnc4ccDj8Db5nI6945y_oGCJWcLY4ygWCaqYUJdMRczj8zRINY95Eq7nC3cCLRUDhO?key=EzA7di632O4lwmUocJDFhw" class="kg-image" alt="Modelagem UML" loading="lazy"></figure><p>Em um sistema de vendas de uma livraria, temos os atores <strong>Vendedor </strong>e<strong> Gerente</strong>, os quais s&#xE3;o funcion&#xE1;rios e podem realizar a a&#xE7;&#xE3;o de <strong>vender livros</strong>.</p><h3 id="diagrama-de-atividades">Diagrama de Atividades</h3><p>Este diagrama modela o fluxo de atividades e a&#xE7;&#xF5;es dentro de um processo ou fun&#xE7;&#xE3;o, mostrando estados, transi&#xE7;&#xF5;es e decis&#xF5;es. Fornece uma visualiza&#xE7;&#xE3;o do comportamento de um sistema, descrevendo a sequ&#xEA;ncia de a&#xE7;&#xF5;es em um processo. Pode ser aplicado, por exemplo, na descri&#xE7;&#xE3;o de computa&#xE7;&#xE3;o procedural, ou na modelagem organizacional para processos de neg&#xF3;cios.</p><h3 id="diagrama-de-estado">Diagrama de Estado</h3><p>Descreve os diferentes estados pelos quais um objeto pode passar e as transi&#xE7;&#xF5;es entre esses estados.</p><h3 id="diagrama-de-intera%C3%A7%C3%A3o">Diagrama de Intera&#xE7;&#xE3;o</h3><p>O objetivo deste diagrama &#xE9; fornecer uma vis&#xE3;o geral do controle de fluxo, mostrando como os objetos interagem uns com os outros. Nele, temos os subtipos:</p><ul><li><strong>Diagrama da Vis&#xE3;o Geral da Intera&#xE7;&#xE3;o: </strong>permite ter um vis&#xE3;o geral do fluxo de controle de uma intera&#xE7;&#xE3;o para outra, bem como o fluxo de atividade de um diagrama para outro.<br></li><li><strong>Diagrama de Comunica&#xE7;&#xE3;o:</strong> descreve as rela&#xE7;&#xF5;es e intera&#xE7;&#xF5;es entre v&#xE1;rios objetos de software.<br></li><li><strong>Diagrama de Tempo:</strong> representa um conjunto de estados de um objeto ou sistema ao longo do tempo, mostrando eventos e transi&#xE7;&#xF5;es temporais. Com ele, &#xE9; poss&#xED;vel visualizar o fluxo em v&#xE1;rios instantes do tempo.<br></li><li><strong><strong>Diagrama de Sequ&#xEA;ncia:</strong></strong> representa a sequ&#xEA;ncia de intera&#xE7;&#xF5;es entre objetos ao longo do tempo, enfatizando quais mensagens devem ser disparadas e em qual ordem. Este diagrama baseia-se no diagrama de caso de uso, j&#xE1; que um caso de uso, geralmente, refere-se a um processo disparado por um ator. Veja o diagrama a seguir, que representa uma opera&#xE7;&#xE3;o em um sistema banc&#xE1;rio.<br></li></ul><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeLcsYaZS1hNIWbDi1p5XfdCf2kTn6zaX2uNRmx3OvJPhUwHyG9ruh-7HdsNpFVy_WyCz_I8TWhJodzHxZhApHyLkNo9PpXxa9p-M-DKom6ITmatpr3DMuZcHtw5Rw1bIhsB5beyKHnRAmWqOascP-L8Epp?key=EzA7di632O4lwmUocJDFhw" class="kg-image" alt="Modelagem UML" loading="lazy"></figure><p>No exemplo acima, temos o fluxo e ordem das mensagens disparadas durante a opera&#xE7;&#xE3;o de emiss&#xE3;o de extrato para uma conta corrente. A partir da inser&#xE7;&#xE3;o do cart&#xE3;o, ocorre:</p><ul><li>Verifica&#xE7;&#xE3;o da conta;</li><li>Solicita&#xE7;&#xE3;o da senha e verifica&#xE7;&#xE3;o da senha;</li><li>Sele&#xE7;&#xE3;o da op&#xE7;&#xE3;o desejada do sistema;</li><li>Gera&#xE7;&#xE3;o e emiss&#xE3;o do extrato banc&#xE1;rio.</li></ul><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--3.png" class="kg-image" alt="Modelagem UML" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--1---1--3.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--1---1--3.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="conclus%C3%A3o">Conclus&#xE3;o</h2><p>Como vimos, a UML &#xE9; uma linguagem visual padr&#xE3;o para modelagem de sistemas de software. Dentre suas diversas vantagens, podemos destacar o processo de facilitar a comunica&#xE7;&#xE3;o entre as equipes de desenvolvimento, permitindo uma apresenta&#xE7;&#xE3;o mais clara e compreens&#xED;vel do software projetado. Al&#xE9;m disso, possibilita documentar os requisitos, identificar problemas e elaborar solu&#xE7;&#xF5;es. O melhor entendimento do projeto e a detec&#xE7;&#xE3;o de erros antecipadamente, permitem desenvolver um produto mais eficiente.<br></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item><item><title><![CDATA[Criar uma aplicação web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV]]></title><description><![CDATA[<p></p><p>Dando continuidade a nossa s&#xE9;rie de artigos sobre como fazer um sistema de cadastro simples em Node.js, utilizando MongoDB e ExpressJS, desenvolvendo o CRUD.</p><p>Nesta quarta e &#xFA;ltima parte, iremos ver um conceito importante quando se trata da constru&#xE7;&#xE3;o de interfaces, que &#xE9;</p>]]></description><link>https://community.revelo.com.br/criar-uma-aplicacao-web-com-node-js-mongodb-mongoose-express-e-ejs-parte-iv/</link><guid isPermaLink="false">6716f2174a604c0001f9f6f5</guid><category><![CDATA[Node.js]]></category><category><![CDATA[Comunidade]]></category><dc:creator><![CDATA[Roberto de Luna Silva]]></dc:creator><pubDate>Tue, 22 Oct 2024 23:53:33 GMT</pubDate><media:content url="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Criar-uma-aplicac-a-o-web-com-Node.js--MongoDB--Mongoose--Express-e-EJS-Parte-IV.png" medium="image"/><content:encoded><![CDATA[<img src="https://community.revelo.com.br/content/images/2024/10/-----BLOG-COMMUNITY-BR---Criar-uma-aplicac-a-o-web-com-Node.js--MongoDB--Mongoose--Express-e-EJS-Parte-IV.png" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV"><p></p><p>Dando continuidade a nossa s&#xE9;rie de artigos sobre como fazer um sistema de cadastro simples em Node.js, utilizando MongoDB e ExpressJS, desenvolvendo o CRUD.</p><p>Nesta quarta e &#xFA;ltima parte, iremos ver um conceito importante quando se trata da constru&#xE7;&#xE3;o de interfaces, que &#xE9; a parte de modulariza&#xE7;&#xE3;o da p&#xE1;gina, onde utilizaremos o recurso chamado partial views do EJS, que &#xE9; a view engine que estamos utilizando com o framework Express js.</p><p>Para dar uma estilizada, usaremos o framework conhecido como Bootstrap, que &#xE9; amplamente utilizado para dar estrutura a aplica&#xE7;&#xF5;es web mais responsivas e com boas experi&#xEA;ncias para os usu&#xE1;rios.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--6.png" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--3--6.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--3--6.png 720w" sizes="(min-width: 720px) 720px"></a></figure><h2 id="o-que-%C3%A9-o-bootstrap">O que &#xE9; o Bootstrap?</h2><p>Em um breve resumo, o Bootstrap &#xE9; um framework front-end que nos fornece estruturas de CSS para cria&#xE7;&#xE3;o de sites e aplica&#xE7;&#xF5;es responsivas de forma bem simples e r&#xE1;pida. Tamb&#xE9;m funciona muito bem com sites para desktop e p&#xE1;ginas de dispositivos m&#xF3;veis.</p><h2 id="como-o-bootstrap-%C3%A9-distribu%C3%ADdo">Como o Bootstrap &#xE9; distribu&#xED;do?</h2><p>As 2 formas mais comuns de distribui&#xE7;&#xE3;o pelo <a href="https://getbootstrap.com/">site oficial</a> e <a href="https://www.npmjs.com/">npm</a>. Voc&#xEA; tamb&#xE9;m tem a op&#xE7;&#xE3;o de criar a sua pr&#xF3;pria distribui&#xE7;&#xE3;o, caso queira, utilizando o c&#xF3;digo-fonte, ou utilizando a pr&#xF3;pria rede de distribui&#xE7;&#xE3;o do Bootstrap conhecida como CDN do BootStrap. Basicamente, um CDN permite que um site da web recupere com frequ&#xEA;ncia arquivos que s&#xE3;o distribu&#xED;dos publicamente usados em servidores distribu&#xED;dos globalmente.</p><p>Mais a frente neste artigo, faremos a instala&#xE7;&#xE3;o para podermos dar aquela melhorada no visual da nossa aplica&#xE7;&#xE3;o.</p><h2 id="o-que-s%C3%A3o-partial-views">O que s&#xE3;o <em>Partial Views</em>?</h2><p>Depois desse breve resumo sobre o Bootstrap, voltamos para o assunto inicial. Mas afinal,o que s&#xE3;o essas Partial views? &#xC9; bastante comum quando estamos desenvolvendo uma aplica&#xE7;&#xE3;o que existam certas partes das telas (views) que se repetem. Tendo isso em mente, todas as linguagens de programa&#xE7;&#xE3;o para web possuem recursos de Partial Views, que s&#xE3;o justamente uma modulariza&#xE7;&#xE3;o da interface, separando-a em &#x201C;partes&#x201D; da tela, constru&#xED;das separadas e depois montadas em conjunto para que o usu&#xE1;rio veja apenas o resultado final.</p><p>Nossa aplica&#xE7;&#xE3;o &#xE9; bem simples e por isso possui apenas 3 views, sendo elas: <em>index</em>, <em>new</em> e <em>error</em>, conforme vemos abaixo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfbsgMmUodJJug9Ff0I_FxeSaSBXNG5IW0t9oHK3HepZjx1X0GpIdWpR1SMSjxRJbW55YGYTC-nxI-ml4J_gmAyWm2cLPWWmGBihFQkahJR_OQz8YkWXAWAWyJNOaUbwo-J6w1Omu1qVhwQqpVgh3MWS3N3?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>A estrutura acima &#xE9; bem b&#xE1;sica, logo, n&#xE3;o teria necessidade de fazer essa modulariza&#xE7;&#xE3;o com Partial Views, vamos abordar aqui apenas para conhecimento/entendimento, tamb&#xE9;m para mostrar que &#xE9; um poderoso conceito, al&#xE9;m de tornar seu frontend mais leg&#xED;vel e elegante, torna o desenvolvimento de novas p&#xE1;ginas de uma forma muito mais &#xE1;gil, pois aproveita os elementos gen&#xE9;ricos criados apenas uma vez, sendo utilizado em outras telas.</p><p>Se formos at&#xE9; as nossas views index.ejs e new.ejs, podemos notar que em ambas existem muitas tags em comum no come&#xE7;o e no fim delas.</p><p><strong>Index:</strong></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf93eS1SwS7PDHx_FWuHhVqqDDtZyhW4OI3_Wr1J_jRg28xwRXoMsNPDtE6oVh_DO8vJo5cbaRnIKTiXXjmoeTs8HnNx4LhGLsxyCq6JUMLSwQaWY0QgrUyMcjUExUG0SmjGMu3hTO4gc8TuCHbdFyxibo?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p><strong>New:</strong></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdTPaIK0FVhjMIRvOy351sdRchUfrh4cp54t6iKSVlDvHMnB5oQqAIH9qmqifOvkgdxkVnejf_CgaLyytFY75Fo8Ue7skUfCUBvkbSKaXaQaFZJESktWEFwArk2dym86gprHMyAAlhzaD1sLCDRFm7CmRo?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Vamos come&#xE7;ar por elas.</p><h2 id="partial-view-com-ejs">Partial View com EJS</h2><p>O EJS possui a funcionalidade de criar partial views de forma bem f&#xE1;cil. Come&#xE7;aremos criando um arquivo top.ejs na pasta views. Top ser&#xE1; referente ao <em>TOPO </em>da nossa p&#xE1;gina e nele iremos adicionar toda estrutura da parte comum que teremos em todas as views da nossa aplica&#xE7;&#xE3;o. No arquivo criado, adicione a estrutura abaixo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfjN722prZYazj1AJ3QtwTNQlpXKCLExfGPjRJG7Y7iPXRMo-jL8xWBCkrqy7T-HEE3q6bC7hiLjBWrwgrV7XYZL3lbh2b3m5B59J8HpEdaN-cJtV1l7ifhiTaDxy9Uh2iX0i0YvERn_BcXVWHpAqUmbsny?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>No c&#xF3;digo acima, no arquivo top.ejs, podemos notar algumas vari&#xE1;veis JS que dever&#xE3;o vir do nosso backend, atrav&#xE9;s do model que &#xE9; passado na nossa fun&#xE7;&#xE3;o render do Node.js.</p><p>Em seguida, n&#xF3;s iremos criar um segundo arquivo dentro da pasta views, esse arquivo ir&#xE1; se chamar bottom.ejs, bottom ser&#xE1; referente ao <em>RODAP&#xC9; </em>e nele vamos adicionar apenas 2 linhas por enquanto:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd9l19s_58-gnaArcP6TTPUOLzu_OUgMg6FUZhe4yJpoOGDhNtnlhuKPYGbB4izyCyvVsAFzYQdW3Bp5-xxYGX6gQEjX-EFbARL-XkY3k5vQKma-AnEfyXUjTMV04DCtoHjXP8A7dVepvWLG_ZaYDSM_d8k?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Agora voc&#xEA; deve estar se perguntando como fazemos para que uma view possa utilizar essas partial views que acabamos de criar. Pois bem, vamos come&#xE7;ar indo at&#xE9; a nossa index.ejs e no topo do arquivo remova a parte que &#xE9; repetida dentro do top.ejs e no lugar do peda&#xE7;o de c&#xF3;digo exclu&#xED;do, use o <em>include</em> como demonstraremos abaixo para <em>incluir </em>a nossa partial view na primeira linha do arquivo, ficando da seguinte forma:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeRGsUNWFMOLfMmywdNGnus2TaJ-HiqxuWRz7k6jb67jiRRUrnrawDgdsj_PHYpVxyAAdcVIzx-kxCcKKbEoQIWCW-CDseC3BtgQMmTdZo7Tk6ctgzq4pjQJhxF0O5nZs6tRdJeV_Zu_DfZKDYpBjMdEKqz?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>E na parte de baixo, faremos o mesmo com o bottom.ejs:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf1eWcq8sz1ie7KQWWAIwR7Mc0cTiWjePCbE-FtSPZD5u8GybJ_l6f2KTilK_Vm_MhD69KVq3lGAlMY_F2Dlq3JUkP1c0nKI_SwM_0f0AYaMUHDvRiWa83GYyIHYT5f4IUAoN2-GVR1TpGkAtJ0ztvUGYPT?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Ap&#xF3;s o processo acima, quando o arquivo HTML for ser constru&#xED;do para que possa ser enviado ao browser para ser renderizado, o EJS vai ler a primeira linha e entender que a parte HTML dessa linha, vem de outro arquivo, ent&#xE3;o ir&#xE1; at&#xE9; esse arquivo, copiar&#xE1; seu conte&#xFA;do e utilizar&#xE1; neste local.</p><p>Observe que com apenas esses 2 includes utilizados, temos nossa aplica&#xE7;&#xE3;o modularizada em 3 partes, top = topo, center = centro, bottom = rodap&#xE9;, o que facilita a manuten&#xE7;&#xE3;o e reuso do c&#xF3;digo.</p><p>Tendo em mente que agora podemos reutilizar o nosso c&#xF3;digo, faremos as mesmas substitui&#xE7;&#xF5;es no arquivo new.ejs e error.ejs para n&#xE3;o precisarmos mais repetirmos os blocos de c&#xF3;digos no come&#xE7;o e no fim de nossos arquivos HTML. Como nossa aplica&#xE7;&#xE3;o &#xE9; bem simples, n&#xE3;o d&#xE1; para notar o quanto temos de ganho, mas caso fa&#xE7;amos aplica&#xE7;&#xF5;es maiores, os ganhos e facilita&#xE7;&#xF5;es para manuten&#xE7;&#xE3;o do nosso c&#xF3;digo fazem total diferen&#xE7;a.</p><p>Vamos come&#xE7;ar pelo arquivo error.ejs:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXev8kPE1tvJtIwuPCuqcXrNRJDFyLWxl6K1V1DaTqh4ZgKy3Aw9e-y5QSdBw4HuBfXAWog0IWGlBY9UuV0dP3eNR6iQkYaDWCE6m7GXt-VmAueqWFPkxT5DbEdB0G_dXIh0PzYvCOTvsTA4PO9qVSVfSHg?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p><strong>E new.ejs:</strong></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcCm4-ZAhImJYRx48RLk0tUqrRdMCyZMx4j1wMpFLFtZDWaHCNIKBlyIRnEeDzEub00q9lwcrE6YQojFyoQReihxeDWPiFTml0oGknhx7MKpg6F3IqIuHNG9WDE9TpsbARw_HYubT95vJgtZXgRQcEsyfr1?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Depois de feitas as altera&#xE7;&#xF5;es acima, rode novamente sua aplica&#xE7;&#xE3;o Node como fazemos, lembre-se de subir seu banco do MongoDB tamb&#xE9;m e voc&#xEA; ir&#xE1; notar que tudo rodou direitinho mas que nada mudou para o usu&#xE1;rio. Tudo &#xE9; renderizado igualmente como era antes, mas tenha em vista que as altera&#xE7;&#xF5;es que fizemos, servem para tornar a nossa vida de desenvolvedor mais f&#xE1;cil.</p><p>O nosso pr&#xF3;ximo passo aqui ser&#xE1; adicionar o framework de frontend que vamos utilizar e que resumi de forma breve no come&#xE7;o deste artigo. Voc&#xEA; tamb&#xE9;m notar&#xE1; como ser&#xE1; mais f&#xE1;cil fazermos a &#x201C;manuten&#xE7;&#xE3;o&#x201D; do nosso c&#xF3;digo ap&#xF3;s essa modulariza&#xE7;&#xE3;o.</p><h2 id="adicionando-o-bootstrap-ao-projeto">Adicionando o Bootstrap ao projeto</h2><p>Vamos come&#xE7;ar adicionando as duas depend&#xEA;ncias do Bootstrap que podem ser obtidas neste <a href="https://getbootstrap.com/docs/5.0/getting-started/introduction/">link</a> do site oficial. A primeira delas &#xE9; a de CSS e deve ser adicionada no topo do nosso arquivo top.ejs, substituindo a chama antiga do CSS que estava no arquivo:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeW7V23EHPO3l3LFyzsHKmaJscG9VgHBO6ILIGntBJrJIqch7n_3ZRC6X-E-CY5jq6J_oVeU483p7voiqoDCBF21s8qVw_YzDAxnot3NpNQqUgLVNZ-S5olotbLvd2xEIfeKLQM5E_3AWmIak-F6Scgsf8?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Como adicionamos o c&#xF3;digo acima no top.ejs, agora todas as telas que utilizam essa partial view v&#xE3;o estar com o CSS do Bootstrap adicionada a elas. Note a produtividade que tivemos, se pararmos para pensar, imaginem uma aplica&#xE7;&#xE3;o com 12 telas e voc&#xEA; tendo que mexer de uma por uma para fazer a manuten&#xE7;&#xE3;o do c&#xF3;digo?</p><p>Observe que adicionei duas meta-tags como o que a p&#xE1;gina do Bootstrap no link acima sugere, isso garante maior compatibilidade com os recursos que o framework oferece e tamb&#xE9;m tem a responsividade em dispositivos m&#xF3;veis.</p><p>Nosso pr&#xF3;ximo arquivo que ser&#xE1; modificado ser&#xE1; o bottom.ejs. Iremos agora adicionar o script JS necess&#xE1;rio para o funcionamento do Bootstrap, ele ser&#xE1; adicionado logo antes da tag &lt;/body&gt;. Ficando da seguinte forma:</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXekEXuJQCpzLfX0Z45-lVVMZ5I3L_84EU7jUErAxdEx0co4xc4zSSUYsRpW5N0UdrtJ7dgHwRDp7KMtZNz-Tdziceqj5w0GdhkyMKHwjy4AOFPeTlsiWrCBDp-_Ckfc09ZLiNZUVDvflUiWvr_KeqYoGNTn?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>S&#xF3; com essas leves mudan&#xE7;as que fizemos, rode a aplica&#xE7;&#xE3;o e veja os novos efeitos visuais da nossa aplica&#xE7;&#xE3;o.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeE_T_M_rBV5K2PTbNYvrb-f2xIu_Z7l0ymyofuvYhT8ZekFEaWXiDvTHo5_83vOgUp7wSXeVeevPtJmauACTtj6PxWrtmZSE-RVqKvrATOBAkYZNlB5cNynxU5A-UcgwoYTZ4dLmia-On9JqYO0ElbnzLn?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Mas sempre podemos melhorar nossa aplica&#xE7;&#xE3;o de alguma forma, vamos agora usar alguns dos &#x201C;poderes&#x201D; do Bootstrap para que fa&#xE7;amos algumas altera&#xE7;&#xF5;es na nossa estrutura, como tamb&#xE9;m usar algumas classes CSS definidas pelo Bootstrap.</p><p>Nosso primeiro passo, ser&#xE1; come&#xE7;ar definindo uma div class <em>container </em>que vai englobar toda a parte de conte&#xFA;do do body das nossas telas. Para fazermos isso, basta que adicionemos o conjunto de tags div que mostrarei abaixo, mas basicamente voc&#xEA; ter&#xE1; que abrir a div no top.ejs e fechar no bottom.ejs de modo que ambas fiquem dentro do body.</p><p><strong>top.ejs:</strong></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXemiv1U1cxSGpf6dA4ST_amLeGfSXyasnSllbAypol72NtMFCjLMEzhLuPSQFDuoD7KQ2r9kadNW2HbSTNQqhSrD7l-UKY1XW106FXuOlIUwQrPle4EEw75qFpyiavN1Vwr6cQqb4jTEONc1LqNDKsPZb5B?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Observe que mudamos apenas uma linha, logo acima da tag H1, bem no fim do arquivo top.ejs.</p><p><strong>bottom.ejs:</strong></p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcwU-DANLdNcHcloxdTAXa25wMD8CbIzJzW8G8GtfqEWrO2r5O38M15602HSw_2VDaUHsvkccgzBA5-OFSho0-8swvx5FBmJ4tV2JiJHGHimKMPOSSkfcMtrHym_BNGXFY2cMhPiRaO-a_7Zk_YYb_oFKkM?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>Note que no arquivo bottom.ejs tamb&#xE9;m mudamos apenas uma linha que fica bem no come&#xE7;o do arquivo.</p><p>Ap&#xF3;s essa mudan&#xE7;a nos arquivos j&#xE1; teremos uma mudan&#xE7;a mais percept&#xED;vel nas p&#xE1;ginas j&#xE1; existentes, que ter&#xE3;o uma margem maior e estar&#xE3;o centralizadas de outra forma.</p><figure class="kg-card kg-image-card"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdKGkSPqr_qSd-52dY2gkVBcdk5-M6sA9MzaZEF2zLBi9g1mXYzMSvKu1HcQlorLQ9HjdU2vC68sTlQNfMxTY25wNYXqdeD_YQnrolIY3nt0Hgd_Sd4KG6Hb__DD55689J41o2IYTVMprQieoeunBOPgms?key=a66DiommilSdHdcANkCFBw" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy"></figure><p>A div container que criamos faz a sua p&#xE1;gina funcionar em um grid-system de 12 colunas, ou seja, o Bootstrap permite que possamos organizar os conte&#xFA;dos de nossas p&#xE1;ginas em 12 blocos que possuem tamanhos iguais. Se voc&#xEA; organizar direitinho utilizando o espa&#xE7;o que foi disponibilizado, a sua aplica&#xE7;&#xE3;o web ser&#xE1; responsiva, alterando seus conte&#xFA;dos conforme a tela do aparelho que estiver acessando a mesma precisar.</p><figure class="kg-card kg-image-card"><a href="https://www.revelo.com.br/"><img src="https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--6.png" class="kg-image" alt="Criar uma aplica&#xE7;&#xE3;o web com Node.js, MongoDB, Mongoose, Express e EJS - Parte IV" loading="lazy" width="720" height="150" srcset="https://community.revelo.com.br/content/images/size/w600/2024/10/CTA_Blog_Revelo--2--6.png 600w, https://community.revelo.com.br/content/images/2024/10/CTA_Blog_Revelo--2--6.png 720w" sizes="(min-width: 720px) 720px"></a></figure><p>Espero que essa s&#xE9;rie de artigos possam ajudar voc&#xEA;s a terem uma no&#xE7;&#xE3;o melhor de como construir uma aplica&#xE7;&#xE3;o web b&#xE1;sica utilizando Node.JS, MongoDB, ExpressJS e EJS. Tendo em vista que essa aplica&#xE7;&#xE3;o pode ser usada em v&#xE1;rios tipos de servi&#xE7;o diferentes, tamb&#xE9;m aconselho se aprofundar mais um pouco na parte de Bootstrap, pois, o frontend de fato n&#xE3;o foi desenvolvido aqui neste artigo, trouxe apenas uma introdu&#xE7;&#xE3;o e mostrei como adicionar o Bootstrap na sua aplica&#xE7;&#xE3;o.</p><p>Em um pr&#xF3;ximo artigo, farei a parte de estiliza&#xE7;&#xE3;o da nossa aplica&#xE7;&#xE3;o para abrir um leque maior de possibilidades e melhor explicar como o Bootstrap pode ser &#xFA;til realmente. Irei criar o reposit&#xF3;rio com os c&#xF3;digo-fonte dessa s&#xE9;rie que conclu&#xED;mos aqui e disponibilizarei o link para o melhor acompanhamento do conte&#xFA;do.</p><p>Tamb&#xE9;m trarei esse conte&#xFA;do referente ao CRUD em uma outra linguagem na nossa pr&#xF3;xima s&#xE9;rie de artigos, a linguagem JAVA.</p><p></p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As opini&#xF5;es e coment&#xE1;rios expressos neste artigo s&#xE3;o de propriedade exclusiva de seu autor e n&#xE3;o representam necessariamente o ponto de vista da Revelo. <br><br>A <strong>Revelo Content Network</strong> acolhe todas as ra&#xE7;as, etnias, nacionalidades, credos, g&#xEA;neros, orienta&#xE7;&#xF5;es, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclus&#xE3;o e crescimento na carreira dos profissionais de tecnologia.</div></div>]]></content:encoded></item></channel></rss>