<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Rafael Fontenelle - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Rafael Fontenelle - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 28 May 2026 16:39:28 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/rafael-fontenelle/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ MBR x GPT: qual a diferença entre uma partição MBR e uma partição GPT? [Resolvido] ]]>
                </title>
                <description>
                    <![CDATA[ Se você está montando um PC, podem ter perguntado a você como desejava instalar seu sistema operacional – MBR ou GPT? As diferenças entre uma partição MBR e GPT são bastante diretas. Porém, há muitas informações básicas que o ajudarão a ter uma ideia mais clara sobre cada tipo de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/mbr-x-gpt-qual-a-diferenca-entre-uma-particao-mbr-e-uma-particao-gpt-resolvido/</link>
                <guid isPermaLink="false">63f6213dc24870050d79dbff</guid>
                
                    <category>
                        <![CDATA[ Tecnologia ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Wed, 07 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/5f9c9842740569d1a4ca190c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/mbr-vs-gpt-whats-the-difference-between-an-mbr-partition-and-a-gpt-partition-solved/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">MBR vs GPT: What's the Difference Between an MBR Partition and a GPT Partition? [Solved]</a>
      </p><p>Se você está montando um PC, podem ter perguntado a você como desejava instalar seu sistema operacional – MBR ou GPT?</p><p>As diferenças entre uma partição MBR e GPT são bastante diretas. Porém, há muitas informações básicas que o ajudarão a ter uma ideia mais clara sobre cada tipo de tabela de partição e quando você deve escolher uma em detrimento da outra.</p><p>Neste artigo, abordaremos o que é uma partição, a diferença entre uma partição MBR e GPT, se você deve atualizar de um tipo de partição para outro e muito mais.</p><h2 id="o-que-uma-parti-o"><strong>O que é uma partição?</strong></h2><p>Uma partição é uma divisão virtual de uma unidade de disco rígido (em inglês, <em>hard disk drive</em> ou HDD) ou unidade de estado sólido (em inglês, <em>solid state drive</em> ou SSD). Cada partição pode variar em tamanho e, normalmente, cumpre uma função diferente.</p><p>Por exemplo, no Windows geralmente há uma pequena partição de recuperação e uma grande partição de sistema de arquivos denominada <code>C:</code>. A partição <code>C:</code> é o que a maioria das pessoas conhece, pois é onde você geralmente instala seus programas e armazena seus vários arquivos.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/disk-management.png" class="kg-image" alt="disk-management" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/disk-management.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/disk-management.png 805w" width="805" height="597" loading="lazy"><figcaption>Gerenciador de discos do Windows - <a href="https://docs.microsoft.com/en-us/windows-server/storage/disk-management/overview-of-disk-management">Fonte</a></figcaption></figure><p>No Linux, normalmente há uma partição raiz (<code>/</code>), uma para swap – que ajuda no gerenciamento de memória – e uma grande partição <code>/home</code>. A partição <code>/home</code> é semelhante à partição <code>C:</code> no Windows, pois é onde você instala a maioria dos seus programas e armazena arquivos.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/yCyXA.png" class="kg-image" alt="yCyXA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/yCyXA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/yCyXA.png 781w" width="781" height="537" loading="lazy"><figcaption>GParted no Linux – <a href="https://bbs.archlinux.org/viewtopic.php?id=155698">Fonte</a></figcaption></figure><p>Se você comprou seu computador em uma loja e o sistema operacional já está instalado, o fabricante já cuidou das partições. Você não precisa se preocupar com elas, a menos que queira fazer algo como <em>dual-boot</em> de Windows e Linux a partir do mesmo HDD ou SDD.</p><p>Mesmo que você mesmo esteja instalando o sistema operacional, na maioria das vezes, o instalador vai sugerir partições e tamanhos de partição padrão.</p><p>Novamente, você geralmente não precisa fazer nenhum ajuste.</p><p>Agora que você tem uma visão geral de alto nível do que é uma partição, podemos nos aprofundar nas diferenças entre as partições MBR e GPT.</p><p>Observação: usarei o termo "unidade" para me referir a HDDs e SSDs de agora em diante.</p><h2 id="uma-vis-o-geral-de-parti-es-mbr-e-gpt"><strong>Uma visão geral de partições MBR e GPT </strong></h2><p>Antes que uma unidade possa ser dividida em partições individuais, ela precisa ser configurada para usar um esquema ou tabela de partição específica.</p><p>Uma tabela de partições informa ao sistema operacional como as partições e os dados na unidade são organizados. Por exemplo, as capturas de tela acima mostram as tabelas de partição na unidade e cada partição individual é mostrada como um bloco retangular.</p><p>Existem dois tipos principais de tabelas de partição: MBR e GPT.</p><p>MBR significa <em>Master Boot Record</em> (em português, registro mestre de inicialização) e é um pouco de espaço reservado no início da unidade que contém as informações sobre como as partições são organizadas. O MBR também contém o código para iniciar o sistema operacional e, às vezes, é chamado de <em>Boot Loader</em> (em português, carregador de inicialização).</p><p>GPT é uma abreviação de <em>GUID Partition Table</em> (em português, tabela de partição GUID) e é um padrão mais recente que está substituindo lentamente o MBR.</p><p>Ao contrário de uma tabela de partição MBR, o GPT armazena os dados sobre como todas as partições são organizadas e como inicializar o sistema operacional em toda a unidade. Desse modo, se uma partição for apagada ou corrompida, ainda será possível inicializar e recuperar alguns dos dados.</p><p>Se você comprou seu computador nos últimos cinco anos, é muito provável que ele esteja usando tabelas de partição GPT em vez das tabelas MBR mais antigas.</p><h2 id="diferen-as-entre-as-parti-es-mbr-e-gpt"><strong>Diferenças entre as partições MBR e GPT </strong></h2><p>Existem várias diferenças entre as partições MBR e GPT, mas abordaremos algumas das principais aqui.</p><p>Primeiro, a capacidade máxima das tabelas de partição MBR é de apenas 2 terabytes. Você pode usar uma unidade com mais de 2 terabytes com MBR, mas apenas os primeiros 2 terabytes da unidade serão usados. O restante do armazenamento na unidade será desperdiçado.</p><p>Por outro lado, as tabelas de partição GPT oferecem uma capacidade máxima de 9,7 zetabytes. 1 zetabyte é cerca de 1 bilhão de terabytes. Então, é improvável que você fique sem espaço tão cedo.</p><p>Em seguida, as tabelas de partição MBR podem ter no máximo 4 partições separadas. No entanto, uma dessas partições pode ser configurada para ser uma partição estendida, que é uma partição que pode ser dividida em 23 partições adicionais. Portanto, o número máximo absoluto de partições que uma tabela de partições MBR pode ter é de 26 partições.</p><p>As tabelas de partição GPT permitem até 128 partições separadas, o que é mais do que suficiente para a maioria das aplicações do mundo real.</p><p>Como o MBR é mais antigo, geralmente vem junto com sistemas BIOS legados mais antigos, enquanto o GPT é encontrado em sistemas UEFI mais recentes. Isso significa que as partições MBR têm melhor compatibilidade de software e hardware, embora o GPT esteja começando a alcançá-lo.</p><p>Daremos uma breve olhada no BIOS legado e no UEFI um pouco mais adiante neste artigo.</p><h2 id="voc-deve-atualizar-de-mbr-para-gpt"><strong>Você deve atualizar de MBR para GPT?</strong></h2><p>Se uma de suas unidades estiver usando uma tabela de partição MBR, você pode estar se perguntando se deve atualizar para o padrão GPT mais recente.</p><p>Resumindo, provavelmente, não. Como diz o ditado, se não está quebrado, não conserte.</p><p>É muito fácil arruinar o setor MBR da unidade, impossibilitando a inicialização novamente. Você precisará criar uma unidade USB de recuperação com Windows ou Linux e tentar reparar o MBR ou limpar completamente a unidade e reinstalar o sistema operacional.</p><p>Falo isso por experiência própria: não vale a dor de cabeça.</p><p>Dito isso, há alguns casos em que você pode considerar atualizar de MBR para GPT.</p><p>Por exemplo, talvez você queira atualizar sua unidade para uma com mais de 2 terabytes ou precise de mais de 26 partições. Mesmo nesses casos, você precisará certificar-se de que seu hardware pode suportar uma tabela de partições GPT e um BIOS UEFI.</p><p>Se você fez a pesquisa e tem certeza de que deseja passar a usar o GPT, certifique-se de ter um backup de sua unidade e de todos os dados importantes. Na pior das hipóteses, você poderá reverter sem precisar reinstalar tudo e começar do zero.</p><h2 id="uma-vis-o-geral-do-bios"><strong>Uma visão geral do BIOS</strong></h2><p>Eu mencionei o BIOS algumas vezes antes. Embora esteja um pouco fora do escopo deste artigo, é necessário um entendimento básico do BIOS para entender uma das diferenças principais entre as partições MBR e GPT.</p><p>BIOS significa <em>Basic Input/Output System</em> (em português, Sistema Básico de Entrada/Saída) e é o software armazenado em um chip na placa-mãe de um computador que é executado quando você o liga pela primeira vez.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/xThDu5d.jpg" class="kg-image" alt="xThDu5d" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/xThDu5d.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/xThDu5d.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/xThDu5d.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/xThDu5d.jpg 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1500" loading="lazy"><figcaption>Um chip de BIOS em uma placa-mãe da Gigabyte – <a href="https://forums.tomshardware.com/threads/gigabyte-ab350-gaming-3-cpu-led-on-no-posting.3103246/">Fonte</a></figcaption></figure><p>O BIOS faz coisas como configurar o teclado, mouse e outros hardwares, definir o relógio do sistema, testar a memória e assim por diante. Em seguida, ele procura uma unidade e inicia o <em>boot loader</em> (carregador de inicialização) na unidade, que é uma tabela de partição MBR ou GPT.</p><p>Normalmente, quando você liga o computador pela primeira vez, verá um logotipo do fabricante do computador ou da placa-mãe.</p><p>Muitas vezes, há uma mensagem abaixo do logotipo dizendo qual tecla pressionar para configurar o BIOS do computador. Essa tecla geralmente é Delete (ou Del), Escape (ou ESC) ou F2, embora varie de acordo com o fabricante.</p><p>Conforme mencionado anteriormente, existem dois tipos principais de BIOS – BIOS legado e BIOS UEFI:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/windows-boot-screen-bios.jpg" class="kg-image" alt="windows-boot-screen-bios" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/windows-boot-screen-bios.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/windows-boot-screen-bios.jpg 900w" width="900" height="506" loading="lazy"><figcaption>Uma tela de configuração de BIOS legado – <a href="https://fossbytes.com/intel-end-legacy-bios-support-2020-uefi/">Fonte</a></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/29143-uefiasus.jpg" class="kg-image" alt="29143-uefiasus" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/29143-uefiasus.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/29143-uefiasus.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/29143-uefiasus.jpg 1024w" width="1024" height="501" loading="lazy"><figcaption>Uma tela de configuração de BIOS UEFI – <a href="https://www.tested.com/tech/pcs/2894-what-you-should-know-about-uefi-and-windows-boot-times/">Fonte</a></figcaption></figure><p>BIOS legados são mais antigos e são totalmente controlados por teclado. Eles geralmente são simples em termos de interface do usuário e têm uma cor de fundo preta ou azul semelhante à <em>tela preta/azul da morte </em>do Windows.</p><p>UEFI significa <em>Unified Extensible Firmware Interface</em> (em português, Interface Unificada de Firmware Extensível) e pode ser considerado um tipo mais recente de BIOS. O UEFI geralmente inclui gráficos para mostrar a velocidade da ventoinha, temperatura e velocidades de <em>clock </em>da CPU e, às vezes, pode ser controlado com um mouse ou trackpad.</p><h2 id="bios-de-mbr-e-gpt"><strong>BIOS de MBR e GPT</strong></h2><p>Como o MBR é um padrão mais antigo, ele é emparelhado com os sistemas BIOS legados (e o BIOS legado só pode acessar unidades com uma partição MBR). Isso não é necessariamente ruim, pois o suporte para BIOS legado é melhor.</p><p>Novamente, contudo, uma das limitações mais óbvias das partições MBR é que ela só pode lidar com unidades de até 2 terabytes.</p><p>O padrão GPT mais recente é emparelhado com sistemas BIOS UEFI. Embora o suporte para GPT e BIOS UEFI não seja tão bom quanto MBR/BIOS legado, ele está ganhando terreno.</p><p>Mais fabricantes estão migrando para BIOS UEFI, que, por sua vez, exige que as unidades usem o formato GPT mais recente. No entanto, o requisito para unidades formatadas em GPT vem com a vantagem de uma capacidade muito maior e até 128 partições.</p><h2 id="para-encerrar"><strong>Para encerrar</strong></h2><p>Embora entender a diferença entre as partições MBR e GPT seja um pouco como descascar uma cebola, espero que você tenha passado por isso sem chorar.</p><p>Se tudo o que você deseja é uma referência rápida para as diferenças entre as partições MBR e GPT, aqui está uma tabela útil:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(255, 255, 255); color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);"></th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--gray10);">MBR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--gray10);">GPT</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Capacidade máxima</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">2TB</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">9,7ZB (~9,7 bilhões de terabytes)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Máximo de partições</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">26</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">128</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Local dos dados de inicial./partição</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">No início da unidade</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">Por toda a unidade</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Tipo de BIOS</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">BIOS legado</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">UEFI</td></tr></tbody></table><!--kg-card-end: html--><p>Não se esqueça de não ser como o meu eu mais jovem – certifique-se de ter um backup antes de mexer nas partições. Na verdade, faça dois backups. 🙂</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que é um boilerplate e por que o usamos? A necessidade de um guia de estilo de código ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Meet Zaveri Em Tecnologia da Informação, um boilerplate é uma unidade de escrita que pode ser reutilizada continuamente sem alteração. Por extensão, a ideia às vezes é aplicada à programação reutilizável, como em "código boilerplate". Contratos legais, incluindo termos e condições de software e hardware, fazem uso abundante ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-um-boilerplate-e-por-que-o-usamos-a-necessidade-de-um-guia-de-estilo-de-codigo/</link>
                <guid isPermaLink="false">63ea453758018c06027beae3</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Tue, 06 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_hrjnxp5fCjg2Hxv8IrImcg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/whats-boilerplate-and-why-do-we-use-it-let-s-check-out-the-coding-style-guide-ac2b6c814ee7/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is boilerplate and why do we use it? Necessity of coding style guide</a>
      </p><p>Escrito por: Meet Zaveri</p><p>Em Tecnologia da Informação, um <em>boilerplate</em> é uma unidade de escrita que pode ser reutilizada continuamente sem alteração. Por extensão, a ideia às vezes é aplicada à programação reutilizável, como em "código <em>boilerplate</em>".</p><p>Contratos legais, incluindo termos e condições de software e hardware, fazem uso abundante de <em>boilerplates</em>.</p><p>Por exemplo, um advogado pode dar a você um contrato de cinco páginas para assinar, mas a maior parte do contrato contém um texto padrão (<em>boilerplate</em>) – o que significa que é o mesmo para todos aqueles que recebem esse contrato, com apenas algumas linhas alteradas aqui e ali.</p><p>Na programação de computadores, o <strong>código <em>boilerplate</em></strong> ou <em><strong>boilerplate</strong></em> refere-se a seções de código que devem ser incluídas em muitos lugares com pouca ou nenhuma alteração. É frequentemente usado quando se refere a linguagens consideradas verborrágicas, ou seja, o programador deve escrever muito código para fazer trabalhos mínimos.</p><p>Por exemplo, no desenvolvimento para a web, um <em>boilerplate</em> simples para HTML ficaria assim:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html class="no-js" lang=""&gt;
    &lt;head&gt;
        &lt;meta charset="utf-8"&gt;
        &lt;meta http-equiv="x-ua-compatible" content="ie=edge"&gt;
        &lt;title&gt;&lt;/title&gt;
        &lt;meta name="description" content=""&gt;
        &lt;meta name="viewport" content="width=device-width, initial- scale=1, shrink-to-fit=no"&gt;
        &lt;link rel="stylesheet" href="css/main.css"&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;p&gt;Hello world! This is HTML5 Boilerplate.&lt;/p&gt;
        &lt;script src="js/vendor/modernizr-{{MODERNIZR_VERSION}}.min.js"&gt;&lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p>Você pode ver todo o repositório aqui:</p><p><a href="https://github.com/h5bp/html5-boilerplate" rel="noopener"><strong><strong>h5bp/html5-boilerplate</strong></strong></a><strong> – </strong>um modelo de <em>front-end</em> profissional para criar aplicativos web ou sites rápidos, robustos e adaptáveis.</p><p>Na década de 1890, o <em>boilerplate</em> era, na verdade, fundido ou estampado em metal pronto para a impressão e distribuído para editoras de jornais e empresas nos Estados Unidos. Até a década de 1950, milhares de jornais recebiam e usavam o <em>boilerplate</em> do maior fornecedor do país, a Western Newspaper Union. Algumas empresas também enviavam comunicados à imprensa como <em>boilerplates</em>, de modo que tinham de ser impressos conforme eram escritos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_QQnxLRyGkTqHamqONvrftA.png" class="kg-image" alt="1_QQnxLRyGkTqHamqONvrftA" width="500" height="375" loading="lazy"></figure><p>A maioria dos desenvolvedores para a web profissionais criou uma coleção de recursos e trechos de código que eles reutilizam em projetos para acelerar o desenvolvimento. Existem alguns padrões universais ou quase universais que todos os sites têm em comum. Em vez de reconstruí-los continuamente, a maioria dos desenvolvedores começa copiando o código usado para um projeto semelhante e, em seguida, começa a modificá-lo.</p><p>Alguns desenvolvedores reconhecem o valor desses modelos <em>boilerplate</em> iniciais e reservam um tempo para torná-los mais genéricos e compartilhá-los <em>on-line</em> para que outros possam usá-lo.</p><p>Isso não se limita apenas ao desenvolvimento para web. O <em>boilerplate </em>também é usado em AI/ML, pois há mais <em>frameworks</em> e bibliotecas em crescimento.</p><h4 id="caracter-sticas-necess-rias-ao-boilerplate-para-projetos-grandes-prontos-para-produ-o-"><strong>Características necessárias ao <em>boilerplate</em> para projetos grandes (prontos para produção)</strong></h4><ul><li>Documentação de boa qualidade e legível</li><li>Estrutura de código com um nível de abstração mais profundo</li><li>Seguimento do padrão de código adequado</li><li>Ferramenta de CLI (para rápida prototipagem e configuração)</li><li>Escalabilidade</li><li>Ferramentas de teste fáceis</li><li>Módulos de API necessários</li><li>Suporte a internacionalização e localização</li><li>Divisão do código</li><li>Código do servidor e do <em>client</em> para configuração</li><li>Estrutura de navegação e de roteamento adequada</li></ul><p>Depois de todas essas especificações mínimas, você deve começar a editar e alterar o código para construir seu projeto.</p><p>Existem algumas grandes empresas de tecnologia que até constroem seu próprio <em>boilerplate</em>. Elas o usam para projetos respectivos e similares ao longo do tempo.</p><p>Um exemplo perfeito para isso seria o <em>boilerplate</em> do react.js:</p><p><a href="https://github.com/react-boilerplate/react-boilerplate" rel="noopener"><strong><strong>react-boilerplate/react-boilerplate</strong></strong></a><strong> – </strong>uma base altamente escalável e <em>off-line</em> com a melhor experiência de desenvolvedor…</p><h4 id="boilerplate-para-projetos-menores-scaffolding-"><strong><em>Boilerplate</em> para projetos menores (<em>scaffolding</em>)</strong></h4><p>Este tipo de <em>boilerplate</em> é geralmente uma espécie de "conjunto para novatos", ou, de modo profissional, é chamado de “<em>Scaffolding</em>”. Seus principais usuários-alvo são desenvolvedores novatos ou novos adotantes.</p><p>Ele se concentra na prototipagem rápida, criando os elementos necessários apenas para novos projetos. Eles exigem menos funcionalidade e não são escaláveis ao longo do tempo e do projeto.</p><p>Sua estrutura de código não é muito expandida e não envolve uma camada de abstração mais profunda, pois os usuários precisam apenas criar os recursos principais. Isso elimina a necessidade de utilitários extras.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_lfaRa-3SmkzcN2cuy3MCYw.png" class="kg-image" alt="1_lfaRa-3SmkzcN2cuy3MCYw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_lfaRa-3SmkzcN2cuy3MCYw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_lfaRa-3SmkzcN2cuy3MCYw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="330" loading="lazy"><figcaption>Estrutura de código</figcaption></figure><p>O exemplo mais simples é o <em>boilerplate</em> do create-react-app, do Facebook:</p><p><a href="https://github.com/facebookincubator/create-react-app" rel="noopener"><strong><strong>facebookincubator/create-react-app</strong></strong></a><strong> – </strong><em>crie aplicações React com nenhuma configuração.</em></p><h3 id="qual-a-diferen-a-entre-o-boilerplate-e-o-modelo-template-"><strong>Qual é a diferença entre o <em>boilerplate</em> e o modelo (<em>template</em>)?</strong></h3><p>Como bem diz <a href="https://www.quora.com/profile/Joachim-Pense">Joachim Pense</a> (texto em inglês), <strong><em>boilerplate</em></strong> é algo que você copia e cola e apenas adiciona a um documento. Aparece com mais frequência em contratos em que a linguagem é usada e reutilizada, especificando coisas como condições e ressalvas.</p><p>Os escritores usam <strong>modelos </strong>(do inglês, <em>templates</em>)<strong> como texto padrão</strong>, às vezes com efeitos negativos. Em termos gerais, um modelo é um padrão usado para criar objetos. Na escrita, é uma <strong>forma padronizada de algo como um resumo</strong> que os escritores podem usar para desenvolver suas próprias versões.</p><p>Ao contrário dos <em>boilerplates</em>, os modelos são adaptados para um uso específico. O problema surgiu para mim quando os alunos usaram modelos do Word para seus currículos e todos acabaram parecendo iguais.</p><p>Tanto os modelos quanto os <em>boilerplates</em> podem tornar a redação comercial artificial e emperrada se usados de modo imprudente.</p><h3 id="guia-de-estilo-para-escrita-de-c-digo"><strong>Guia de estilo para escrita de código</strong></h3><p>Independentemente de você estar usando um <em>boilerplate </em>ou não, existem alguns padrões seguidos por empresas para escrever código. Um deles é o <strong>guia de estilo</strong>. Ele tenta explicar os estilos e padrões básicos usados em várias empresas ou organizações. Geralmente, é regra que os funcionários devam adotar o guia de estilo de escrita de código de sua empresa.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_VHZwgapkhk1bMWHilZa6vw.png" class="kg-image" alt="1_VHZwgapkhk1bMWHilZa6vw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_VHZwgapkhk1bMWHilZa6vw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_VHZwgapkhk1bMWHilZa6vw.png 781w" sizes="(min-width: 720px) 720px" width="781" height="342" loading="lazy"></figure><p>O guia de estilo descreve inúmeras regras para se escrever código, como recuo de tabulações e espaços, nomenclatura de variáveis e funções, escrita de comentários necessários, formatação, estruturas de arquivo de origem, uso do método adequado de estruturas de dados, prevenção de <em>hoisting</em>, escopo, instruções de controle e muito mais.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_hxP11Dbe9ksYpK5c8_nU3g.png" class="kg-image" alt="1_hxP11Dbe9ksYpK5c8_nU3g" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_hxP11Dbe9ksYpK5c8_nU3g.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_hxP11Dbe9ksYpK5c8_nU3g.png 800w" sizes="(min-width: 720px) 720px" width="800" height="351" loading="lazy"></figure><p>Os estilos de programação geralmente lidam com a aparência visual do código-fonte com o objetivo de legibilidade. Há muito tempo estão disponíveis softwares que formatam o código-fonte automaticamente, deixando os programadores se concentrarem em nomenclatura, lógica e técnicas superiores.</p><p>Como ponto prático, usar um computador para formatar o código-fonte economiza tempo, sendo possível impor padrões em toda a empresa sem debates infinitos e sem resolução. Alguns desses debates incluem: usar tabulações ou espaços para a indentação do código, qual o IDE perfeito para programar e assim por diante. O interessante é que você pode se envolver nesses debates que acontecem, principalmente no <strong><a href="https://www.reddit.com/r/programming/comments/2ban9r/the_great_white_space_debate/">Reddit</a></strong>. Você também pode participar de algumas das perguntas e respostas do <strong><a href="https://stackoverflow.com/">Stack Overflow</a></strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_rjETUMQ62xAZegCSAglE6Q.png" class="kg-image" alt="1_rjETUMQ62xAZegCSAglE6Q" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_rjETUMQ62xAZegCSAglE6Q.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_rjETUMQ62xAZegCSAglE6Q.png 800w" sizes="(min-width: 720px) 720px" width="800" height="571" loading="lazy"><figcaption>Fonte — <a href="https://stackoverflow.blog/2017/06/15/developers-use-spaces-make-money-use-tabs/" rel="noopener">https://stackoverflow.blog/2017/06/15/developers-use-spaces-make-money-use-tabs/</a></figcaption></figure><p>Para desenvolvedores para a web, o guia de estilo mais comum para JS é o <strong>guia de estilo de javascript do</strong> <strong><strong>Airbnb. </strong></strong>É código aberto e todo mundo pode contribuir.</p><p><a href="https://github.com/airbnb/javascript" rel="noopener"><strong><strong>airbnb/javascript</strong></strong></a><strong> – </strong><em>guia de estilo de <em>JavaScript</em></em></p><p>Se alguém tiver alguma dúvida do porquê o Javascript precisa de um guia de estilo, leia a segunda resposta do relatório de problemas escrito por <a href="https://twitter.com/hshoff" rel="noopener">Harrison Shoff</a>, programador na<strong><strong> Airbnb</strong></strong>.</p><p><a href="https://github.com/airbnb/javascript/issues/102"><strong>Por que o JavaScript precisa de um guia de estilo<strong>? · Issue #102 · airbnb/javascript</strong></strong></a><strong> – </strong>uma das minhas partes favoritas sobre a comunidade de JavaScript é que as pessoas escolhem escrevê-lo em tantas for<em>mas diferentes...</em></p><p>Aqui estão alguns guias de estilo (em inglês) para algumas das linguagens mais populares:</p><p><a href="https://github.com/dotnet/codeformatter" rel="noopener"><strong><strong>DotNet Code Formatter</strong></strong></a></p><p><a href="https://github.com/google/google-java-format" rel="noopener"><strong><strong>Java: Google-Java-Format</strong></strong></a></p><p><a href="https://standardjs.com/" rel="noopener"><strong><strong>Javascript Standard Style</strong></strong></a><strong><strong> (</strong>diferente do <strong>javascript</strong> do <strong>airbnb)</strong></strong></p><p><a href="http://cs.sensiolabs.org/" rel="noopener"><strong><strong>PHP Coding Standards Fixe</strong></strong>r</a></p><p><a href="https://github.com/google/yapf/" rel="noopener"><strong><strong>Python: Google’s YAPF</strong></strong></a></p><p><a href="http://rubocop.readthedocs.io/en/latest/" rel="noopener"><strong><strong>Ruby: Rubocop</strong></strong></a></p><h4 id="mais-sobre-boilerplate-conceito-para-poo"><strong>Mais sobre <em>boilerplate</em>: conceito para POO</strong></h4><p>Em <a href="https://en.wikipedia.org/wiki/Object-oriented_programming">programação orientada a objetos</a> (POO), as classes geralmente são fornecidas com métodos para obter e definir variáveis de instância. As definições desses métodos podem, frequentemente, ser consideradas <em>boilerplates</em>.</p><p>Embora o código varie de uma classe para outra, sua estrutura é suficientemente estereotipada para que seja melhor gerado automaticamente do que escrito à mão.</p><p>Por exemplo, na classe <a href="https://pt.wikipedia.org/wiki/Declara%C3%A7%C3%A3o_(inform%C3%A1tica)">Java</a> a seguir, que representa um animal de estimação, quase todo o código é <em>boilerplate</em>, exceto pelas declarações de <em><em>Pet</em> </em>(animal de estimação), <em><em>name</em></em> (nome), and <em><em>owner</em></em> (proprietário):</p><pre><code>public class Pet {
    private String name;
    Person owner;
    Pet(String name, Person owner) {
    	this.name = name;
        this.owner = owner;
    }
    
    public String getName() {
    	return name;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public Person getOwner() {
    	return owner;
    }
    
    public void setOwner(Person owner) {
    	this.owner = owner;
    }
}</code></pre><p>A definição de <em>boilerplate</em> está se tornando mais global em muitas outras linguagens de programação hoje em dia. Vem de linguagens de POO e híbridas – que antes eram processuais, mas se tornaram POO. Elas agora têm o mesmo objetivo de repetir o código que você constrói com um modelo/template/classe/objeto, então adotam esse termo. Você faz um modelo e as únicas coisas que você faz para cada instância de um modelo são os parâmetros individuais.</p><p>Esta parte é o que chamamos de <em>boilerplate</em>. Você simplesmente reutiliza o código a partir do qual criou um modelo, mas com parâmetros diferentes.</p><h4 id="boilerplate-como-api"><strong><em>Boilerplate</em> como API</strong></h4><p>Já que você está simplesmente reutilizando o código modelo com parâmetros diferentes, isso implica que poderíamos criar APIs reusáveis que só precisam de uma alteração de entradas e saídas.</p><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>"Código <em>boilerplate</em>" é qualquer código aparentemente repetitivo que é mostrado várias vezes para obter um resultado que parece ser muito mais simples.</p><p>O autor deste artigo o escreveu porque havia sido instruído por um líder de equipe a aprender sobre as muitas variedades de <em>boilerplates</em> que podem ser adequadas ao nosso projeto. Então, ele precisou sair em busca do "<em>boilerplate</em> perfeito".</p><p>Todo feedback sobre este artigo é muito bem-vindo! Vamos nessa!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que você aprende em um curso de Ciência de Computação de 4 anos ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Colin Smith Há algum tempo, escrevi um artigo [https://www.freecodecamp.org/news/a-computer-science-degree-ticket-to-your-dream-tech-job-or-a-useless-piece-of-paper-ee488d27c384]  sobre a necessidade de um diploma em ciência da computação para se conseguir um emprego em tecnologia. Achei que revisar a minha transcrição seria útil. Com sorte, discutir o que estudei ajudará as pessoas. Quero que todos possam ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-voce-aprende-em-uma-graduacao-em-ciencia-de-computacao-de-4-anos/</link>
                <guid isPermaLink="false">63eccd6858018c06027bf122</guid>
                
                    <category>
                        <![CDATA[ Educação ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Mon, 05 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_4aRkSiNmhriG3CSnrI3ARQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-you-learn-in-a-4-year-computer-science-degree-35a95457cb06/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What you learn in a 4 year Computer Science degree</a>
      </p><p>Escrito por: Colin Smith</p><p><a href="https://www.freecodecamp.org/news/a-computer-science-degree-ticket-to-your-dream-tech-job-or-a-useless-piece-of-paper-ee488d27c384">Há algum tempo, escrevi um artigo</a> sobre a necessidade de um diploma em ciência da computação para se conseguir um emprego em tecnologia. Achei que revisar a minha transcrição seria útil. Com sorte, discutir o que estudei ajudará as pessoas. Quero que todos possam tomar a decisão mais informada possível ao escolher seu caminho para seguir uma carreira em tecnologia.</p><p><strong>Isenção de responsabilidade:</strong> este artigo foi escrito a partir de minhas lembranças das aulas e da perspectiva de um desenvolvedor para dispositivos móveis. Muitos dos tópicos dessas aulas podem ser especializados e transformados em uma carreira. Portanto, todos eles são importantes para alguém no mundo. Estou escrevendo da minha perspectiva e do ponto de vista de alguém que escolheu a carreira de desenvolvedor <em>mobile</em>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/yZFOkgt75oQI5tvd6-YBdNKDYQDi18tTRKDX.png" class="kg-image" alt="yZFOkgt75oQI5tvd6-YBdNKDYQDi18tTRKDX" width="560" height="277" loading="lazy"><figcaption>O primeiro código que a maioria das pessoas escreve (neste caso, em C++).Imagem criada por <a href="https://commons.wikimedia.org/wiki/User:Kleiner">Kleiner</a></figcaption></figure><h3 id="programa-o-i-ii"><strong>Programação I, II</strong></h3><p>Essa foi a essência de tudo o que aprendi e me ajudou a programar. Essas são as aulas onde se aprende a programar. Antes de fazer essas aulas, eu mal tinha programado. Eu tentei obter uma vantagem inicial, mas não fui muito além dos <em>loops</em>.</p><p>Essas disciplinas começaram com a criação de um arquivo vazio e fazendo-o compilar em um IDE (usei o Code::Blocks na época). Trabalhamos até criar nosso próprio jogo de batalha baseado em texto. Olhar para o código que escrevi me deixa envergonhado. Percorri um longo caminho desde então. <a href="https://github.com/CGS-123/CS-162-Fantasy-Game/blob/master/main.cpp">Aqui está o repositório</a>, se você quiser rir (eu só uso um arquivo main.cpp com 1063 linhas de código).</p><p>Então, o que eu aprendi aqui? Ousaria dizer que "tudo". Esses cursos foram incrivelmente valiosos e me deram pelo menos 70% do conhecimento necessário para trabalhar profissionalmente como programador. Aprendi instruções <em>if</em>, <em>loops</em>, lógica booleana, criação de classes, criação de estruturas, criação de interfaces, polimorfismo, herança e muito mais. Também usei estruturas básicas de dados, como arrays e vetores.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/OaDNsCaPJjyHwUmQMYhXyX5lXA-guvfsh-mj.png" class="kg-image" alt="OaDNsCaPJjyHwUmQMYhXyX5lXA-guvfsh-mj" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/OaDNsCaPJjyHwUmQMYhXyX5lXA-guvfsh-mj.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/OaDNsCaPJjyHwUmQMYhXyX5lXA-guvfsh-mj.png 800w" sizes="(min-width: 720px) 720px" width="800" height="600" loading="lazy"><figcaption>Um dos diversos tópicos tratados em estruturas discretas. Imagem criada por <a href="https://commons.wikimedia.org/w/index.php?title=User:Benji3.141&amp;action=edit&amp;redlink=1" rel="noopener">Benji3.141</a> e sob a licença <a href="https://en.wikipedia.org/wiki/en:Creative_Commons" rel="noopener">Creative Commons</a><a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en" rel="noopener">Attribution-Share Alike 3.0 Unported</a>.</figcaption></figure><h3 id="estruturas-discretas-em-ci-ncia-da-computa-o"><strong>Estruturas discretas em ciência da computação</strong></h3><p>Esta disciplina foi adicionada à lista para que as pessoas se acostumem com a lógica booleana, a qual vimos nas duas primeiras semanas de aula. Infelizmente, para nós, alunos desavisados, a disciplina se aprofunda muito, mas muito mais. Aqui estão alguns dos tópicos abordados: "lógica, conjuntos e operações de conjuntos, métodos de prova, definições recursivas, análise combinatória e teoria dos grafos".</p><p>Todas essas são coisas são úteis de se saber. A questão é que os alunos são incentivados a fazer essa aula cedo, geralmente junto com Programação I e II. Alguns desses tópicos são bastante avançados. Eu sofreria agora para usar métodos matemáticos de prova. Lembro-me de que realmente tive dificuldades naquela época. Além disso, eu apenas tive que pesquisar no Google o que é análise combinatória. Então, obviamente, não a uso muito.</p><p>O fato é que muitas coisas que foi ensinado neste curso não pareciam aplicáveis a uma carreira de ciência da computação na época em que fiz o curso. Agora, sei que a lógica, conjuntos e operações de conjuntos, definições recursivas e a teoria dos grafos podem ser úteis. Esse conhecimento, porém, me veio apenas com a retrospectiva de ser programador há alguns anos.</p><p>O que aplico diariamente na minha carreira atual é a lógica e talvez as operações definidas. As definições recursivas e a teoria dos grafos realmente só foram úteis para entrevistas. Cuidado, no entanto, em seguir isso à risca, porque sou um desenvolvedor para dispositivos móveis. Um desenvolvedor de <em>back-end</em> provavelmente achará a teoria dos grafos muito útil.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/a9BBiHvGcXhLX5tdHR0IDn5eSE1nsFc07XYC.png" class="kg-image" alt="a9BBiHvGcXhLX5tdHR0IDn5eSE1nsFc07XYC" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/a9BBiHvGcXhLX5tdHR0IDn5eSE1nsFc07XYC.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/a9BBiHvGcXhLX5tdHR0IDn5eSE1nsFc07XYC.png 800w" width="800" height="376" loading="lazy"><figcaption>A mesma coisa, mas implementada em duas estruturas de dados diferentes. Imagem criada por: <a href="https://commons.wikimedia.org/w/index.php?title=User:Filosoficos&amp;action=edit&amp;redlink=1" rel="noopener">Filosoficos</a>.</figcaption></figure><h3 id="estruturas-de-dados"><strong>Estruturas de dados</strong></h3><p>Esta disciplina foi boa, muito boa. As estruturas de dados são usadas em toda a programação de computadores e são a espinha dorsal da maior parte do código que as pessoas escrevem. Elas nos permitem armazenar dados de um modo útil para os programas que escrevemos. A capacidade de olhar para os dados e saber a melhor maneira de armazená-los para terem um bom desempenho em termos de tempo e espaço é uma habilidade muito útil de se ter.</p><p>Aprendi sobre <em>arrays</em>, pilhas, listas vinculadas, listas duplamente vinculadas, árvores, gráficos, <em>heaps</em> e todos os diferentes tipos de estruturas de dados (como árvores de autobalanceamento). Essa disciplina não apenas me ajudou a entender as estruturas de dados, mas também a organizar melhor os dados que eu estava armazenando.</p><p>A disciplina foi feita em C, o que a tornou ainda mais interessante. C pode ser muito meticuloso, mas também muito poderoso, se usado corretamente. Tive que ter muito cuidado com o modo como alocava e limpava a memória, o que também foi muito bom para ensinar sobre gerenciamento de memória.</p><p>Havia tantas coisas úteis nessas aulas que é difícil tratar de todas elas. Eu nem mencionei o fato de que este é um componente de conhecimento chave para entrevistas em tecnologia. Se você está inseguro em estruturas de dados, comece a revisar alguns princípios básicos, porque eles são muito importantes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/4z-Vp4idbt9A8kr7WdcmTZhjePPa2EFrRwiJ.gif" class="kg-image" alt="4z-Vp4idbt9A8kr7WdcmTZhjePPa2EFrRwiJ" width="500" height="500" loading="lazy"><figcaption>A boa e velha pesquisa por largura. Não tenho ideia de quantas vezes o algoritmo me foi útil nas entrevistas. Imagem criada por <a href="https://commons.wikimedia.org/w/index.php?title=User:Mre&amp;action=edit&amp;redlink=1" rel="noopener">Mre</a> sob a licença <a href="https://en.wikipedia.org/wiki/en:Creative_Commons" rel="noopener">Creative Commons</a> Attribution-Share Alike <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en" rel="noopener">3.0 Unported</a>.</figcaption></figure><h3 id="an-lise-de-algoritmos"><strong>Análise de algoritmos</strong></h3><p>Esta disciplina foi um pouco útil. Algoritmos são úteis. Eles conduzem os melhores softwares do mundo e os tornam poderosos o suficiente para permanecerem relevantes no mundo moderno. Esta disciplina, porém, teve alguns problemas.</p><p>A parte mais útil dela foi aprender a notação Big O. A notação Big O permite que você avalie o código e entenda como ele funcionaria no tempo e no espaço. Em geral, se você estiver medindo o desempenho do código em uma empresa, usará um cronômetro para rastrear o tempo entre as interações. Isso permite que você veja o desempenho do seu software. Isso requer que você escreva o código e avalie os resultados posteriormente.</p><p>A notação Big O permite que você faça avaliações do desempenho do código apenas observando o código. Não quero entrar muito nisso, mas se você não conhece a notação Big O, <a href="https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/">leia esta postagem de blog</a> (em inglês).</p><p>Os algoritmos reais que examinamos não eram tão úteis. Tudo o que me lembro é o problema da mochila e o problema do caixeiro-viajante. Eu também tive que escrever código para eles em grupos, o que não foi tão interessante porque havia uma pessoa no meu grupo que foi além do que foi planejado. Isso significa que acabei escrevendo menos código para a implementação final do que gostaria.</p><p>Uma compreensão básica de quais algoritmos famosos existem, sua finalidade e como são implementados pode ser útil (principalmente para entrevistas). A notação Big O é a chave aqui. É muito útil no trabalho e também é incrivelmente útil para entrevistas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/R0NKNbNbzP5Qc7X5fH5FTtwBjNo5qVi41DNu.png" class="kg-image" alt="R0NKNbNbzP5Qc7X5fH5FTtwBjNo5qVi41DNu" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/R0NKNbNbzP5Qc7X5fH5FTtwBjNo5qVi41DNu.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/R0NKNbNbzP5Qc7X5fH5FTtwBjNo5qVi41DNu.png 800w" sizes="(min-width: 720px) 720px" width="800" height="373" loading="lazy"><figcaption>A stack do desenvolvedor para a web. Imagem criada por <a href="https://pixabay.com/en/users/lakexyde-2489063/" rel="noopener">lakexyde</a> e extraída da Pixabay.</figcaption></figure><h3 id="desenvolvimento-para-a-web"><strong>Desenvolvimento para a web</strong></h3><p>Esta disciplina era a que tinha mais habilidades que eram diretamente aplicáveis a um trabalho em tecnologia. Aprendi sobre HTML, CSS, JQuery, JavaScript, PHP e JSON. Aprendi como uma solicitação é enviada do <em>front-end</em> de um site para o <em>back-end</em>, como ela é processada no <em>back-end</em> e enviada de volta ao <em>front-end</em> com uma resposta. Aprendi como criar a UI (interface do usuário) e como interagir com uma camada de dados que, por sua vez, interage com a rede.</p><p>No final da disciplina, construí meu próprio site e tomei a iniciativa de aprender Angular. Usei o Angular para deixar meu site chamativo, o que acabou me rendendo meu primeiro estágio. Também adquiri um bom entendimento de como um site funciona internamente.</p><p>Esse conhecimento por si só foi ótimo, mas também aprendi como aprender uma linguagem, estrutura ou formato de dados desconhecido e trabalhar com eles na hora. Pesquisei muito no Google esses tópicos para ver exemplos concretos. Aprendi a usar a documentação e a investigação <em>on-line</em> para entender melhor um conceito que precisava aplicar diretamente em um curto espaço de tempo. Esta é uma habilidade chave para quem quer ser um programador experiente.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/hAtAQSMybyldMmemaepBn44FnqNvxcWPMWZb.png" class="kg-image" alt="hAtAQSMybyldMmemaepBn44FnqNvxcWPMWZb" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/hAtAQSMybyldMmemaepBn44FnqNvxcWPMWZb.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/hAtAQSMybyldMmemaepBn44FnqNvxcWPMWZb.png 800w" sizes="(min-width: 720px) 720px" width="800" height="698" loading="lazy"><figcaption>Esquemas em bancos de dados. Imagem criado por <a href="https://pixabay.com/en/users/mcmurryjulie-2375405/" rel="noopener">mcmurryjulie</a> e extraída da Pixabay.</figcaption></figure><h3 id="introdu-o-a-bancos-de-dados"><strong>Introdução a bancos de dados</strong></h3><p>Eu aprendi principalmente SQL nesta disciplina. Tenho certeza de que examinamos alguns outros conceitos, como <em>sharding</em> e <em>clustering</em>, mas não me lembro deles. Às vezes, uso SQL em meu trabalho atual para executar consultas de dados para eventos que registrei. O SQL será parte integrante do seu trabalho ou você mal o usará. Se precisar, aprenda sobre ele e se torne um especialista. Se não o fizer, não se preocupe muito com isso.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/bvehZI2W9NtwsruafcKX4sl3rXGlnFfA1DFo.png" class="kg-image" alt="bvehZI2W9NtwsruafcKX4sl3rXGlnFfA1DFo" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/bvehZI2W9NtwsruafcKX4sl3rXGlnFfA1DFo.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/bvehZI2W9NtwsruafcKX4sl3rXGlnFfA1DFo.png 800w" sizes="(min-width: 720px) 720px" width="800" height="400" loading="lazy"><figcaption>Versão resumida sobre Scrum. Imagem criada por <a href="https://commons.wikimedia.org/w/index.php?title=User:Lakeworks&amp;action=edit&amp;redlink=1" rel="noopener">Lakeworks</a> sob a licença <a href="https://en.wikipedia.org/wiki/en:Creative_Commons" rel="noopener">Creative Commons</a> Attribution-Share Alike <a href="https://creativecommons.org/licenses/by-sa/4.0/" rel="noopener">4.0 International</a>.</figcaption></figure><h3 id="engenharia-de-software-i-ii"><strong>Engenharia de software I, II</strong></h3><p>Outra disciplina da qual não consigo me lembrar. Acredito que examinamos vários conceitos amplos nesta aula. Cobrimos os métodos de gerenciamento de projetos Scrum e Waterfall. Examinamos testes e todos os diferentes tipos de testes que existem. Cobrimos alguns conceitos de usabilidade e acessibilidade. Na verdade, era apenas um apanhado de conceitos que não se encaixavam em suas próprias classes.</p><p>Devido à natureza de colcha de retalhos da disciplina, eu realmente não internalizei nenhum dos conceitos muito bem. Foi bom ter uma visão geral básica dos conceitos abordados, mas gostaria que mais tempo fosse gasto em tópicos individuais importantes, como testes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Yv2sg7BIybbCBD0JdrqWJZVAClYGjWArwLgn.png" class="kg-image" alt="Yv2sg7BIybbCBD0JdrqWJZVAClYGjWArwLgn" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/Yv2sg7BIybbCBD0JdrqWJZVAClYGjWArwLgn.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Yv2sg7BIybbCBD0JdrqWJZVAClYGjWArwLgn.png 623w" width="623" height="279" loading="lazy"><figcaption>Tipos diferentes de arquitetura de computadores. Imagem criada por <a href="https://en.wikipedia.org/wiki/User:Virtual_Lo%C3%AFc" rel="noopener">Virtual_Loïc</a>.</figcaption></figure><h3 id="arquitetura-de-computadores-e-a-linguagem-assembly"><strong>Arquitetura de computadores e a linguagem Assembly</strong></h3><p>Lembro-me vividamente desta disciplina. Ela aborda como um computador funciona e como as instruções da máquina são enviadas e processadas pelo computador. Também escrevemos algum código em MASM, que é uma linguagem Assembly que interage muito de perto com o código de máquina.</p><p>A maioria das linguagens de programação que usei até fazer este curso eram linguagens de alto nível. As linguagens de alto nível tendem a estar mais próximas da linguagem humana do que do código de máquina. O MASM está muito próximo do código de máquina e eu diria que está mais próximo da linguagem de máquina do que da linguagem humana.</p><p>A parte mais importante da disciplina é ter uma ideia do que acontece com seu código quando ele é compilado. Compreender as diferentes unidades lógicas em um computador e como seu código é tratado por elas foi muito interessante de se aprender.</p><p>Para fins práticos, não acho que esta aula tenha sido muito importante para contribuir para minha carreira em tecnologia. Não usei muito do conhecimento que adquiri na disciplina durante minha carreira até agora.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/IaLp7X3daT8fm7NAzhbFLlIVgb0WKo7UFswp.png" class="kg-image" alt="IaLp7X3daT8fm7NAzhbFLlIVgb0WKo7UFswp" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/IaLp7X3daT8fm7NAzhbFLlIVgb0WKo7UFswp.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/IaLp7X3daT8fm7NAzhbFLlIVgb0WKo7UFswp.png 800w" width="800" height="494" loading="lazy"><figcaption>Sistemas operacionais permitem fazer o que precisamos fazer. Imagem criada por <a href="https://pixabay.com/en/users/200degrees-2051452/" rel="noopener">200degrees</a> e extraída da Pixabay.</figcaption></figure><h3 id="sistemas-operacionais"><strong>Sistemas operacionais</strong></h3><p>Serei honesto, estou tendo muita dificuldade em me lembrar o que aprendi nesta disciplina. A única coisa de que me lembro é criar um programa de mensagens que usava programação de soquetes em C para comunicação. Também aprendi como abrir arquivos e manipular pastas usando scripts.</p><p>Quero ser sincero sobre o que me lembro da minha graduação e o fato é que não me lembro muito dessa disciplina. Eu simplesmente não usei muito do conhecimento adquirido com ela em minha carreira atual.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/lEqYjErQC4nggtUiWyrf2y-6VubPZwKWvR3m.jpg" class="kg-image" alt="lEqYjErQC4nggtUiWyrf2y-6VubPZwKWvR3m" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/lEqYjErQC4nggtUiWyrf2y-6VubPZwKWvR3m.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/lEqYjErQC4nggtUiWyrf2y-6VubPZwKWvR3m.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="800" loading="lazy"><figcaption>Redes de computadores são, de fato, <strong>incríveis</strong>. Imagem criada por <a href="https://commons.wikimedia.org/w/index.php?title=Barrett_Lyon&amp;action=edit&amp;redlink=1" rel="noopener">The Opte Project</a> disponível sob a licença <a href="https://en.wikipedia.org/wiki/en:Creative_Commons" rel="noopener">Creative Commons</a><a href="https://creativecommons.org/licenses/by/2.5/deed.en" rel="noopener">Attribution 2.5 Generic</a>.</figcaption></figure><h3 id="introdu-o-a-redes-de-computadores"><strong>Introdução a redes de computadores</strong></h3><p>Esta disciplina foi muito útil. Examinou como as redes de computadores funcionavam. Isso incluiu passar por protocolos de rede como HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH e DNS. Pude aprender para que serve cada um desses protocolos, como são implementados e entendi a razão de terem sido criados.</p><p>Os protocolos de rede que mencionei acima são usados para funções críticas no software moderno. Isso inclui tratamento de e-mails (POP3 e IMAP), envio de solicitações de rede entre <em>client</em> e servidor (HTTP, HTTPS) e tratamento de dispositivos com segurança por meio de uma rede (SSH). Isso realmente dá uma compreensão de como a internet funciona e de como os dispositivos em todo o mundo podem interagir uns com os outros.</p><p>Não é apenas fascinante. Pode ser muito útil. Usei o que aprendi nesta disciplina para depurar problemas que encontrei quando recebia erros da rede. Consegui identificar os problemas que estava encontrando e ajudar o desenvolvedor de <em>back-end</em> com o qual estava trabalhando a encontrar o bug do lado deles.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/mXoR8fKci85dr-33ucQnjOd3VXI54tfpPn0r.png" class="kg-image" alt="mXoR8fKci85dr-33ucQnjOd3VXI54tfpPn0r" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/mXoR8fKci85dr-33ucQnjOd3VXI54tfpPn0r.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/mXoR8fKci85dr-33ucQnjOd3VXI54tfpPn0r.png 800w" sizes="(min-width: 720px) 720px" width="800" height="450" loading="lazy"><figcaption>A experiência do usuário é um equilíbrio delicado entre as várias partes. Imagem criada por <a href="https://commons.wikimedia.org/wiki/User:Borys_Kozielski" rel="noopener">Borys Kozielski</a> sob a licença <a href="https://en.wikipedia.org/wiki/en:Creative_Commons" rel="noopener">Creative Commons</a><a href="https://creativecommons.org/licenses/by/4.0/deed.en" rel="noopener">Attribution 4.0 International</a>.</figcaption></figure><h3 id="introdu-o-engenharia-de-usabilidade"><strong>Introdução à engenharia de usabilidade</strong></h3><p>Esta disciplina abordou como criar uma aplicação intuitiva, mas também como tornar uma aplicação ou um site acessível. Acessibilidade refere-se a tornar um software utilizável para qualquer pessoa, incluindo pessoas com deficiência. Isso abrange coisas como uso de texto em fala e design de software que não depende totalmente de elementos de áudio.</p><p>Os tópicos abordados foram úteis se você nunca ouviu falar sobre acessibilidade antes. Pelo menos, faz considerar essas coisas ao projetar software. Também me levou a realmente começar a pensar sobre a experiência do usuário e sobre como ela é importante para um bom software. Se ninguém estiver usando a funcionalidade principal da sua aplicação porque é confusa, seu software acabará perdendo todos os seus usuários.</p><p>Embora o conhecimento fosse interessante, as implementações específicas de como você criaria um software utilizável e acessível dependem da plataforma. Por exemplo, <a href="https://developer.apple.com/design/human-interface-guidelines/">a Apple tem seu próprio conjunto de diretrizes de interface do usuário</a> (em inglês) que descrevem princípios gerais de design e detalhes específicos de como você deve projetar um software que será executado em qualquer uma das plataformas da Apple.</p><p>Por causa das informações específicas necessárias por plataforma, não tenho certeza se essa disciplina foi incrivelmente útil. Foi uma boa introdução, mas acabei tendo que aprender as diretrizes de interface da Apple, que abordaram todos os tópicos vistos na disciplina.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Ig2SZvPNLgV8T1LXOehJTISewPTRBVp88FUd.jpg" class="kg-image" alt="Ig2SZvPNLgV8T1LXOehJTISewPTRBVp88FUd" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/Ig2SZvPNLgV8T1LXOehJTISewPTRBVp88FUd.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Ig2SZvPNLgV8T1LXOehJTISewPTRBVp88FUd.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="800" loading="lazy"><figcaption>São tantas aplicações. É um mundo de oportunidade para desenvolvedores para dispositivos móveis. Foto criada por <a href="https://unsplash.com/photos/xsGxhtAsfSA?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener">Rahul Chakraborty</a> e extraída do <a href="https://unsplash.com/search/photos/mobile?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener">Unsplash</a>.</figcaption></figure><h3 id="desenvolvimento-de-software-para-dispositivos-m-veis-e-para-a-nuvem"><strong>Desenvolvimento de software para dispositivos móveis e para a nuvem</strong></h3><p>Esta seção será curta. Eu já era um engenheiro de <em>mobile</em> quando fiz este curso. Eu construí uma aplicação móvel de baixa qualidade em algumas horas para terminar minha graduação o mais rápido possível. A essa altura, eu já havia alcançado meu objetivo de conseguir um emprego como engenheiro de software, mas só precisava ter meu diploma de ciência da computação, pois estava quase no final do curso. Meu coração não estava interessado em aprender naquele momento.</p><p>Dito isso, não acho que esta disciplina foi bem conduzida. Ela foi preguiçosamente projetada. Eles encorajaram as pessoas a escrever código para uma aplicação de telefone Windows para esta classe. A demanda por esses trabalhos é muito menor do que outros. Acho que só foi incentivado porque o ambiente é mais fácil de configurar e o código pode ser escrito em JavaScript e se assemelha ao desenvolvimento para a web.</p><p>Além disso, ficou claro para mim que a pessoa que ministrava a disciplina não conhecia todas as plataformas de aplicações móveis. Fomos obrigados a escrever uma pequena parte do <em>back-end</em>, mas eu realmente não queria. Acabei falsificando uma solicitação da web lendo do disco e retornando uma resposta padrão após alguns segundos. Isso funcionou porque só tive que enviar uma demonstração e o código-fonte. Tenho a sensação de que a pessoa que avaliou apenas olhou para a demonstração.</p><p>No geral, a disciplina ensinou tecnologia desatualizada e não utilizada, não foi avaliada adequadamente e realmente não ofereceu muita orientação. Esta não foi uma disciplina muito boa.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/cBzfVfwIj5-Xr8Paqv2HDGfHaYAM90GWgOBX.jpg" class="kg-image" alt="cBzfVfwIj5-Xr8Paqv2HDGfHaYAM90GWgOBX" width="500" height="334" loading="lazy"><figcaption>Uma interface linda e moderna, não acha? Quem não adoraria aprender com essa GUI do Python depois de trabalhar como desenvolvedor para dispositivos móveis? Imagem criada por <a href="https://www.flickr.com/photos/syobosyobo/" rel="noopener">jim212jim</a> sob a licença <a href="https://creativecommons.org/licenses/by/2.0/" rel="noopener">Creative Commons Attribution 2.0 Generic</a>.</figcaption></figure><h3 id="projeto-final-de-cria-o-de-software">Projeto final de criação de software</h3><p>Falando em tecnologia desatualizada, este projeto exigia que construíssemos uma GUI para acessar um banco de dados usando <a href="https://en.wikipedia.org/wiki/Curses_(programming_library)">curses</a> (texto em inglês).<a href="http://tinypic.com/r/20fx5a9/9"> </a>Não escolhemos qual seria o nosso projeto principal: ele foi atribuído a nós. Todos tinham que fazer o mesmo projeto. Também foi feito em grupos de 3. Então, realmente cobrimos apenas uma pequena parte do projeto. Esta foi uma aula muito mal-administrada.</p><p>A interação com o professor era praticamente inexistente. Eu não tinha interesse no projeto e o que estávamos aprendendo parecia absolutamente inútil. Para criar interesse em um tópico, você precisa permitir que as pessoas tenham algum livre arbítrio quando se trata de escolher o que aprender. Não ter escolha em seu projeto final é simplesmente bobo. Esse projeto é inútil para a maioria das carreiras e não faz sentido fazer com que as pessoas o façam.</p><p>A disciplina deveria ter feito com que todos os alunos apresentassem uma proposta com estimativas aproximadas de um cronograma de quando terminariam cada subparte do projeto. Isso causa duas coisas: fazer com que as pessoas comecem a praticar a estimativa de trabalho e permitir que trabalhem naquilo em que estão interessadas. A disciplina teria sido 100 vezes melhor desse modo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/fzW5SzAag13PVXGS6InmkcV8xsFfSrja18Jb.gif" class="kg-image" alt="fzW5SzAag13PVXGS6InmkcV8xsFfSrja18Jb" width="500" height="500" loading="lazy"><figcaption>Outro GIF de algoritmo; só porque eles são muito legais. A pesquisa por profundidade para equilibrar a pesquisa por largura. Imagem criada por <a href="https://commons.wikimedia.org/w/index.php?title=User:Mre&amp;action=edit&amp;redlink=1" rel="noopener">Mre</a> sob a licença <a href="https://en.wikipedia.org/wiki/en:Creative_Commons" rel="noopener">Creative Commons</a> Attribution-Share Alike <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en" rel="noopener">3.0 Unported</a>.</figcaption></figure><h3 id="considera-es-finais"><strong>Considerações finais</strong></h3><p>Eu poderia não ter feito boa parte das disciplinas e ainda ser o engenheiro de software que sou hoje. Acho que perder algumas dessas disciplinas pode deixar uma grande lacuna no seu conhecimento como desenvolvedor. As disciplinas que eu acho que todo engenheiro de software deve ter algum conhecimento a respeito são Estruturas de Dados e Algoritmos.</p><p>As outras disciplinas dependem da carreira que você escolher. Se você decidiu entrar no desenvolvimento de software embarcado, deve aprender sobre arquitetura de computadores. Se você decidir se tornar um engenheiro de <em>front-end</em>, deve aprender sobre redes de computadores.</p><p>A principal conclusão aqui é que um bom engenheiro está constantemente aprendendo. Se você está perdendo algum conhecimento que sabe que seria útil e aplicável em seu trabalho, faça uma aula para obter esse conhecimento. É assim que você melhora a escrita de um bom código. Aprenda sempre.</p><h3 id="gostou-do-que-leu-confira-outros-artigos-do-mesmo-autor-em-ingl-s-"><strong>Gostou do que leu? Confira outros artigos do mesmo autor (em inglês)</strong></h3><p></p><p><a href="https://www.freecodecamp.org/news/how-i-went-from-stuck-and-hopeless-to-making-my-tech-career-dreams-come-true-d1fcf52c0650">Starting a tech career from nothing.</a></p><p><a href="https://www.freecodecamp.org/news/how-to-choose-the-best-tech-career-path-for-you-61c4d5ff9a77">Choose the best tech career for yourself — Dev Ops, Mobile Engineer, Data Scientist, Project Manager, and Front End.</a></p><p><a href="https://medium.com/@colin.gabriel.smith/killing-it-during-your-first-tech-interview-16ce13f9d0ce" rel="noopener">Tips for your first tech interview.</a></p><p><a href="https://www.freecodecamp.org/news/a-computer-science-degree-ticket-to-your-dream-tech-job-or-a-useless-piece-of-paper-ee488d27c384">Should you get a computer science degree?</a></p><p><a href="https://www.freecodecamp.org/news/https-medium-com-colin-gabriel-smith-swift-vs-objective-c-5b19add8e2ed">Swift vs. Objective-C</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que é o Nmap e como usá-lo – um tutorial para a melhor ferramenta de varredura de todos os tempos ]]>
                </title>
                <description>
                    <![CDATA[ O Nmap é a ferramenta de varredura mais famosa usada para testes de intrusão [https://pt.wikipedia.org/wiki/Teste_de_intrus%C3%A3o]. Neste artigo, veremos alguns recursos principais do Nmap, bem como alguns comandos úteis. O que é o Nmap? Nmap é a abreviação de Network Mapper (em português, "mapeador de rede"). É uma ferramenta de linha ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-o-nmap-e-como-usa-lo-um-tutorial-para-a-melhor-ferramenta-de-varredura-de-todos-os-tempos/</link>
                <guid isPermaLink="false">63ecbba658018c06027bef1a</guid>
                
                    <category>
                        <![CDATA[ Ciberssegurança ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Sun, 04 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/wall-6.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-is-nmap-and-how-to-use-it-a-tutorial-for-the-greatest-scanning-tool-of-all-time/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Nmap and How to Use it – A Tutorial for the Greatest Scanning Tool of All Time</a>
      </p><p>O Nmap é a ferramenta de varredura mais famosa usada para <a href="https://pt.wikipedia.org/wiki/Teste_de_intrus%C3%A3o">testes de intrusão</a>. Neste artigo, veremos alguns recursos principais do Nmap, bem como alguns comandos úteis.</p><h1 id="o-que-o-nmap"><strong>O que é o Nmap?</strong></h1><p>Nmap é a abreviação de <em>Network Mapper</em> (em português, "mapeador de rede"). É uma ferramenta de linha de comando do Linux, de código aberto, que é usada para efetuar a varredura (<em>scan</em>) de endereços IP e portas em uma rede e detectar aplicações instaladas.</p><p>O Nmap permite que os administradores de rede descubram quais dispositivos estão em sua rede, descubram portas e serviços abertos e detectem vulnerabilidades.</p><p><a href="https://pt.wikipedia.org/wiki/Gordon_Lyon">Gordon Lyon</a>, conhecido pelo pseudônimo de Fyodor, escreveu o Nmap como uma ferramenta para ajudar a mapear toda uma rede facilmente e encontrar suas portas e serviços abertos.</p><p>O Nmap se tornou extremamente popular, aparecendo em filmes como The Matrix e na popular série Mr. Robot.</p><h1 id="por-que-usar-o-nmap"><strong>Por que usar o Nmap?</strong></h1><p>Existem várias razões pelas quais os profissionais de segurança preferem o Nmap a outras ferramentas de varredura.</p><p>Primeiro, o Nmap ajuda você a mapear rapidamente uma rede sem comandos ou configurações sofisticadas. Ele também tem suporte a comandos simples (por exemplo, para verificar se um host está ativo) e scripts complexos por meio do mecanismo de script do Nmap.</p><p>Outros recursos do Nmap incluem:</p><ul><li>Capacidade de reconhecer rapidamente todos os dispositivos, incluindo servidores, roteadores, switches, dispositivos móveis, etc. em uma única rede ou em várias.</li><li>Ajuda a identificar serviços em execução em um sistema, incluindo servidores Web, servidores DNS e outras aplicações comuns. O Nmap também pode detectar versões de aplicações com precisão razoável para ajudar a detectar vulnerabilidades existentes.</li><li>O Nmap pode encontrar informações sobre o sistema operacional em execução nos dispositivos. Ele pode fornecer informações detalhadas, como versões do sistema operacional, facilitando o planejamento de abordagens adicionais durante o teste de intrusão.</li><li>Durante a auditoria de segurança e a varredura de vulnerabilidade, você pode usar o Nmap para atacar sistemas usando scripts existentes do Nmap Scripting Engine.</li><li>O Nmap possui uma interface gráfica de usuário chamada Zenmap. Ela ajuda você a desenvolver mapeamentos visuais de uma rede para melhor a usabilidade e a geração de relatórios.</li></ul><h1 id="comandos"><strong>Comandos</strong></h1><p>Vamos conferir alguns comandos do Nmap. Se você não tem o Nmap instalado, você pode <a href="https://nmap.org/download.html" rel="noopener nofollow">obtê-lo aqui</a> (site em inglês).</p><h2 id="varreduras-b-sicas"><strong>Varreduras básicas</strong></h2><p>A varredura da lista de dispositivos ativos em uma rede é a primeira etapa no mapeamento de rede. Existem dois tipos de varreduras que você pode usar para isso:</p><ul><li><strong>Varredura com p<strong><strong><strong>ing — </strong></strong></strong></strong>efetua uma varredura da lista de dispositivos ativos e conectados a uma determinada sub-rede.</li></ul><pre><code>&gt; nmap -sp 192.168.1.1/24</code></pre><ul><li><strong>Varredura de um único host<strong><strong><strong> — </strong></strong></strong></strong>efetua a varredura de um único host para mil portas bem conhecidas. Essas portas são aquelas usadas por serviços populares, como SQL, SNTP, apache e outros.</li></ul><pre><code>&gt; nmap scanme.nmap.org</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-3.png" class="kg-image" alt="1-3" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-3.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-3.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-3.png 1186w" width="1186" height="436" loading="lazy"></figure><h2 id="varredura-furtiva"><strong>Varredura furtiva</strong></h2><p>A varredura <em>stealth</em> (em português, "furtiva") é realizada enviando um pacote SYN e analisando a resposta. Se SYN/ACK for recebido, significa que a porta está aberta e você pode abrir uma conexão TCP.</p><p>No entanto, uma varredura <em>stealth</em> nunca completa a <a href="https://www.geeksforgeeks.org/tcp-3-way-handshake-process/">negociação em 3 vias</a> (em inglês, <em>3-way handshake</em>), o que torna difícil para o alvo determinar o sistema de varredura.</p><pre><code>&gt; nmap -sS scanme.nmap.org</code></pre><p>Você pode usar o comando '<strong>-sS</strong>' para executar uma varredura <em>stealth</em>. Lembre-se de que a varredura <em>stealth</em> é mais lenta e não tão agressiva quanto os outros tipos de varredura. Por isso, você pode ter que esperar um pouco para obter uma resposta.</p><h2 id="varredura-de-vers-o"><strong>Varredura de versão</strong></h2><p>Encontrar versões de aplicações é uma parte crucial no teste de intrusão.</p><p>Isso facilita sua vida, pois você pode encontrar uma vulnerabilidade existente no banco de dados <a href="https://cve.mitre.org/">Common Vulnerabilities and Exploits (CVE)</a> (em uma tradução literal, "vulnerabilidades e exposições comuns") para uma versão específica do serviço. Você pode usá-lo para atacar uma máquina usando uma ferramenta de exploração como o <a href="https://en.wikipedia.org/wiki/Metasploit_Project">Metasploit</a> (em inglês).</p><pre><code>&gt; nmap -sV scanme.nmap.org</code></pre><p>Para fazer uma varredura de versão, use o comando '-sV'. O Nmap fornecerá uma lista de serviços com suas versões. Lembre-se de que as varreduras de versão nem sempre são 100% precisas, mas levam você um passo mais perto de entrar com sucesso em um sistema.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-5.png" class="kg-image" alt="1-5" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-5.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-5.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-5.png 1350w" sizes="(min-width: 1200px) 1200px" width="1350" height="492" loading="lazy"></figure><h2 id="varredura-de-so"><strong>Varredura de SO</strong></h2><p>Além dos serviços e suas versões, o Nmap pode fornecer informações sobre o sistema operacional (SO) subjacente usando <em><a href="https://en.wikipedia.org/wiki/TCP/IP_stack_fingerprinting">TCP/IP fingerprinting</a></em> (em inglês). O Nmap também tentará encontrar o tempo de atividade do sistema durante uma varredura do sistema operacional.</p><pre><code>&gt; nmap -sV scanme.nmap.org</code></pre><p>Você pode usar sinalizadores (<em>flags</em>) adicionais como osscan-limit para limitar a pesquisa a alguns alvos esperados. O Nmap exibirá a porcentagem de confiança para cada palpite do sistema operacional.</p><p>Novamente, a detecção do sistema operacional nem sempre é precisa, mas ajuda o teste de intrusão a se aproximar de seu alvo.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-6.png" class="kg-image" alt="1-6" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-6.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-6.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-6.png 1400w" sizes="(min-width: 1200px) 1200px" width="1400" height="308" loading="lazy"></figure><h2 id="varredura-agressiva"><strong>Varredura agressiva</strong></h2><p>O Nmap tem um modo agressivo, que permite detecção de SO, de versão, varredura de script e <em>traceroute</em>. Você pode usar o argumento -A para realizar uma varredura agressiva.</p><pre><code>&gt; nmap -A scanme.nmap.org</code></pre><p>Varreduras agressivas fornecem uma informação muito melhor do que as varreduras comuns. Porém, uma varredura agressiva também envia muito mais sondas, sendo muito mais provável de ser detectada em auditorias de segurança.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-7.png" class="kg-image" alt="1-7" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-7.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-7.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-7.png 1400w" sizes="(min-width: 1200px) 1200px" width="1400" height="633" loading="lazy"></figure><h2 id="varredura-de-v-rios-hosts"><strong>Varredura de vários hosts</strong></h2><p>O Nmap tem a capacidade de efetuar uma varredura de vários hosts simultaneamente. Esse recurso é muito útil quando você está gerenciando uma vasta infraestrutura de rede.</p><p>Você pode efetuar a varredura de diversos hosts por meio de várias abordagens:</p><ul><li>Escrever todos os endereços IP em uma única linha para efetuar a varredura de todos os hosts ao mesmo tempo.</li></ul><pre><code>&gt; nmap 192.164.1.1 192.164.0.2 192.164.0.2</code></pre><ul><li>Usar o asterisco (*) para efetuar a varredura de toda a sub-rede de uma só vez.</li></ul><pre><code>&gt; nmap 192.164.1.*</code></pre><ul><li>Adicionar vírgulas para separar o final de endereços em vez de digitá-los por completo.</li></ul><pre><code>&gt; nmap 192.164.0.1,2,3,4</code></pre><ul><li>Usar um hífen para especificar um intervalo de endereços IP.</li></ul><pre><code>&gt; nmap 192.164.0.0–255</code></pre><h2 id="varredura-de-portas"><strong>Varredura de portas</strong></h2><p>A varredura de portas é um dos recursos mais fundamentais do Nmap. Você pode procurar portas de várias maneiras.</p><ul><li>Usando o parâmetro -p para efetuar a varredura de uma única porta</li></ul><pre><code>&gt; nmap -p 973 192.164.0.1</code></pre><ul><li>Se você especificar o tipo de porta, você pode efetuar a varredura de informações sobre um tipo particular de conexão como, por exemplo, para uma conexão TCP.</li></ul><pre><code>&gt; nmap -p T:7777, 973 192.164.0.1</code></pre><ul><li>Um intervalo de portas pode ser alvo de varredura separando-as com um hífen.</li></ul><pre><code>&gt; nmap -p 76–973 192.164.0.1</code></pre><ul><li>Você também pode usar o sinalizador <strong><strong><strong><strong>-</strong></strong></strong>-<strong><strong><strong>top-ports </strong></strong></strong></strong>para especificar as n principais portas para varredura.</li></ul><pre><code>&gt; nmap --top-ports 10 scanme.nmap.org</code></pre><h2 id="varredura-a-partir-de-um-arquivo"><strong>Varredura a partir de um arquivo</strong></h2><p>Se você deseja efetuar a varredura de uma lista grande de endereços IP, você pode fazer isso importando um arquivo com a lista de endereços IP.</p><pre><code>&gt; nmap -iL /ips_entrada.txt</code></pre><p>O comando acima vai produzir os resultados de varredura de todos os domínios dados no arquivo "ips_entrada.txt". Além de simplesmente digitalizar os endereços IP, você também pode usar opções e sinalizadores adicionais.</p><h2 id="detalhamento-e-exporta-o-de-resultados-de-varredura"><strong>Detalhamento e exportação de resultados de varredura</strong></h2><p>Um teste de intrusão pode durar dias ou, até mesmo, semanas. Exportar os resultados do Nmap pode ser útil para evitar trabalho redundante e ajudar com a criação de relatórios finais. Vamos dar uma olhada nas formas de exportar os resultados de varredura do Nmap.</p><h3 id="sa-da-detalhada"><strong>Saída detalhada</strong></h3><pre><code>&gt; nmap -v scanme.nmap.org</code></pre><p>A saída detalhada (em inglês, <em>verbose</em>) fornece informações adicionais sobre a varredura que está sendo executada. É útil monitorar passo a passo as ações que o Nmap executa em uma rede, especialmente se você for um estranho efetuando a varredura da rede de um cliente.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-8.png" class="kg-image" alt="1-8" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-8.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-8.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-8.png 1400w" sizes="(min-width: 1200px) 1200px" width="1400" height="600" loading="lazy"></figure><h3 id="sa-da-normal"><strong>Saída normal</strong></h3><p>As varreduras do Nmap também podem ser exportadas para um arquivo de texto. Isso resultará em uma saída um pouco diferente da saída da linha de comando original, mas vai capturar todos os resultados de varredura essenciais.</p><pre><code>&gt; nmap -oN saída.txt scanme.nmap.org</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-9.png" class="kg-image" alt="1-9" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-9.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-9.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-9.png 1400w" sizes="(min-width: 1200px) 1200px" width="1400" height="372" loading="lazy"></figure><h3 id="sa-da-em-xml"><strong>Saída em XML</strong></h3><p>As varreduras do Nmap também podem ser exportadas para XML. É também o formato de arquivo preferido da maioria das ferramentas de teste de intrusão, tornando-o facilmente analisável ao importar resultados da varredura.</p><pre><code>&gt; nmap -oX saída.xml scanme.nmap.org</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-10.png" class="kg-image" alt="1-10" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-10.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-10.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-10.png 1400w" sizes="(min-width: 1200px) 1200px" width="1400" height="257" loading="lazy"></figure><h3 id="v-rios-formatos"><strong>Vários formatos</strong></h3><p>Você também pode exportar os resultados de varredura em todos os formatos disponíveis de uma só vez usando o comando -oA.</p><pre><code>&gt; nmap -oA saída scanme.nmap.org</code></pre><p>O comando acima vai exportar o resultado de varredura para três arquivos — saída.xml, saída.nmap e saída.gnmap.</p><h2 id="ajuda-do-nmap"><strong>Ajuda do Nmap</strong></h2><p>O Nmap tem um comando de ajuda embutido que lista todos os sinalizadores e opções que você pode usar. Ele é geralmente útil, considerando a quantidade de argumentos de linha de comando que o Nmap possui.</p><pre><code>&gt; nmap -h</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-12.png" class="kg-image" alt="1-12" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-12.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-12.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-12.png 1337w" sizes="(min-width: 1200px) 1200px" width="1337" height="892" loading="lazy"></figure><h1 id="nmap-scripting-engine"><strong>Nmap Scripting Engine</strong></h1><p>O Nmap Scripting Engine (NSE) &nbsp;– em uma tradução literal, "mecanismo de scripts do Nmap" – é uma ferramenta incrivelmente poderosa que você pode usar para escrever scripts e automatizar vários recursos de rede.</p><p>Você pode encontrar muitos scripts distribuídos pelo Nmap ou escrever seu próprio script com base em seus requisitos. Você pode até modificar scripts existentes usando a linguagem de programação Lua.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-13.png" class="kg-image" alt="1-13" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-13.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-13.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-13.png 1400w" sizes="(min-width: 1200px) 1200px" width="1400" height="646" loading="lazy"></figure><p>O NSE também possui scripts de ataque que são usados para atacar a rede e vários protocolos de rede.</p><p>Examinar o mecanismo de script em profundidade estaria fora do escopo deste artigo. Portanto, <a href="https://nmap.org/book/nse.html">aqui estão mais informações sobre o NSE</a> (em inglês).</p><h2 id="zenmap"><strong>Zenmap</strong></h2><p>O Zenmap é uma interface gráfica de usuário para o Nmap. É um software livre e de código aberto que ajuda quem está começando a usar o Nmap.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-15.png" class="kg-image" alt="1-15" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1-15.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/1-15.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1-15.png 1280w" sizes="(min-width: 1200px) 1200px" width="1280" height="800" loading="lazy"></figure><p>Além de fornecer mapeamentos visuais de rede, o Zenmap também permite que você salve e procure suas varreduras para uso futuro.</p><p>O Zenmap é ótimo para iniciantes que desejam testar as capacidades do Nmap sem precisar lidar com uma interface de linha de comando.</p><h1 id="conclus-o"><strong>Conclusão</strong></h1><p>O Nmap é claramente o "canivete suíço" da rede, graças a seus vários comandos versáteis.</p><p>Ele permite que você efetue uma varredura e descubra rapidamente informações essenciais sobre sua rede, hosts, portas, firewalls e sistemas operacionais.</p><p>O Nmap possui várias configurações, sinalizadores e preferências que ajudam os administradores de sistema a analisar uma rede em detalhes.</p><p>Se você deseja aprender sobre o Nmap a fundo, <a href="https://github.com/jasonniebauer/Nmap-Cheatsheet">aqui está um ótimo recurso para você</a> (em inglês).</p><p>Gostou deste artigo? <a href="http://tinyletter.com/manishmshiva">Inscreva-se para receber notícias do autor</a> (em inglês).</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ AWS Identity and Access Management (IAM) – explicado com uma analogia ]]>
                </title>
                <description>
                    <![CDATA[ O AWS IAM (Identity and Access Management) oferece controle sobre quem pode acessar seus serviços e recursos da AWS com base em algumas permissões  predefinidas. As duas palavras-chave aqui são "quem" e "permissões". "Quem" refere-se a uma identidade específica, que pode ser um usuário, grupo ou role (em português, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aws-identity-and-access-management-iam-explicado-com-uma-analogia/</link>
                <guid isPermaLink="false">63b56190ba60cc05f8ad1304</guid>
                
                    <category>
                        <![CDATA[ IAM ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Tue, 28 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Slide1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/aws-iam-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">AWS Identity and Access Management (IAM) – Explained With an Analogy</a>
      </p><p>O AWS IAM (Identity and Access Management) oferece controle sobre <strong>quem</strong> pode acessar seus serviços e recursos da AWS com base em algumas <strong>permissões</strong> predefinidas.</p><p>As duas palavras-chave aqui são "quem" e "permissões". "Quem" refere-se a uma identidade específica, que pode ser um <strong>usuário</strong>, <strong>grupo</strong> ou <strong>role </strong>(em português, função ou papel). "Permissões" referem-se às <strong>políticas</strong> anexadas a uma identidade. Essas permissões permitem ou negam acesso a um recurso.</p><p>O IAM é a maneira de a AWS autenticar e autorizar identidades. Autenticação não é, no entanto, o mesmo que autorização. A autenticação está relacionada com o "<strong>quem</strong>", enquanto a autorização está relacionada com as "<strong>permissões</strong>".</p><h2 id="a-diferen-a-entre-autentica-o-e-autoriza-o">A diferença entre autenticação e autorização</h2><p>Autenticação é quando uma identidade prova que é o que/quem diz ser. A autorização, por outro lado, prova que você tem as permissões para acessar um recurso.</p><p>Para entender completamente a diferença, considere a seguinte analogia. Você precisa ser autenticado e autorizado para embarcar em um voo. A autenticação é feita com o seu passaporte ou documento de identificação, onde é verificado se a fotografia do seu passaporte corresponde ao seu rosto. Isso prova que você é quem diz ser.</p><p>Depois de autenticado, você precisa provar que tem permissão para fazer um voo específico. Isso é feito com seu cartão de embarque.</p><p>Tanto a autenticação quanto a autorização precisam ser realizadas antes de embarcar em um voo. Do mesmo modo, ambos precisam ser executados antes que você possa acessar os recursos da AWS.</p><p>Você pode <a href="https://www.freecodecamp.org/portuguese/news/autenticacao-x-autorizacao-qual-e-a-diferenca/">ler mais sobre autorização versus autenticação aqui</a>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-70.png" class="kg-image" alt="image-70" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-70.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-70.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-70.png 1280w" sizes="(min-width: 1200px) 1200px" width="1280" height="720" loading="lazy"><figcaption>Autenticação e autorização não são o mesmo</figcaption></figure><p>Os usuários, grupos e <em>roles</em> do IAM se preocupam com a autenticação, ou seja, provar que você é quem diz ser. Eles são como passaportes que permitem que você passe pela segurança de um aeroporto.</p><p>Sem um cartão de embarque, no entanto, você não pode embarcar em um avião. A política do IAM é como um cartão de embarque, pois concede ou nega acesso a recursos específicos.</p><h2 id="o-que-s-o-usu-rios-do-iam">O que são usuários do IAM?</h2><p>Esta é qualquer identidade (humana ou um aplicativo) que requer acesso de longo prazo aos recursos da AWS. Essas entidades fazem solicitações ao IAM para serem autenticadas antes que qualquer interação com os recursos da AWS seja permitida.</p><p>A autenticação é feita usando uma combinação de nome de usuário/senha para humanos acessando a AWS por meio do console ou por meio de chaves de acesso para uma aplicação ou um humano acessando a AWS por meio da interface de linha de comando.</p><h2 id="o-que-s-o-os-grupos-do-iam">O que são os grupos do IAM?</h2><p>Os usuários do IAM podem ser colocados em um grupo do IAM. Os grupos do IAM facilitam a organização de um grande número de usuários do IAM e a aplicação de permissões em um nível de grupo em vez de um nível individual. Isso ocorre porque o último não é dimensionado para um grande número de usuários.</p><p>Imagine que você tem uma equipe composta por desenvolvedores, arquitetos, equipe administrativa, engenheiros de DevOps, suporte ao vivo e testadores. Cada uma dessas equipes tem 10 pessoas, em um total de 60 pessoas.</p><p>Em vez de definir políticas de permissão para 60 pessoas individualmente, você pode colocar usuários do IAM em seus respectivos grupos e aplicar permissões em um nível de grupo. Isso facilita a organização de permissões e também o dimensionamento à medida que sua equipe cresce.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-72.png" class="kg-image" alt="image-72" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-72.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-72.png 877w" width="877" height="626" loading="lazy"><figcaption>Os grupos do IAM podem ser criados para equipes separadas</figcaption></figure><p>Não há credenciais de login para grupos do IAM. Além disso, um usuário pode pertencer a vários grupos. Por exemplo, um usuário do IAM que está no grupo de DevOps também pode estar no grupo de suporte ao vivo. Isso mapeia perfeitamente o mundo real, onde um engenheiro de DevOps também pode estar no suporte ao vivo.</p><h2 id="o-que-s-o-roles-do-iam">O que são <em>roles</em> do IAM?</h2><p>Roles (ou funções) do IAM são usadas para conceder <strong>acesso temporário</strong> a várias identidades. Essas identidades podem ser pessoas externas à AWS acessando seus serviços, usuários do IAM ou aplicações.</p><p>Essas identidades assumem a <em>role </em>temporariamente e quaisquer políticas de permissão anexadas à <em>role </em>são aplicadas por extensão à identidade que assume essa <em>role</em>.</p><p>As <em>roles </em>do IAM são importantes porque a AWS tem limites rígidos para o número de usuários do IAM (<a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html">atualmente, 5 mil</a> – documentação em inglês).</p><h3 id="pol-ticas-de-confian-a-x-pol-ticas-de-permiss-o">Políticas de confiança x políticas de permissão</h3><p>As políticas do IAM anexadas às <em>roles</em> são de dois tipos – política de confiança e política de permissão.</p><p>A política de confiança controla qual identidade (por exemplo, usuários do IAM, recursos da AWS, como instâncias de EC2, entidades anônimas) pode assumir essa <em>role</em>. Depois que uma <em>role </em>é assumida por uma identidade, a AWS emite <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html">credenciais de segurança temporárias</a> (documentação em inglês).</p><p>Você pode pensar na política de confiança como a maneira como a AWS autentica uma <em>role </em>do IAM para garantir que apenas a identidade com permissão para assumir a <em>role </em>possa fazer isso, ou seja, que uma identidade tenha provado ser quem/o que diz ser.</p><p>Há, no entanto, um porém. Com políticas de confiança, essa autenticação funciona apenas por um período de tempo. Depois de decorrido esse tempo, a identidade precisa se autenticar novamente e obter novas credenciais de segurança temporárias.</p><p>A política de permissões é relativamente simples: ela define as permissões que a <em>role </em>tem. A <em>role</em>, por sua vez, define as permissões que a identidade que assumir essa <em>role </em>terá.</p><p>As <em>roles </em>do IAM são um conceito relativamente difícil de entender. Portanto, se você ainda não o entende bem, continue lendo e ele ficará mais claro.</p><h2 id="como-as-pol-ticas-do-iam-funcionam">Como as políticas do IAM funcionam</h2><p>As políticas do IAM são anexadas a identidades (portanto, aos usuários, grupos ou <em>roles</em>). As políticas do IAM também podem ser anexadas a alguns recursos da AWS. Esses tipos de políticas são chamados de políticas baseadas em recursos.</p><p>As políticas do IAM são documentos JSON, que consistem em uma ou mais instruções que concedem ou negam acesso aos recursos da AWS.</p><p>A política do IAM abaixo mostra como as permissões são concedidas a uma identidade para ler e gravar em um <em>bucket </em>de S3.</p><figure class="kg-card kg-code-card"><pre><code>{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::bucket-name"]
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Action": "s3:*Object",
            "Resource": ["arn:aws:s3:::bucket-name/*"]
        }
    ]
}</code></pre><figcaption>Uma política do IAM que concede acesso de leitura e escrita a um bucket de S3</figcaption></figure><ul><li><code>Sid</code> significa "statement ID" (ou, em português, identificação de declaração), um campo opcional que permite ao leitor identificar rapidamente o que uma declaração faz.</li><li><code>Effect</code> pode ser <em>allow</em> ou <em>deny</em> (em português, permitir ou negar, respectivamente)</li><li><code>Action</code> refere-se a qual ação você está tentando efetuar. O formato é <strong>serviço:operação</strong>.</li><li><code>Resource</code> refere-se a com qual recurso você está interagindo. Tipicamente, você vai usar o <a href="https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html" rel="nofollow ugc noopener">ARN</a> (<em>Amazon Resource Name</em>, documentação em inglês) que identifica, de forma exclusiva, recursos da AWS.</li></ul><p>Por padrão, todas as solicitações são negadas implicitamente, a menos que uma política tenha explicitamente uma "permissão", como é o caso do exemplo acima.</p><p>Esse princípio de privilégio mínimo garante que uma identidade não possa usar um recurso, a menos que receba explicitamente a permissão para fazê-lo.</p><h2 id="juntando-tudo-como-o-iam-funciona">Juntando tudo – como o IAM funciona</h2><p>Considere um restaurante. Ele terá alguns funcionários em tempo integral – como chefs, garçons e faxineiros. Também pode ter alguns chefs de meio período para ajudar durante o pico de demanda à noite e nos fins de semana. Se o restaurante for bom, também terá clientes que podem comer no local e levar para viagem.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-73.png" class="kg-image" alt="image-73" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-73.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-73.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-73.png 1280w" sizes="(min-width: 1200px) 1200px" width="1280" height="720" loading="lazy"><figcaption>Analogia do restaurante de IAM</figcaption></figure><p>Para fazer uma analogia com o AWS IAM, os funcionários em tempo integral são como usuários do IAM. Eles exigem acesso de longo prazo aos recursos do restaurante, conforme mostrado acima. Todos esses usuários pertencerão a grupos diferentes – o grupo de garçons, chef e faxineiros (ou seja, todos os garçons, por exemplo, terão o mesmo cargo de "garçom").</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-74.png" class="kg-image" alt="image-74" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-74.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-74.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-74.png 1280w" sizes="(min-width: 1200px) 1200px" width="1280" height="720" loading="lazy"><figcaption>Analogia do restaurante de IAM</figcaption></figure><p>Como os funcionários do restaurante são autenticados? Como sabemos que eles são quem dizem ser? Crachás com uma foto servirão. Eles também podem mostrar seu cargo, que é análogo ao grupo IAM ao qual eles pertencem.</p><p>As políticas de permissão que definem quais recursos os funcionários do restaurante podem acessar são aplicadas no nível do grupo, pois todos os garçons, chefs e faxineiros terão as mesmas permissões. Isso pode não ser verdade na realidade, pois o chefe de cozinha, por exemplo, pode ter acesso privilegiado. Para simplificar, porém, vamos supor que seja verdade.</p><p>Como o gerente do restaurante controla quem tem acesso a quais recursos? Portas com fechaduras servirão perfeitamente. As chaves funcionam como uma política, pois controlam o acesso a partes do restaurante.</p><p>Um conjunto idêntico será dado a todos os garçons, uma vez que os garçons precisarão do mesmo nível de acesso ao depósito de alimentos/bebidas, cozinha e mesas.</p><p>A mesma lógica será aplicada ao restante dos colaboradores em tempo integral, onde são entregues as devidas chaves para que possam utilizar os recursos do restaurante conforme as suas necessidades.</p><p>Fornecer chaves aos funcionários do restaurante é semelhante a anexar uma política a um usuário ou grupo do IAM. Sem as chaves, os funcionários não podem acessar partes do restaurante.</p><p>Do mesmo modo, na AWS, sem políticas que permitem explicitamente uma ação, as solicitações não podem ser feitas aos recursos da AWS. O estado padrão na AWS e em nossa analogia com o restaurante é uma negação implícita ao tentar acessar recursos.</p><p>Os funcionários de meio período (como um chef temporário, por exemplo) e os clientes não precisam de acesso de longo prazo aos recursos, mas precisarão de acesso de curto prazo, semelhante às <em>roles </em>do IAM.</p><p>Os funcionários de meio período só podem trabalhar durante um breve período – digamos durante a noite no fim de semana. Fora desse horário, eles não têm permissão para usar os recursos do restaurante.</p><p>O chef de meio período não precisa ser a mesma pessoa. Pode ser uma pessoa diferente a cada semana, ao contrário dos funcionários em tempo integral que têm identidades específicas.</p><p>Um chef de meio período, portanto, assumirá a função (<em>role</em>) de chef e receberá um crachá temporário que manterá durante o turno. Isso é análogo a uma entidade que assume uma <em>role </em>do IAM que tem uma política anexada a ela e obtém credenciais de segurança temporárias que expirarão após algum tempo.</p><p>Novamente, a política aqui é o conjunto de chaves que concede permissão para partes do restaurante, enquanto a credencial de segurança temporária é o crachá temporário usado para autenticar o chef.</p><p>Do mesmo modo, os clientes são análogos às <em>roles </em>do IAM por dois motivos. Primeiro, eles exigem apenas acesso temporário ao restaurante. Em segundo lugar, e talvez mais importante, um restaurante de sucesso terá dezenas de milhares a centenas de milhares de clientes únicos ao longo de sua vida.</p><p>Ter um grande número de entidades não identificadas é um caso de uso perfeito para <em>roles </em>do IAM. Lembre-se de que, com a AWS, há um limite rígido de 5 mil para o número de usuários do IAM que você pode ter. Se houver um caso de uso em que o número necessário de usuários do IAM exceda esse limite de 5 mil, usar as <em>roles </em>do IAM é sua única opção.</p><p>Assim como as funções do IAM são assumidas, o cliente primeiro precisa solicitar algo para provar que é um cliente e pode assumir a <em>role </em>de cliente.</p><p>Depois que a <em>role </em>do cliente é assumida, a política de permissões anexada à <em>role </em>do cliente também é aplicada ao cliente. Os clientes têm permissão para usar apenas alguns recursos, como as mesas e o banheiro.</p><p>Para manter a analogia realista, o acesso ao banheiro é controlado digitando uma senha que muda todos os dias, garantindo assim que o acesso seja temporário. Essa senha é análoga à política anexada à <em>role </em>do cliente que concede acesso temporário ao banheiro.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-75.png" class="kg-image" alt="image-75" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-75.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-75.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-75.png 1504w" sizes="(min-width: 1200px) 1200px" width="1504" height="861" loading="lazy"></figure><h2 id="exemplo-de-caso-de-uso-de-roles-do-iam">Exemplo de caso de uso de <em>roles </em>do IAM</h2><p>Considere a seguinte arquitetura muito simples: uma instância de EC2 executando uma aplicação que precisa de acesso total a um <em>bucket </em>de S3.</p><p>Como você daria à instância de EC2 permissão para ler e gravar objetos de um <em>bucket </em>do S3? Isso é explicado no diagrama abaixo:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-77.png" class="kg-image" alt="image-77" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-77.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-77.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-77.png 1281w" sizes="(min-width: 1200px) 1200px" width="1281" height="669" loading="lazy"><figcaption>Anexando uma política a uma <em>role </em>de IAM e deixando que uma instância de EC2 assuma aquela <em>role</em></figcaption></figure><ol><li>Crie uma <em>role </em>do IAM para sua instância do EC2</li><li>Anexe uma política do IAM à <em>role </em>que concede acesso total ao <em>bucket </em>de S3</li><li>Deixe a instância de EC2 assumir a <em>role</em></li></ol><p>A política de IAM para o acesso total ao S3 mencionado na etapa 2 é:</p><pre><code>{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}</code></pre><p>Agora, você pode ler e gravar no <em>bucket </em>do S3. Observe que, na política acima, não é especificado nenhum ARN. Ela apenas contém "*" para o recurso. Isso representa todos os <em>buckets </em>de S3. Se é isso que você quer, então essa política serve. Se, porém, você quiser especificar um único <em>bucket</em>, precisará fornecer o ARN do <em>bucket</em>.</p><h2 id="resumo">Resumo</h2><p>Compreender o IAM e a diferença entre usuários, <em>roles</em>, grupos e como as políticas funcionam oferece a você uma base sólida sobre a qual você pode arquitetar e criar soluções seguras com a AWS.</p><p>Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Autenticação x autorização – qual é a diferença? ]]>
                </title>
                <description>
                    <![CDATA[ Quando você está começando no desenvolvimento para a web, provavelmente, ouvirá os termos autenticação e autorização o tempo todo. Não ajuda o fato de que ambos sejam geralmente abreviados como "auth". Então, é muito fácil confundir os dois. Neste artigo, você aprenderá:  * As diferenças entre autenticação e autorização ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/autenticacao-x-autorizacao-qual-e-a-diferenca/</link>
                <guid isPermaLink="false">63b4da8a44e27f060d7a5fcf</guid>
                
                    <category>
                        <![CDATA[ Autenticação ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Mon, 27 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Background1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/whats-the-difference-between-authentication-and-authorisation/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Authentication vs Authorization – What's the Difference?</a>
      </p><p>Quando você está começando no desenvolvimento para a web, provavelmente, ouvirá os termos autenticação e autorização o tempo todo. Não ajuda o fato de que ambos sejam geralmente abreviados como "<em>auth</em>". Então, é muito fácil confundir os dois.</p><p>Neste artigo, você aprenderá:</p><ul><li>As diferenças entre autenticação e autorização</li><li>Como cada um desses processos funciona</li><li>Exemplos de autorização e autenticação na vida cotidiana.</li></ul><p>‌‌‌‌Vamos começar.</p><h2 id="o-que-autentica-o">O que é autenticação?</h2><p>Autenticação é o processo de <strong>verificação</strong> das credenciais que um usuário fornece com aquelas armazenadas em um sistema para <strong>provar</strong> que o usuário é quem diz ser. Se as credenciais corresponderem, você concederá acesso. Se não, você nega.</p><h3 id="m-todos-de-autentica-o">Métodos de autenticação</h3><h4 id="autentica-o-de-fator-nico-">Autenticação de fator único:</h4><p>Isso, geralmente, é usado como processo de autenticação para sistemas de menor risco. Você só precisa de um único fator para autenticar, sendo o mais comum uma senha. Por isso, é mais vulnerável a ataques de <em>phishing</em> e <em>keyloggers</em>.</p><p>Além disso, um <a href="https://dataprot.net/statistics/password-statistics/">artigo</a> (em inglês) recente da DataProt mostrou que 78% das pessoas da geração Z utilizam a mesma senha para vários serviços. Isso significa que, se um invasor obtiver acesso a uma conta de usuário, ele terá uma alta probabilidade de obter acesso a outros serviços simplesmente usando a mesma senha.</p><h4 id="autentica-o-de-dois-fatores-">Autenticação de dois fatores:</h4><p>Este método é mais seguro, pois compreende dois fatores de autenticação – normalmente, algo que você conhece – por exemplo, nome de usuário e senha, mais algo que você possui, por exemplo, um SMS de telefone ou um token de segurança.</p><p>Para a autenticação de dois fatores, você deve inserir uma senha SMS única enviada para o seu dispositivo, ou talvez um código de uma aplicação de autenticação vinculada e fornecer um código de acesso em constante mudança.</p><p>Como você pode imaginar, isso é muito mais seguro do que simplesmente inserir uma senha ou uma única credencial de autenticação. Você precisaria saber as credenciais de login, bem como ter acesso ao dispositivo físico para a segunda parte.</p><p>A autenticação de dois fatores tornou-se muito comum entre os serviços <em>on-line</em> nos últimos anos e, em muitas grandes empresas, é o método de autenticação padrão. Muitos exigem que você configure a autenticação de dois fatores para utilizar o serviço.</p><h4 id="autentica-o-multifator-">Autenticação multifator:</h4><p>Dar um passo além para tornar seu processo de autenticação ainda mais seguro é ter 3 ou mais fatores. Esse modo de autenticação geralmente funciona com base em:</p><ul><li>algo que você conhece (nome de usuário + senha ou um nome de usuário + pergunta e resposta de segurança)</li><li>algo que você tem (sms de celular, aplicação de autenticação, chave USB)</li><li>algo que você é (como uma impressão digital / reconhecimento facial)</li></ul><p>Por esses motivos, a autenticação multifator oferece mais proteção, pois você precisaria de uma combinação dos vários fatores. Esses fatores são muito mais difíceis de "hackear" ou replicar.</p><p>A desvantagem desse método de autenticação e o motivo pelo qual não é utilizado em muitos sistemas comuns é que pode ser complicado de configurar e de manter. Portanto, os dados/sistema que você está protegendo realmente precisam justificar a necessidade de tal segurança.</p><h2 id="ent-o-quanta-informa-o-voc-precisa-para-autenticar">Então, quanta informação você precisa para autenticar?</h2><p>Essa pergunta surge em muitas reuniões de arquitetura de segurança e a resposta é: "<em>depende</em>".</p><p>Não é incomum que as empresas combinem vários métodos de autenticação para aumentar a segurança com base na natureza da aplicação.</p><p>Por exemplo, pegue uma aplicação bancária. Ela contém informações muito confidenciais e pode ter um grande impacto financeiro e de reputação se for obtido pela pessoa errada. O banco pode combinar perguntas pessoais a serem respondidas, juntamente com um número do cliente e uma senha complexa.</p><p>Por outro lado, para um site de mídia social, você pode exigir apenas um nome de usuário e senha, que são verificados antes de permitir o acesso.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Auth_Process-1.png" class="kg-image" alt="Auth_Process-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Auth_Process-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Auth_Process-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/02/Auth_Process-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Auth_Process-1.png 1940w" sizes="(min-width: 1200px) 1200px" width="1940" height="922" loading="lazy"></figure><p>Tudo está relacionado ao nível de risco envolvido e a quais informações alguém pode acessar quando estiver na aplicação. Isso ajuda a determinar o nível de autenticação necessário.</p><p>Se você ou sua equipe subestimar o nível de autenticação que sua aplicação precisa, poderá ser processado por não proteger os dados em seu sistema adequadamente. Por isso, as empresas empregam especialistas em segurança para aconselhar sobre as melhores práticas e soluções adequadas.</p><h2 id="como-funciona-a-autentica-o-no-mundo-real">Como funciona a autenticação no mundo real?</h2><p>Vamos dar um exemplo de uma conta de mídia social. Você escolhe seu site de mídia social favorito (hospedado em um servidor). O servidor solicitará que você forneça credenciais para acessar o site por meio de uma página de login. Aqui, você digitaria seu nome de usuário e senha que você usou ao criar a conta.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/server-process-2.png" class="kg-image" alt="server-process-2" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/server-process-2.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/server-process-2.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/02/server-process-2.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/server-process-2.png 2210w" sizes="(min-width: 1200px) 1200px" width="2210" height="1552" loading="lazy"><figcaption>Imagem mostrando o processo de autenticação</figcaption></figure><p>Esses detalhes são enviados ao servidor e o processo de autenticação é iniciado. Os detalhes que você forneceu são verificados e conferidos no banco de dados do servidor e, se corresponderem aos detalhes registrados, você será autenticado. Em seguida, você recebe uma espécie de dados de identificação, por exemplo, um cookie ou Json Web Token (token JWT).</p><p>Sucesso! Você acessou o site e recebeu direito de entrada.</p><p>Você pode aprender mais sobre os tokens JWT em outro artigo do FreeCodeCamp, de Beau Carnes, <a href="https://www.freecodecamp.org/news/what-are-json-web-tokens-jwt-auth-tutorial/">aqui</a> (texto em inglês).</p><p>Em seguida, vamos ver a autorização.</p><h2 id="o-que-autoriza-o">O que é autorização?</h2><p>Autorização é o processo de verificar se você tem <strong>permissão</strong> para acessar uma área de uma aplicação ou executar ações específicas, com base em determinados critérios e condições estabelecidos pela aplicação. Você também pode ouvi-lo ser chamado de controle de acesso ou controle de privilégio.</p><p>A autorização pode conceder ou negar permissão para realizar tarefas ou acessar áreas de uma aplicação.</p><p>Vejamos um exemplo:</p><p>Obtivemos acesso ao site de mídia social, mas o que podemos fazer lá depende do que estamos autorizados a fazer.</p><p>Se tentarmos acessar o perfil de alguém de quem não somos amigos (eles não aceitaram nosso pedido de conexão), não estamos <strong>autorizados</strong> a visualizar seu perfil. Isso significa que não temos permissão para visualizar suas postagens compartilhadas.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/auth-process2-1.png" class="kg-image" alt="auth-process2-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/auth-process2-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/auth-process2-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/02/auth-process2-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/auth-process2-1.png 1771w" sizes="(min-width: 1200px) 1200px" width="1771" height="952" loading="lazy"><figcaption>Imagem do fluxo de autorização</figcaption></figure><h3 id="como-implementar-autoriza-o">Como implementar autorização</h3><p>Há muitas maneiras de implementar a autorização, dependendo dos <em>frameworks </em>que você está usando.</p><p>Dentro do .NET Framework, por exemplo, você pode usar controle de acesso baseado em função ou controle de acesso baseado em reivindicações.</p><p>O controle de acesso baseado em função é centrado na ideologia de que cada usuário em seu sistema recebe uma função. Essas funções têm permissões predefinidas associadas a elas. Receber uma função significa que o usuário herdará automaticamente todas essas permissões. As funções são atribuídas no momento da criação e configuração do usuário.</p><p>O <em>endpoint </em>ou site simplesmente verifica se o usuário conectado no momento tem a função de administrador ao tentar acessar a área de administração.</p><p>A desvantagem dessa abordagem é que, às vezes, os usuários recebem muitas permissões que não precisam ou não deveriam ter.</p><p>Por exemplo, atribuir a um usuário a função de <code>Admin</code> pode significar que ele teria privilégios de <code>Advanced Create</code>, <code>Edit</code>, <code>Delete</code> e <code>View</code>. Considerando que, você pode querer dar a ele apenas as permissões <code>View</code> e <code>Basic Create</code>.</p><p>O controle de acesso baseado em reivindicações pode permitir um ajuste mais fino das permissões de um usuário específico. A aplicação pode verificar se a reivindicação simplesmente existe em um usuário ou se um valor específico é atribuído à reivindicação.</p><p>Por exemplo, uma reivindicação chamada <code>CreateUser</code> pode ser fornecida a um usuário e isso é verificado ao criar um usuário. Ou você pode atribuir um valor de <code>Advanced</code> à mesma reivindicação e, em seguida, ter diferentes ações e interfaces de usuário disponíveis, dependendo se o valor for <code>Advanced</code> ou <code>Basic</code>.</p><h2 id="qual-a-diferen-a-entre-autentica-o-e-autoriza-o">Qual é a diferença entre autenticação e autorização?</h2><p>Portanto, agora que entendemos melhor os termos, vamos ver um cenário com o qual você pode estar familiarizado e que envolve os dois processos.</p><p>Em um jantar com lista exclusiva de convidados, cada convidado recebe um apelido e uma senha secreta.</p><p>Na chegada, um guarda de segurança pede seu apelido e senha secreta. Ele, então, <strong>autentica</strong> suas credenciais na lista que possui. Se suas credenciais corresponderem, você receberá um envelope mostrando que foi autorizado a entrar.</p><p>Uma vez lá dentro, você tem permissão para acessar a festa e as áreas públicas do local, pois não precisam de <strong>autorização</strong> (todos têm permissão para aproveitar a festa). No entanto, você deseja visitar a área VIP.</p><p>Conforme você se aproxima, outro segurança pede para abrir seu envelope (suas permissões e funções). Ele dá uma olhada, mas, infelizmente, você não tem a função VIP e, portanto, não está <strong>autorizado</strong> a acessar. Simplificando, a autenticação verifica a identidade de um usuário ou serviço que permite o acesso, enquanto a autorização determina o que eles podem fazer depois de entrar.</p><h2 id="por-que-voc-deve-implementar-autentica-o-e-autoriza-o">Por que você deve implementar autenticação e autorização?</h2><p>Como você pode ver, embora autenticação e autorização sejam muito diferentes, cada uma desempenha um papel integral na segurança e integridade da aplicação ou sistema.</p><p>Esses processos andam de mãos dadas e, sem um, o outro não tem sentido. Se você pode obter acesso à área de administração, mas fazer o que quiser uma vez lá, isso pode levar a grandes problemas.</p><p>Por outro lado, você não pode autorizar pessoas sem saber quem são! É por isso que a autenticação sempre vem antes da autorização.</p><h2 id="considera-es-finais">Considerações finais</h2><p>Espero que este artigo tenha sido esclarecedor e agora você tenha uma compreensão mais clara das diferenças entre autorização e autenticação e como usá-las.</p><p>Lembre-se:</p><ul><li>Autenticação = &nbsp;verificar a identidade de um usuário ou processo</li><li>Autorização = determinar se o usuário/sistema tem permissão para usar um recurso ou realizar uma ação</li></ul><p>Sinta-se à vontade para entrar em contato via Twitter se desejar discutir este artigo com o autor em mais detalhes: <a href="http://twitter.com/gweaths">@gweaths</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como aprender React ]]>
                </title>
                <description>
                    <![CDATA[ Nunca houve um ano melhor para aprender React, a biblioteca mais popular do JavaScript para criar aplicações front-end, do que neste ano. Neste guia, mostrarei os recursos e dicas mais valiosos que, acredito, ajudarão você a aprender React mais rapidamente. Você também economizará muito tempo e energia preciosos no processo. ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-aprender-react/</link>
                <guid isPermaLink="false">63b4cc9c44e27f060d7a5ee1</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Sun, 26 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/learn-react-2023.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-learn-react-in-2023/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Learn React in 2023</a>
      </p><h3 id="nunca-houve-um-ano-melhor-para-aprender-react-a-biblioteca-mais-popular-do-javascript-para-criar-aplica-es-front-end-do-que-neste-ano-">Nunca houve um ano melhor para aprender React, a biblioteca mais popular do JavaScript para criar aplicações front-end, do que neste ano.</h3><p>Neste guia, mostrarei os recursos e dicas mais valiosos que, acredito, ajudarão você a aprender React mais rapidamente. Você também economizará muito tempo e energia preciosos no processo.</p><h2 id="precisa-aprender-javascript-voc-pode-aprender-enquanto-aprende-react">Precisa aprender JavaScript? Você pode aprender enquanto aprende React</h2><p>A pergunta que os iniciantes que procuram aprender mais fazem React é: "preciso aprender JavaScript?"</p><p>O React é uma biblioteca do JavaScript e geralmente é anunciado como sendo "apenas JavaScript". Isso sugere que, para realmente aprender React, você deve conhecer JavaScript primeiro. A maneira como eu caracterizaria o relacionamento do JavaScript com o React é – <em>quanto melhor você conhecer o JavaScript, melhor desenvolvedor do React você se tornará.</em></p><p>Dito isso, você <strong>não</strong> precisa aprender tudo sobre JavaScript primeiro. Muitos conceitos de JavaScript podem ser aprendidos ao mesmo tempo em que você aprende React.</p><p>Aqui está uma lista de alguns dos conceitos em JavaScript que você precisará entender para poder usar o React de modo eficaz. Eles incluem:</p><ul><li>Variáveis</li><li>Arrays (e a função .map())</li><li>Objetos</li><li>Eventos em JavaScript</li><li>Funções e <em>arrow functions</em></li><li>Escopos e <em>closures</em></li><li><em>Promises</em> e sintaxe de <em>async</em>-<em>await</em></li><li>Tratamento de erros básico</li></ul><p>Esses são todos os conceitos de JavaScript que, na minha experiência, você realmente precisa saber para trabalhar com o React em qualquer nível.</p><p>Você encontrará e aprenderá mais conceitos do React ao começar a construir seus próprios projetos e observar o código de outros.</p><p>Se você deseja um guia útil para começar a aprender esses conceitos e muito mais hoje, o autor deste artigo criou uma <a href="https://www.freecodecamp.org/news/javascript-skills-you-need-for-react-practical-examples/">extensa ficha informativa no freeCodeCamp</a> (em inglês), que abrange todo o JavaScript de que você precisa para se sentir confiante com o React.</p><h2 id="procurando-por-um-tutorial-use-a-nova-documenta-o-do-react">Procurando por um tutorial? Use a nova documentação do React</h2><p>Quando você inicia seu caminho de aprendizado do React, sua primeira pergunta provavelmente será: "onde aprendo todas as informações relacionadas ao React de que preciso?" Você pode estar se perguntando se deve assistir a cursos no YouTube ou comprar um curso na Udemy.</p><p>Embora existam excelentes (e extensos) cursos de React em muitos sites diferentes, o primeiro e principal site em que você deve confiar é o site oficial de documentação do React: <a href="https://reactjs.org/">reactjs.org</a>.</p><p>O que há de muito especial em aprender React neste ano em contraste com os anos anteriores é que, no ano passado, a documentação do React foi completamente atualizada e aprimorada. Ela está totalmente atualizada com a versão atual do React, tem muitos exemplos práticos e até <em>sandboxes </em>de código interativos para que você possa começar a aprender React no navegador sem precisar criar projetos em sua própria máquina.</p><blockquote>Se você quiser criar um novo projeto do React, poderá fazê-lo rapidamente no navegador usando o link <a href="https://react.new/">react.new</a>. Ele criará um CodeSandbox com uma aplicação do React completa para você utilizar. É muito mais rápido e fácil fazer isso do que criar um projeto no seu próprio computador.</blockquote><p>Você pode encontrar a nova documentação do React em <a href="https://beta.reactjs.org/">beta.reactjs.org</a>. No devido tempo, você poderá encontrá-la simplesmente em reactjs.org.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screen-Shot-2023-01-02-at-5.27.01-AM.png" class="kg-image" alt="Screen-Shot-2023-01-02-at-5.27.01-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screen-Shot-2023-01-02-at-5.27.01-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screen-Shot-2023-01-02-at-5.27.01-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/02/Screen-Shot-2023-01-02-at-5.27.01-AM.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screen-Shot-2023-01-02-at-5.27.01-AM.png 1910w" sizes="(min-width: 720px) 720px" width="1910" height="1310" loading="lazy"><figcaption>beta.reactjs.org</figcaption></figure><p>Outro grande motivo para usar a nova documentação do React é que ela é muito amigável para iniciantes e, na minha opinião, permitirá que você aprenda conceitos muito mais rápido do que faria de outro modo. Se você se sentiu intimidado ao ler a documentação técnica no passado, acho que ficará agradavelmente surpreso.</p><h2 id="voc-n-o-precisa-aprender-componentes-de-classe">Você não precisa aprender componentes de classe</h2><p>Se você está se perguntando se precisa aprender os componentes da classe neste ano, não. Não precisa.</p><p>Conforme você começa a aprender React, você ouvirá sobre algo chamado <strong>componente de classe</strong>, que é baseado em uma classe do JavaScript normal. Não é mais necessário aprender isso para ser um desenvolvedor do React, mas ainda pode ser útil aprender.</p><p>Após a introdução de um recurso chamado <strong>React hooks</strong>, em 2018, os desenvolvedores do React passaram a usar componentes de função, que são feitos com funções do JavaScript.</p><p>Os componentes de classe ainda fazem parte do React e ainda são usados no código de produção em várias situações (como em limites de erro). Esteja ciente, porém, de que você não precisa aprendê-los para ser habilidoso no React.</p><p>Na verdade, eu raramente os encontrei, a menos que esteja olhando para uma base de código mais antiga. A maioria das classes já foi migrada para componentes de função e hooks do React.</p><h2 id="fa-a-um-favor-a-voc-mesmo-e-aprenda-react-query">Faça um favor a você mesmo e aprenda React Query</h2><p>Qualquer aplicação séria precisa de dados. Muitas vezes, os dados de que você precisa existirão fora de sua aplicação, portanto, você precisará de uma estratégia para buscá-los e usá-los em seu projeto.</p><p>Quando você chegar ao ponto de buscar dados, eu recomendo fortemente que você aprenda uma biblioteca chamada <strong>React Query</strong>.</p><p>Você pode instalar o React Query através do pacote npm @tanstack/react-query.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screen-Shot-2023-01-02-at-5.28.02-AM.png" class="kg-image" alt="Screen-Shot-2023-01-02-at-5.28.02-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screen-Shot-2023-01-02-at-5.28.02-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screen-Shot-2023-01-02-at-5.28.02-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screen-Shot-2023-01-02-at-5.28.02-AM.png 1538w" sizes="(min-width: 720px) 720px" width="1538" height="1134" loading="lazy"><figcaption>React Query, também chamado de Tanstack Query</figcaption></figure><p>O React Query se tornou a biblioteca ideal para buscar e gerenciar dados externos em aplicações do React.</p><p>Qual é o benefício de se usar o React Query? Além de ser uma biblioteca com a qual muitos desenvolvedores e empresas do React estão familiarizados e confiam, será muito benéfico para você aprender o React Query porque é, sem dúvida, a maneira mais poderosa de buscar e gerenciar dados externos em suas aplicações do React.</p><p>O maior benefício de usar o React Query vem do fato de que ele fornece um cache (um armazenamento) que permite manter o resultado de cada consulta, para que você possa "salvar" os dados que você buscou. Além disso, possui muitas ferramentas para atualizar esse cache exatamente da maneira que você deseja.</p><p>Ele também apresenta informações relevantes sobre o status de cada consulta que você faz, como, por exemplo, quando ela está carregando ou quando resultou em um erro.</p><p>Eu aprenderia o React Query depois que você se sentir confortável em buscar dados manualmente usando ferramentas como Fetch API, Axios com o hook useEffect. Assim que estiver, você verá o benefício de usar o React Query em todos os seus projetos do React.</p><h2 id="voc-n-o-precisa-aprender-redux">Você não precisa aprender Redux</h2><p>Se você tentou aprender React anos atrás, pode ter ficado com a impressão de que, para aprender React, você finalmente teve que aprender outra biblioteca chamada Redux.</p><p>O <strong>Redux</strong> é uma biblioteca que nos ajuda a gerenciar o estado (do inglês, <em>state</em>) em nossas aplicações do React. Você pode pensar em estado como quaisquer dados que podem mudar em uma aplicação do React. O Redux nos permite gerenciar uma parte do estado (como, por exemplo, se o nosso usuário está logado) em todas as partes de nossa aplicação do React.</p><p>Não é mais necessário aprender o Redux como era nos anos anteriores. A primeira razão para isso é o lançamento da API <strong>React Context</strong>. Em muitos casos, os desenvolvedores do React usaram o Redux apenas para passar dados pelos componentes de suas aplicações. Este é um trabalho que o React Context pode fazer por nós.</p><p>Além disso, se você precisar alterar ou atualizar o estado em muitas partes diferentes de sua aplicação (o que é um requisito diferente da simples leitura do seu estado), existem muitos concorrentes para o Redux. Ao contrário do Redux, essas bibliotecas não exigem que você aprenda novos conceitos, como redutores, ações e assim por diante.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image.png" class="kg-image" alt="image" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image.png 1200w" sizes="(min-width: 720px) 720px" width="1200" height="600" loading="lazy"><figcaption>Zustand - Gerenciamento de estado "Bearbone"</figcaption></figure><p>Algumas dessas bibliotecas de gerenciamento de estado mais recentes e "mais leves" incluem:</p><ul><li><strong>Zustand</strong></li><li>Jotai</li><li>Recoil</li></ul><p>Uma vez que você supere o básico do React e comece a construir aplicações um pouco maiores além da aplicação de tarefas padrão, você entenderá a necessidade de ter uma biblioteca de gerenciamento de estado. O Redux ainda é uma ótima biblioteca, mas primeiro procure uma biblioteca com uma API mais simples, como o Zustand.</p><h2 id="o-create-react-app-n-o-necess-rio">O Create React App não é necessário</h2><p>Assim que estiver no ponto de criar um projeto do React por conta própria que resida em seu computador, saiba que há muitas maneiras de fazer isso.</p><p>O desenvolvimento para a web em geral está cada vez mais <em>on-line</em> – nem todo projeto do React precisa ser feito no seu computador. Em muitos casos, você pode criar um projeto no navegador usando ferramentas como <strong>CodeSandbox</strong> ou <strong>StackBlitz </strong>totalmente grátis.</p><p>Haverá um ponto, no entanto, em que você precisará ou desejará criar um projeto do React em sua máquina local. É fácil buscar uma ferramenta como o <strong>Create React App</strong>, que permite criar um projeto do React executando um único comando.</p><p>O Create React App ainda é uma ótima ferramenta para se fazer projetos em React. Assim como no Redux, surgiram novas alternativas que oferecem todas as conveniências do Create React App, mas em um pacote menor e geralmente mais rápido.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screen-Shot-2023-01-02-at-5.30.02-AM.png" class="kg-image" alt="Screen-Shot-2023-01-02-at-5.30.02-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screen-Shot-2023-01-02-at-5.30.02-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screen-Shot-2023-01-02-at-5.30.02-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/02/Screen-Shot-2023-01-02-at-5.30.02-AM.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screen-Shot-2023-01-02-at-5.30.02-AM.png 2348w" sizes="(min-width: 720px) 720px" width="2348" height="896" loading="lazy"><figcaption>Vite, uma alternativa ao Create React App</figcaption></figure><p>O principal exemplo disso é o <strong>Vite</strong>. O Vite é uma ferramenta de construção que permite criar um projeto do React, bem como muitos outros tipos de projetos em JavaScript.</p><p>O benefício de se usar o Vite em vez do Create React App está no fato de ele oferecer um servidor de desenvolvimento muito mais rápido.</p><p>Para desenvolver e fazer alterações em sua aplicação, ele deve ser executado em um servidor de desenvolvimento. O Create React App, em comparação, pode levar um tempo relativamente longo para iniciar e responder às alterações no código que você faz (isso é chamado de <strong>hot reloading</strong>, em inglês). O Vite fornece uma experiência muito mais rápida, além de exigir muito menos dependências.</p><p>Outra ótima alternativa ao Create React App é o <strong>Next.js</strong>. O Next é, tecnicamente, um framework do React que vem com muitas conveniências para tornar o desenvolvimento muito mais fácil. Ele vem com seu próprio roteador e ferramentas de busca de dados, para citar algumas dessas conveniências.</p><p>O benefício de se usar um framework como Next.js é que você simplesmente precisa tomar menos decisões quando se trata de construir seu projeto. Você precisa escolher muito menos dependências das quais seu projeto depende. Quase tudo o que você precisa para criar sua aplicação do React vem embutido no Next.js.</p><p>Dito isso, o Next opera de maneira bastante diferente dos projetos normais do React devido ao fato de ser renderizado pelo servidor por padrão. Isso pode vir com seus próprios problemas e possíveis armadilhas a serem evitadas. Se você, contudo, estiver interessado em criar projetos do React sérios e prontos para produção, o Next é indiscutivelmente a melhor escolha.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Perguntas e respostas de entrevistas sobre AWS Lambda ]]>
                </title>
                <description>
                    <![CDATA[ Neste artigo, abordarei algumas das perguntas mais comuns que surgem em entrevistas sobre o AWS Lambda. Observe que esta não é uma lista exaustiva – você pode usar este guia, no entanto, como uma referência para atualizar seu conhecimento e obter indicações de estudos mais aprofundados. A maioria das perguntas ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/perguntas-e-respostas-de-entrevistas-sobre-aws-lambda/</link>
                <guid isPermaLink="false">63b4674d44e27f060d7a5d83</guid>
                
                    <category>
                        <![CDATA[ AWS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Thu, 23 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/AWS-Lambda-Interview-Questions.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/aws-lambda-interview-questions/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">AWS Lambda Interview Questions and Answers</a>
      </p><p>Neste artigo, abordarei algumas das perguntas mais comuns que surgem em entrevistas sobre o AWS Lambda.</p><p>Observe que esta não é uma lista exaustiva – você pode usar este guia, no entanto, como uma referência para atualizar seu conhecimento e obter indicações de estudos mais aprofundados.</p><p>A maioria das perguntas será baseada em sua experiência ou em determinados cenários. As perguntas estão nos títulos e você encontrará, logo abaixo delas, observações sobre o raciocínio por trás de fazer as perguntas.</p><h2 id="explique-seu-ltimo-projeto-envolvendo-o-aws-lambda">Explique seu último projeto envolvendo o AWS Lambda</h2><p><em>O entrevistador quer saber sobre sua experiência na vida real usando o AWS Lambda. Não blefe aqui, pois o entrevistador pode fazer mais perguntas com base nas respostas a essa pergunta.</em></p><p>Você pode ter criado uma API sem servidor (em inglês, <em>serverless</em>), sistemas envolvendo microsserviços, conversão de imagem/vídeo, análise de <em>logs</em> e muito mais. Apenas explique seu projeto em detalhes e fale sobre os benefícios comerciais desse projeto para que o entrevistador saiba que você está vendo o quadro geral.</p><h2 id="quais-servi-os-voc-integrou-com-o-aws-lambda">Quais serviços você integrou com o AWS Lambda?</h2><p><em>Essa é uma extensão da pergunta anterior. Ela não é uma lista completa de todas as fontes de eventos que podem se conectar ao AWS Lambda. Conte apenas sobre os serviços que você realmente usou.</em></p><p>Você pode ter usado S3, SNS, SQS, Kinesis, DynamoDB, SES ou outros. Nem todos os projetos serão completamente sem servidor.</p><p>Se você usou algum componente sem servidor junto com o AWS Lambda, mencione-os também. Por exemplo, você pode ter usado AWS Lambda com RDS. Se você usou essa configuração, pode explicar sobre isso em seu raciocínio.</p><h2 id="explique-o-conceito-de-inicializa-es-a-quente-e-a-frio-warm-and-cold-starts-no-aws-lambda">Explique o conceito de inicializações a quente e a frio (<em>warm and cold starts</em>) no AWS Lambda</h2><p><em>Há duas razões para fazer esta pergunta. Eles querem saber os tempos de execução que você usou e querem saber se você conhece os outros tempos de execução que podem causar uma inicialização a frio.</em></p><p>Os serviços Lambda recebem uma solicitação para executar uma função lambda. O serviço prepara o ambiente de execução baixando o código da função do manipulador e alocando memória junto com outra configuração.</p><p>Mesmo que você não seja cobrado por esse tempo de preparação do ambiente de execução, terá que enfrentar o atraso na chamada de sua função lambda. Esse atraso é chamado de "inicialização a frio" (do inglês, "<em>cold start</em>").</p><p>O tempo de inicialização a frio é menos significativo para ambientes de tempo de execução do TypeScript e do Python, sendo um pouco maior para ambientes de tempo de execução do Java ou do C#.</p><p>Para melhorar o desempenho, o serviço lambda manterá o ambiente de execução por algum tempo. Quando você receber a solicitação para a mesma função lambda novamente durante esse período, seu manipulador poderá começar a executar imediatamente. Esse tipo de chamada é chamada de "<em>inicialização a quente</em>" (do inglês, "<em>warm start</em>").</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-18.png" class="kg-image" alt="image-18" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-18.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-18.png 890w" width="890" height="198" loading="lazy"><figcaption><a href="https://aws.amazon.com/blogs/compute/operating-lambda-performance-optimization-part-1/">Fonte da imagem</a></figcaption></figure><h2 id="qual-a-diferen-a-entre-invoca-o-s-ncrona-e-ass-ncrona-no-aws-lambda">Qual é a diferença entre invocação síncrona e assíncrona no AWS Lambda?</h2><p><em>Mesmo que pareça uma pergunta direta, ela tem muitas implicações para o seu design e tratamento de erros.</em></p><p>Na invocação síncrona, o chamador aguardará a conclusão da execução. Na invocação assíncrona, contudo, o chamador colocará o evento em uma fila interna que, posteriormente, será processada na função lambda.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-19.png" class="kg-image" alt="image-19" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-19.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-19.png 627w" width="627" height="244" loading="lazy"><figcaption><a href="https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html">Fonte da imagem</a></figcaption></figure><p>Um ponto importante a ser observado aqui é que você não pode ditar o tipo de invocação. Isso depende do serviço que você usa com o AWS Lambda.</p><p>Por exemplo, se você estiver criando APIs sem servidor usando o API Gateway, será uma invocação síncrona. Se você, no entanto, estiver usando o S3, será uma invocação assíncrona.</p><h2 id="como-voc-implementa-tratamento-de-erros-e-l-gica-de-novas-tentativas-no-lambda">Como você implementa tratamento de erros e lógica de novas tentativas no Lambda?</h2><p><em>Qualquer componente no sistema orientado a eventos que possa falhar, falhará. Então, o entrevistador quer saber como você lidou com o erro e como tentou novamente em seus projetos anteriores. Abaixo estão alguns exemplos. Sempre explique com exemplos concretos.</em></p><p>Isso depende do serviço que você está usando com o AWS Lambda. Vamos discutir alguns exemplos.</p><p>Se você estiver criando uma API sem servidor, é melhor retornar esse erro para o <em>client</em> de chamada (pode ser uma aplicação de <em>front-end</em> neste caso). Em seguida, você permite que sua lógica de <em>front-end </em>decida o que exibir ao usuário com base no tipo de erro.</p><p>Se você estiver usando o Lambda com SQS, é melhor usar uma <em>Dead Letter Queue</em> para saber quais mensagens não foram processadas. Por esse mesmo motivo, muitos dos sistemas que usam SNS também podem usar SQS.</p><p>No código abaixo, estamos usando uma <em>dead letter queue</em>. Se alguma mensagem não for processada após um determinado número de vezes (conforme especificado por <code>maxReceiveCount</code>), ela será enviada para a "fila de mensagens mortas". Esse comportamento é específico para lambda quando usado junto com filas.</p><pre><code class="language-typescript">const queue = new sqs.Queue(this, 'AwsLambdaSqsQueue', {
      visibilityTimeout: cdk.Duration.seconds(300),
      receiveMessageWaitTime: cdk.Duration.seconds(20),
      deadLetterQueue: {
        queue: new sqs.Queue(this, 'AwsLambdaDlq'),
        maxReceiveCount: 5,
      },
    });</code></pre><p>Quando o lambda é invocado com qualquer outro serviço, você pode configurar o número de tentativas com um valor máximo de 2. Isso significa que você pode ter, no máximo, duas tentativas além da chamada inicial. Por exemplo, você deseja acionar com base no upload do objeto S3 e seu lambda tentará no máximo três vezes.</p><h2 id="explique-seus-fluxos-de-trabalho-para-desenvolvimento-e-implanta-o-de-fun-es-do-aws-lambda">Explique seus fluxos de trabalho para desenvolvimento e implantação de funções do AWS Lambda</h2><p><em>Fale sobre os frameworks que você usou. O entrevistador pode esperar que você fale sobre o teste de funções lambda também.</em></p><p>Você pode explicar quais <em>frameworks</em> você usou para desenvolver e implantar funções lambda. Você também pode falar sobre qualquer ferramenta de IaC (Infraestrutura como Código) que você usou.</p><p>Abaixo, temos uma lista não exaustiva dos <em>frameworks </em>mais usados:</p><ul><li>Serverless</li><li>AWS CDK</li><li>AWS SAM</li><li>CloudFormation</li><li>Pulumi</li></ul><p>Se você já usou o Terraform, também pode falar sobre isso.</p><h2 id="o-lambda-pode-ser-invocado-quando-voc-recebe-um-e-mail-para-um-determinado-endere-o-de-e-mail-de-suporte-se-sim-projete-esse-sistema-se-n-o-explique-por-qu-">O Lambda pode ser invocado quando você recebe um e-mail para um determinado endereço de e-mail de suporte? Se sim, projete esse sistema. Se não, explique por quê.</h2><p>Sim, você pode. Você pode criar um conjunto de regras de recebimento e adicionar uma regra que acione a função lambda.</p><p>Você deve armazenar o e-mail no S3 e acionar o lambda depois disso para que possa ter a cópia do e-mail para qualquer referência futura.</p><p>Você pode consultar <a href="https://www.freecodecamp.org/news/how-to-receive-emails-via-your-sites-contact-us-form-with-aws-ses-lambda-api-gateway/">este artigo</a> (em inglês) sobre como receber e-mails de um formulário de contato.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-20.png" class="kg-image" alt="image-20" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-20.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-20.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-20.png 1010w" width="1010" height="772" loading="lazy"><figcaption><a href="https://www.freecodecamp.org/news/how-to-receive-emails-via-your-sites-contact-us-form-with-aws-ses-lambda-api-gateway/">Fonte da imagem</a></figcaption></figure><h2 id="uma-fun-o-lambda-pode-chamar-outra-fun-o-lambda">Uma função lambda pode chamar outra função lambda?</h2><p><em>O entrevistador quer saber se você conhece esse antipadrão.</em></p><p>Você pode fazer isso, mas não é recomendado. Se quiser criar um fluxo de trabalho que envolva várias funções lambda, você pode usar as funções de etapa.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/image-21.png" class="kg-image" alt="image-21" width="600" height="400" loading="lazy"><figcaption><a href="https://aws.amazon.com/step-functions/">Fonte da imagem</a></figcaption></figure><p>Você pode ler mais sobre funções de etapa <a href="https://aws.amazon.com/step-functions/">aqui</a>.</p><p>Outra abordagem padrão é emitir um evento e acionar um lambda com base no evento. Você pode usar SQS, SNS ou EventBridge como intermediário para esses eventos.</p><h2 id="voc-pode-executar-consultas-em-uma-inst-ncia-do-rds-em-uma-sub-rede-privada-usando-o-lambda">Você pode executar consultas em uma instância do RDS (em uma sub-rede privada) usando o Lambda?</h2><p>Sim, você pode executar a consulta no RDS usando o AWS Lambda. Para isso, você pode ter seu lambda dentro da mesma VPC.</p><p>Pode haver algumas implicações de desempenho se você usar o AWS Lambda diretamente com o RDS. Isso ocorre devido ao tempo de criação da conexão do banco de dados. Para evitar essas implicações, você pode usar um RDS Proxy.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-22.png" class="kg-image" alt="image-22" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-22.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-22.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-22.png 1260w" sizes="(min-width: 1200px) 1200px" width="1260" height="960" loading="lazy"><figcaption><a href="https://www.freecodecamp.org/news/aws-lambda-rds/">Fonte da imagem</a></figcaption></figure><p>Aqui está um <a href="https://www.freecodecamp.org/news/aws-lambda-rds/">guia passo a passo detalhado</a> (em inglês) que mostra como fazer isso.</p><h2 id="o-aws-lambda-fornece-muitos-benef-cios-quais-s-o-as-desvantagens-de-se-usar-o-aws-lambda">O AWS Lambda fornece muitos benefícios. Quais são as desvantagens de se usar o AWS Lambda?</h2><p><em>O entrevistador quer saber sobre o seu processo de pensamento. Não diga que o AWS Lambda resolve todos os problemas. 🙂</em></p><p>Sim, o Lambda oferece muitos benefícios, como custo e escalabilidade, sem a necessidade de manter os servidores. Ele, porém, não é a resposta para tudo. Como qualquer serviço, ele tem seus próprios problemas (e você deve ser capaz de discuti-los):</p><ul><li>Depuração: se você estiver usando arquiteturas sem servidor usando o Lambda, talvez precise contar com o <em>log</em> para encontrar a causa raiz do problema. Isso ocorre porque seu aplicativo será distribuído em muitos serviços/funções lambda.</li><li>Teste: você pode simular serviços da AWS em seu teste local. É melhor, no entanto, ter um ambiente separado na AWS para testar seus lambdas. Isso torna o teste um pouco complexo.</li><li>Tarefas em segundo plano: o Lambda tem um limite de tempo limite de 15 minutos. Se você deseja que qualquer tarefa específica leve mais de 15 minutos, talvez seja necessário mudar para o Fargate ou alguma outra solução.</li><li>Custo: se você estiver executando um aplicativo de alto tráfego que processa as solicitações 24 horas por dia, 7 dias por semana, o uso de lambda pode ser caro. É melhor usar Fargate, EC2 ou outros serviços, se você tiver alto tráfego constante.</li></ul><h2 id="como-voc-gerencia-simultaneidade-e-dimensionamento-no-aws-lambda">Como você gerencia simultaneidade e dimensionamento no AWS Lambda?</h2><p><em>Você ganhará pontos de bônus se falar sobre os problemas que enfrentou nessas situações.</em></p><p>Simultaneidade (em inglês, <em>concurrency</em>) é a capacidade de executar várias funções lambda ao mesmo tempo. O dimensionamento (<em>scaling</em>) é o processo de aumentar o número de cópias de sua função lambda para lidar com as solicitações recebidas.</p><p>Você pode controlar a simultaneidade definindo o valor de simultaneidade reservada para que apenas o número mencionado de funções lambda seja invocado.</p><p>Abaixo está o diagrama de alto nível de como lambda escala de acordo com o número de mensagens na fila.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-23.png" class="kg-image" alt="image-23" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-23.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-23.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/02/image-23.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-23.png 1880w" sizes="(min-width: 1200px) 1200px" width="1880" height="960" loading="lazy"><figcaption><a href="https://www.cloudtechsimplified.com/aws-lambda-sqs/">Fonte da imagem</a></figcaption></figure><p>Observação: há algum <a href="https://www.cloudtechsimplified.com/aws-lambda-sqs/#weird-behavior">comportamento estranho</a> se você tentar limitar o AWS Lambda quando usado com a fila padrão do SQS. Você pode usar uma fila FIFO para resolver esse problema.</p><h2 id="como-voc-passa-vari-veis-de-ambiente-para-o-aws-lambda">Como você passa variáveis de ambiente para o AWS Lambda?</h2><p><em>O entrevistador pode querer saber como você passa informações sigilosas, por exemplo.</em></p><p>Existem diferentes maneiras de passar variáveis de ambiente para o AWS Lambda, dependendo do tipo de valor que está sendo passado.</p><p><strong>Dados não confidenciais:</strong> se você deseja passar informações não confidenciais, pode passar os valores diretamente para as variáveis de ambiente da função lambda. Esses valores, contudo, seriam visíveis no console da AWS no serviço Lambda. No exemplo de código abaixo, estamos passando o nome da tabela DynamoDB diretamente como variável de ambiente, pois não são dados confidenciais:</p><pre><code>   const readDDBLambdaFn = new NodejsFunction(this, 'readDDBLambdaFn', {
      entry: path.join(__dirname, '../src/lambdas', 'read-ddb.ts'),
      ...nodeJsFunctionProps,
      functionName: 'readDDBLambdaFn',
      environment: {
        tableName: table.tableName,
      },
    });</code></pre><p><strong>Dados confidenciais:</strong> se você deseja transmitir dados confidenciais, como senhas e chaves de API, pode usar um gerenciador de segredos ou um armazenamento de parâmetros. Porém, você precisa se certificar de fornecer as funções necessárias ao Lambda para acessar e descriptografar segredos dos respectivos serviços.</p><p>No trecho de código abaixo, NÃO estamos passando o segredo real. Em vez disso, estamos apenas passando o ARN (Amazon Resource Name) do segredo.</p><pre><code class="language-typescript">const rdsLambdaFn = new NodejsFunction(this, 'rdsLambdaFn', {
      entry: path.join(__dirname, '../src/lambdas', 'rds-lambda.ts'),
      ...nodeJsFunctionProps,
      functionName: 'rdsLambdaFn',
      environment: {
        DB_ENDPOINT_ADDRESS: dbInstance.dbInstanceEndpointAddress,
        DB_NAME: databaseName,
        DB_SECRET_ARN: dbInstance.secret?.secretFullArn || '',
      },
      vpc,
      vpcSubnets: vpc.selectSubnets({
        subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
      }),
    });</code></pre><p>Em seguida, no lambda, você pode obter o segredo real dinamicamente na função lambda, conforme mostrado abaixo:</p><pre><code class="language-typescript">export const handler = async (event: any, context: any): Promise&lt;any&gt; =&gt; {
    const host = process.env.DB_ENDPOINT_ADDRESS || '';
    const database = process.env.DB_NAME || '';
    const dbSecretArn = process.env.DB_SECRET_ARN || '';
    const secretManager = new AWS.SecretsManager({
      region: 'us-east-1',
    });
    const secretParams: AWS.SecretsManager.GetSecretValueRequest = {
      SecretId: dbSecretArn,
    };
    const dbSecret = await secretManager.getSecretValue(secretParams).promise();
    const secretString = dbSecret.SecretString || '';

    const { password } = JSON.parse(secretString);

}</code></pre><p>O autor deste artigo escreveu um tutorial detalhado <a href="https://www.cloudtechsimplified.com/environment-variables-secrets-database-password-aws-lambda/">aqui</a> sobre o mesmo tópico.</p><h2 id="digamos-que-voc-tenha-alguma-ferramenta-exe-execut-vel-dependente-do-windows-voc-pode-carreg-la-em-um-bucket-do-s3-voc-pode-executar-este-bin-rio-com-alguns-par-metros-usando-o-aws-lambda">Digamos que você tenha alguma ferramenta .exe executável dependente do Windows. Você pode carregá-la em um bucket do S3. Você pode executar este binário com alguns parâmetros usando o AWS Lambda?</h2><p><em>Essa é mais uma pergunta para garantir que você entende o ambiente de execução do AWS Lambda – especificamente, o sistema operacional que ele usa.</em></p><p>Não, você não seria capaz de fazer isso, pois o AWS Lambda usa o Linux como sistema operacional. O Linux não seria capaz de executar um binário dependente do Windows.</p><h2 id="como-voc-reutilizaria-c-digo-entre-fun-es-do-aws-lambda">Como você reutilizaria código entre funções do AWS Lambda?</h2><p>Existem duas maneiras de reutilizar o código em muitas funções do AWS Lambda:</p><ul><li>Usar as camadas do Lambda: você pode armazenar seu código ou lógica em camadas do lambda, que você pode reutilizar em diferentes funções do lambda.</li></ul><p>Abaixo está um código de alto nível para criar e consumir camadas do lambda usando <code>aws cdk</code>:</p><pre><code>    const logicLayer = new lambda.LayerVersion(this, 'logic-layer', {
      compatibleRuntimes: [
        lambda.Runtime.NODEJS_14_X,
        lambda.Runtime.NODEJS_16_X,
      ],
      layerVersionName: 'business-logic-layer',
      code: lambda.Code.fromAsset('src/layers/business-logic'),
      description: 'Business logic layer',
    });


    const lambdaWithLayer = new NodejsFunction(this, 'lambdaWithLayer', {
      entry: path.join(__dirname, '../src/lambdas', 'lambda.ts'),
      ...nodeJsFnProps,
      functionName: 'lambdaWithLayer',
      handler: 'handler',
      layers: [logicLayer, utilsLayer],
    });</code></pre><ul><li>Usar <code>monorepo</code>: você pode usar mono repos e pacotes criados dinamicamente em tempo de implantação.</li></ul><h2 id="o-que-acontece-com-suas-fun-es-lambda-se-voc-excluir-uma-camada-lambda">O que acontece com suas funções lambda se você excluir uma camada lambda?</h2><p><em>Nesta pergunta, o entrevistador quer ver o quanto você entende de camadas lambda.</em></p><p>As funções lambda existentes que usam essa camada excluída continuarão a funcionar – pois as camadas lambda são mescladas com as funções lambda no momento da implantação.</p><p>Você, no entanto, não poderá criar uma nova função lambda usando essa camada lambda excluída.</p><p>Você pode aprender mais sobre camadas lambda <a href="https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html">aqui</a> e eu escrevi um guia sobre o mesmo tópico <a href="https://www.cloudtechsimplified.com/aws-lambda-layers/">aqui</a> (ambas as referências em inglês).</p><h2 id="voc-pode-aumentar-o-tamanho-de-um-pacote-de-implanta-o-se-voc-usa-camadas-lambda">Você pode aumentar o tamanho de um pacote de implantação se você usa camadas lambda?</h2><p>Não, você não pode aumentar o tamanho do pacote de implantação se usar camadas lambda. O tamanho máximo de implantação de 50 MB compactado inclui o tamanho da função lambda e suas camadas lambda associadas.</p><p>Se você tiver uma grande base de código e quiser aumentar a implantação, poderá executar contêineres no AWS Lambda.</p><h2 id="posso-pegar-minha-aplica-o-da-web-dockerizada-existente-e-execut-la-usando-o-lambda">Posso pegar minha aplicação da web dockerizada existente e executá-la usando o Lambda?</h2><p>Não. Você não pode pegar nenhuma aplicação do Express, Springboot ou .NET Core (ou qualquer outra aplicação) como está e colocá-la dentro do lambda.</p><p>Dito isso, saiba que existem algumas bibliotecas que permitem colocar aplicações que usam esses <em>frameworks </em>da web no AWS Lambda. Internamente, essas bibliotecas convertem essas aplicações da web em APIs compatíveis com o AWS Lambda. Você pode ver um desses exemplos <a href="https://aws.amazon.com/blogs/aws/running-express-applications-on-aws-lambda-and-amazon-api-gateway/">aqui</a> (em inglês).</p><p>Ao usar esses <em>frameworks</em>, o tamanho de suas funções lambda será maior e resultará em tempos de inicialização mais longos.</p><p>Lembre-se de que, mesmo ao usar contêineres com Lambda, a API de tempo de execução existente do Lambda permanece a mesma. O Lambda ainda vai:</p><ul><li>ser uma única função</li><li>ser invocado por um evento ou manualmente</li><li>ter um limite de tempo de 15 minutos.</li></ul><p>Como você pode ver no código abaixo, não haverá alteração na API lambda. A vantagem de usar o Docker é que você pode usar pacotes grandes sem se preocupar com o tamanho.</p><pre><code class="language-typescript">import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda';

export const handler = async (
  event: APIGatewayEvent,
  context: Context
): Promise&lt;APIGatewayProxyResult&gt; =&gt; {
  console.log(`Event: ${JSON.stringify(event, null, 2)}`);
  console.log(`Context: ${JSON.stringify(context, null, 2)}`);
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Running this handler from docker',
    }),
  };
};</code></pre><p>e é assim que você o usa:</p><pre><code> const repo = ecr.Repository.fromRepositoryName(
      this,
      'dockerLambda',
      'docker-lambda'
    );

    const dockerLambda = new lambda.DockerImageFunction(
      this,
      'DockerLambdaFunction',
      {
        code: lambda.DockerImageCode.fromEcr(repo),
      }
    );</code></pre><p>O autor deste artigo escreveu um tutorial passo a passo sobre execução de contêineres do Docker para sua aplicação em <code>aws lambda</code> <a href="https://www.cloudtechsimplified.com/run-docker-containers-images-from-ecr-in-aws-lambda-along-with-cicd/">aqui</a> (em inglês).</p><h2 id="como-voc-compartilha-arquivos-grandes-entre-fun-es-lambda">Como você compartilha arquivos grandes entre funções lambda?</h2><p>Você pode usar o Elastic File System (EFS) para compartilhar arquivos grandes entre diferentes funções.</p><p>Você pode criar um <code>access point</code> (em português, ponto de acesso) no EFS, criado com as permissões apropriadas, e usar esse <code>access point</code> em seu caminho de montagem em seu lambda.</p><p>Todos os arquivos gravados nesse caminho de montagem estarão acessíveis a todas as outras funções lambda, desde que tenham o caminho de montagem com as permissões apropriadas.</p><p>Abaixo vemos o diagrama lógico de alto nível sobre como usar o AWS Lambda com o Elastic File System (EFS):</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-24.png" class="kg-image" alt="image-24" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-24.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-24.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-24.png 1180w" width="1180" height="800" loading="lazy"><figcaption><a href="https://www.cloudtechsimplified.com/elastic-file-system-efs-aws-lambda/">Fonte da imagem</a></figcaption></figure><p>Você pode ler sobre isso <a href="https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/">aqui</a> (em inglês e um pouco antigo). O autor deste artigo escreveu um guia passo a passo prático mais recente <a href="https://www.cloudtechsimplified.com/elastic-file-system-efs-aws-lambda/">aqui</a> (em inglês) sobre EFS com funções Lambda.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Espero que este artigo tenha ajudado você a se preparar para entrevistas que envolvam o AWS Lambda.</p><p>Obrigado por ler até aqui. O autor também escreve sobre <code>aws</code> e tecnologias sem servidor em <a href="https://www.cloudtechsimplified.com/">https://www.cloudtechsimplified.com</a> (blog em inglês). Se estiver interessado, pode <a href="https://www.cloudtechsimplified.com/">se inscrever</a> no blog dele.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como proteger sua privacidade on-line – cinco ferramentas úteis ]]>
                </title>
                <description>
                    <![CDATA[ No crescente cenário de ameaças cibernéticas de hoje, é importante aprender a se proteger. Neste artigo, compartilharei minhas cinco ferramentas favoritas, que você pode usar para proteger sua privacidade on-line. Por que a privacidade on-line é importante Você já se perguntou sobre o valor de seus dados? Todas as aplicações, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-proteger-sua-privacidade-on-line-cinco-ferramentas-uteis/</link>
                <guid isPermaLink="false">63b424a044e27f060d7a5cd4</guid>
                
                    <category>
                        <![CDATA[ Privacidade ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Wed, 22 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/security-tools.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-protect-your-privacy-online/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Protect Your Privacy Online – Five Useful Tools</a>
      </p><p>No crescente cenário de ameaças cibernéticas de hoje, é importante aprender a se proteger. Neste artigo, compartilharei minhas cinco ferramentas favoritas, que você pode usar para proteger sua privacidade on-line.</p><h2 id="por-que-a-privacidade-on-line-importante">Por que a privacidade on-line é importante</h2><p>Você já se perguntou sobre o valor de seus dados?</p><p>Todas as aplicações, sites e empresas vêm lutando para obter mais informações sobre você. Quanto mais souberem, melhor poderão prever o que você deseja. Às vezes, até mesmo antes de você.</p><p>A privacidade pessoal nos protege de possíveis danos ou invasões indesejadas em nossas vidas. Ela também nos permite manter nossa dignidade e autonomia.</p><p>Mais importante ainda, a privacidade pessoal é nosso direito fundamental. Sem ela, somos apenas pontos de dados usados para treinar um modelo de IA.</p><p>Os cínicos argumentam que "a privacidade pessoal é uma relíquia do passado". Na verdade, não.</p><p>No mundo faminto por dados de hoje, ainda é possível proteger sua privacidade e usar os ótimos produtos que a Internet oferece.⁠ Aqui estão cinco ferramentas que ajudarão você a proteger sua privacidade on-line.</p><h2 id="navegador-brave"><a href="https://brave.com/pt-br/">Navegador Brave</a></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-139.png" class="kg-image" alt="image-139" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-139.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-139.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-139.png 1600w" sizes="(min-width: 720px) 720px" width="1600" height="1077" loading="lazy"><figcaption>Fonte: imagem de <a href="https://unsplash.com/@rubaitulazad?utm_source=medium&amp;utm_medium=referral" rel="photo-creator noopener">Rubaitul Azad</a>, extraída do <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="photo-source noopener">Unsplash</a></figcaption></figure><p>O Brave é um navegador da web que se concentra em privacidade e segurança. Ele bloqueia anúncios de terceiros e rastreia cookies por padrão. Ele também permite que os usuários controlem quais anúncios veem e como seus dados são usados.</p><p>Aqui estão alguns dos principais recursos que diferenciam o navegador Brave:</p><ul><li><strong>Privacidade:</strong> o Brave bloqueia anúncios de terceiros e cookies de rastreamento por padrão, o que ajuda a proteger sua privacidade on-line.</li><li><strong>Segurança:</strong> o Brave usa HTTPS Everywhere para atualizar sites inseguros para proteger conexões HTTPS. Isso ajuda a protegê-lo contra ataques <em>man-in-the-middle</em> e outras formas de vigilância on-line.</li><li><strong>Desempenho:</strong> o Brave usa a mesma tecnologia do Google Chrome –  o projeto de código aberto Chromium. Isso significa que ele é rápido, estável e tem suporte para os padrões da web mais recentes.</li><li><strong>Recompensas:</strong> o Brave permite que os usuários ganhem recompensas na forma do Basic Attention Token (BAT) por visualizar anúncios que respeitam a privacidade. Isso oferece aos usuários uma maneira de oferecer suporte aos sites que visitam e aos criadores de conteúdo de que gostam, sem precisar compartilhar seus dados com anunciantes.</li></ul><p>O navegador Brave oferece uma combinação de privacidade, segurança e desempenho. Ele é uma alternativa mais segura ao Chrome ou Edge para proteger sua privacidade.</p><h2 id="1password"><a href="https://1password.com/" rel="noopener">1Password</a></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-140.png" class="kg-image" alt="image-140" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-140.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-140.png 810w" sizes="(min-width: 720px) 720px" width="810" height="456" loading="lazy"><figcaption>Extraído de: PcMag</figcaption></figure><p>O 1Password é um gerenciador de senhas e uma carteira digital segura. É um programa de software que permite armazenar e gerenciar suas senhas, informações de cartão de crédito e outros dados confidenciais em um cofre criptografado e seguro.</p><p>Com o 1Password, você só precisa se lembrar de uma única senha mestra. Isso ajudará a facilitar o uso de senhas fortes e exclusivas para todas as suas contas on-line.</p><p>O 1Password está disponível em uma ampla variedade de dispositivos e plataformas, incluindo Windows, Mac, Linux, iOS e Android.</p><p>Existem outras alternativas para o 1Password, como o Lastpass e o LogMeOnce. Aqui, porém, vão algumas razões pelas quais o 1Password é uma escolha melhor:</p><ul><li><strong>Segurança:</strong> o 1Password usa criptografia forte e padrão do setor para proteger seus dados. Possui muitos recursos de segurança para ajudar a impedir o acesso não autorizado ao seu cofre. Isso dará a você a tranquilidade de saber que todas as suas informações estão seguras e protegidas.</li><li><strong>Fácil de usar:</strong> o 1Password é fácil de usar. Possui uma interface simples e intuitiva e suporte para uma ampla variedade de dispositivos e plataformas. Ele também se integra ao seu navegador da web para que você possa salvar e preencher senhas enquanto navega na Internet.</li><li><strong>Recursos:</strong> O 1Password oferece uma variedade de recursos, incluindo a capacidade de gerar senhas fortes. O 1Password também pode armazenar informações de cartão de crédito e você pode optar por compartilhar senhas com outras pessoas, se necessário.</li></ul><p>No geral, o 1Password oferece uma combinação de segurança, facilidade de uso, recursos e suporte que o tornam uma escolha popular entre os usuários de gerenciadores de senhas.</p><h2 id="privacy-badger"><a href="https://chrome.google.com/webstore/detail/privacy-badger/pkehgijcmpdhfbdbbnkijodmdjhbjlgp" rel="noopener">Privacy Badger</a></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-141.png" class="kg-image" alt="image-141" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-141.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-141.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-141.png 1200w" sizes="(min-width: 720px) 720px" width="1200" height="873" loading="lazy"><figcaption>Extraído de: Wikipédia</figcaption></figure><p>O Privacy Badger é uma extensão de navegador livre que ajuda a proteger sua privacidade on-line. É um produto da The Electronic Frontier Foundation (EFF). A EFF é uma organização sem fins lucrativos que defende os direitos digitais e as liberdades civis.</p><p>O Privacy Badger funciona detectando e bloqueando cookies de rastreamento de terceiros. Ele também analisa o comportamento de rastreadores de terceiros para ver quais deles estão rastreando você sem o seu consentimento. O Privacy Badger está disponível para os navegadores Chrome, Firefox e Opera.</p><p>Aqui estão algumas razões pelas quais o Privacy Badger é uma ótima ferramenta:</p><ul><li><strong>É livre:</strong> o Privacy Badger é uma extensão de navegador livre e de código aberto, o que significa que você pode usá-la sem pagar nada.</li><li><strong>É simples:</strong> o Privacy Badger é fácil de usar, com uma interface simples e sem configurações complexas para configurar. Você pode simplesmente instalá-lo e deixá-lo fazer o seu trabalho.</li><li><strong>É eficaz:</strong> o Privacy Badger usa algoritmos avançados para detectar e bloquear o rastreamento de terceiros. Ele também tem a capacidade de aprender e se adaptar à medida que encontra novos rastreadores. Isso significa que pode ser eficaz em proteger sua privacidade sem exigir que você faça qualquer trabalho.</li><li><strong>É transparente:</strong> o Privacy Badger é desenvolvido pela EFF, uma organização conhecida e confiável na comunidade. A EFF publica regularmente relatórios e atualizações sobre o desenvolvimento e desempenho do Privacy Badger.</li></ul><p>O Privacy Badger é uma maneira simples e eficaz de proteger sua privacidade on-line. Com uma interface simples e alimentada por algoritmos de IA, o Privacy Badger é uma ferramenta essencial para proteger sua privacidade.</p><h2 id="express-vpn"><a href="https://www.expressvpn.com/" rel="noopener">Express VPN</a></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-142.png" class="kg-image" alt="image-142" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-142.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/image-142.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-142.png 1280w" sizes="(min-width: 720px) 720px" width="1280" height="720" loading="lazy"><figcaption>Extraído de: PcMag</figcaption></figure><p>A ExpressVPN é um serviço de rede virtual privada (VPN) que permite acessar a Internet com segurança.</p><p>A ExpressVPN criptografa seu tráfego e o encaminha por meio de um servidor remoto. Isso pode fazer parecer que você está navegando de um local diferente.</p><p>Isso é útil por vários motivos, inclusive para proteger sua privacidade. Você também pode acessar conteúdo restrito em sua região e contornar a censura na Internet.</p><p>A ExpressVPN é uma das muitas empresas que oferecem serviços de VPN, mas é conhecida por sua velocidade e confiabilidade.</p><p>Aqui estão algumas razões pelas quais a ExpressVPN é uma ótima escolha:</p><ul><li><strong>Velocidade:</strong> a ExpressVPN é conhecida por suas velocidades rápidas, que facilitam o streaming de vídeos ou a reprodução de jogos on-line.</li><li><strong>Confiabilidade:</strong> a ExpressVPN tem a reputação de ser um serviço de VPN confiável e estável. A ExpressVPN possui uma grande rede de servidores e uma equipe de engenheiros trabalhando dia e noite para manter o serviço.</li><li><strong>Segurança:</strong> a ExpressVPN usa criptografia forte para proteger seus dados. Ela também oferece muitos recursos de segurança, como proteção contra vazamento de DNS, para ajudar a mantê-lo seguro on-line.</li><li><strong>Privacidade:</strong> a ExpressVPN tem uma política estrita de não manter registros. Isso significa que ela não coleta nem armazena informações sobre sua atividade on-line. Isso dará a você a tranquilidade de saber que sua privacidade está protegida.</li><li><strong>Compatibilidade:</strong> a ExpressVPN está disponível em uma ampla variedade de dispositivos e sistemas operacionais. Isso inclui Windows, Mac, Linux, Android e iOS. Ela também oferece aplicações de VPN personalizadas para roteadores, consoles de jogos e outros dispositivos.</li></ul><p>A ExpressVPN oferece uma combinação de velocidade, confiabilidade, segurança, privacidade e compatibilidade. Isso a torna uma escolha popular entre os usuários de VPN.</p><h2 id="haveibeenpawned"><a href="https://haveibeenpwned.com/" rel="noopener">HaveIBeenPawned</a></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-143.png" class="kg-image" alt="image-143" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/image-143.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-143.png 780w" sizes="(min-width: 720px) 720px" width="780" height="408" loading="lazy"><figcaption>Extraído de: Sophos</figcaption></figure><p>Have I Been Pwned (HIBP) é um site que ajuda você a verificar se suas informações pessoais foram expostas a uma violação de dados.</p><p>O pesquisador de segurança Troy Hunt criou o HIBP em 2013. Desde então, ele se tornou um recurso amplamente utilizado para verificar informações pessoais comprometidas.</p><p>Se o HIBP descobrir que suas informações estão expostas, ele recomendará as medidas que você pode tomar para se proteger. Isso pode incluir alteração de senhas, ativação da autenticação de dois fatores e assim por diante.</p><p>Aqui estão alguns recursos do HIBP:</p><ul><li><strong>Pesquisa por violação de dados:</strong> você pode inserir seu endereço de e-mail ou nome de usuário para ver se ele foi incluído em alguma das violações de dados no banco de dados do HIBP.</li><li><strong>Serviço de notificação:</strong> você pode se inscrever no serviço de notificação do HIBP, que o alertará se seu endereço de e-mail aparecer em uma nova violação de dados.</li><li><strong>Pesquisa por senha violada:</strong> você pode inserir uma senha para ver se ela apareceu em alguma violação de dados. Isso pode ajudá-lo a determinar se uma senha é segura ou se você deve alterá-la.</li><li><strong>API Pwned Password:</strong> o HIBP oferece uma API que permite aos desenvolvedores usar o recurso de pesquisa de senha violada em suas próprias aplicações.</li><li><strong>Estatísticas de violação de dados:</strong> o HIBP fornece estatísticas sobre violações de dados. Isso inclui o número de registros comprometidos e os tipos de dados que foram expostos.</li></ul><p>Mesmo se você definir uma senha forte, as aplicações que você usa podem encontrar uma violação de dados. O HIBP ajuda você a acompanhar essas violações e garantir que seus dados estejam seguros.</p><h2 id="resumo">Resumo</h2><p>A privacidade on-line não é um mito. Existem ótimas ferramentas que podemos usar para proteger nossa vida digital e usar a Internet com segurança.</p><p>Use essas cinco ferramentas além das práticas de segurança padrão, como definir senhas fortes e habilitar a autenticação de dois fatores. Neste artigo, vemos algumas dicas sobre como se manter seguro on-line.</p><p><em>Gostou deste artigo? Visite <a href="https://www.stealthsecurity.io/">https://www.stealthsecurity.io/</a> para encontrar mais conteúdo de segurança cibernética (em inglês). Você também pode <a href="https://www.linkedin.com/in/manishmshiva/">se conectar com o autor</a> pelo LinkedIn.</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como criar um bot de Telegram usando Python ]]>
                </title>
                <description>
                    <![CDATA[ Os chatbots automatizados são bastante úteis para estimular interações. Podemos criar chatbots para o Slack, o Discord e outras plataformas. Neste artigo, vou ensinar a você como construir um chatbot do Telegram que vai dizer o seu horóscopo. Então, vamos começar! Como obter seu token de bot Para configurar um ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-um-bot-do-telegram-usando-o-python/</link>
                <guid isPermaLink="false">63b374fb44e27f060d7a5a5f</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Tue, 21 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Telegram-Bot.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-create-a-telegram-bot-using-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Create a Telegram Bot using Python</a>
      </p><p>Os chatbots automatizados são bastante úteis para estimular interações. Podemos criar chatbots para o Slack, o Discord e outras plataformas.</p><p>Neste artigo, vou ensinar a você como construir um chatbot do Telegram que vai dizer o seu horóscopo. Então, vamos começar!</p><h2 id="como-obter-seu-token-de-bot">Como obter seu token de bot</h2><p>Para configurar um novo bot, você precisará falar com o BotFather. Não, ele não é uma pessoa – ele também é um bot e é o chefe de todos os bots do Telegram.</p><ol><li>Procure por @botfather no Telegram.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-12-16-092357.png" class="kg-image" alt="Screenshot-2022-12-16-092357" width="475" height="315" loading="lazy"><figcaption>BotFather, chefe dos bots do Telegram</figcaption></figure><p>2. &nbsp;Comece uma conversa com o BotFather clicando no botão Iniciar (ou <em>Start</em>, na versão em inglês).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-12-16-092531.png" class="kg-image" alt="Screenshot-2022-12-16-092531" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-12-16-092531.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-12-16-092531.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-12-16-092531.png 1423w" sizes="(min-width: 1200px) 1200px" width="1423" height="982" loading="lazy"><figcaption>Clique no botão Start</figcaption></figure><p>3. &nbsp;Digite <code>/newbot</code> e siga as instruções para configurar um novo bot. O BotFather dará a você um token que você usará para autenticar seu bot e conceder a ele acesso à API do Telegram.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-12-16-093337.png" class="kg-image" alt="Screenshot-2022-12-16-093337" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-12-16-093337.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-12-16-093337.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-12-16-093337.png 1438w" sizes="(min-width: 1200px) 1200px" width="1438" height="992" loading="lazy"><figcaption>Obtendo o token de acesso</figcaption></figure><p><strong>Observação:</strong> não se esqueça de armazenar o token de modo seguro. Qualquer pessoa com acesso ao seu token pode facilmente manipular seu bot.</p><h2 id="como-configurar-seu-ambiente-de-programa-o">Como configurar seu ambiente de programação</h2><p>Vamos configurar o ambiente de programação. Embora existam várias bibliotecas disponíveis para criar um bot do Telegram, usaremos a biblioteca <a href="https://pypi.org/project/pyTelegramBotAPI/">pyTelegramBotAPI</a>. É uma implementação simples, mas extensível, do Python para a API de bots do Telegram, com recursos síncronos e assíncronos.</p><p>Instale a biblioteca pyTelegramBotAPI usando o pip:</p><pre><code class="language-bash">pip install pyTelegramBotAPI
</code></pre><p>Em seguida, abra seu editor de código favorito e crie um arquivo <code>.env</code> para armazenar seu token conforme abaixo:</p><pre><code class="language-bash">export BOT_TOKEN=token-do-seu-bot-aqui</code></pre><p>Depois disso, execute o comando <code>source .env</code> para ler as variáveis de ambiente a partir do arquivo <code>.env</code>.</p><h2 id="como-criar-seu-primeiro-bot">Como criar seu primeiro bot</h2><p>Todas as implementações da API são armazenadas em uma única classe chamada <code>TeleBot</code>. Ela oferece muitas maneiras de ouvir mensagens recebidas, bem como funções como <code>send_message()</code>, <code>send_document()</code> e outras para enviar mensagens.</p><p>Crie um arquivo <code>bot.py</code> e cole o seguinte código lá:</p><pre><code class="language-python">import os

import telebot

BOT_TOKEN = os.environ.get('BOT_TOKEN')

bot = telebot.TeleBot(BOT_TOKEN)
</code></pre><p>No código acima, usamos a biblioteca <code>os</code> para ler as variáveis de ambiente armazenadas em nosso sistema.</p><p>Lembre-se: exportamos uma variável de ambiente chamada <code>BOT_TOKEN</code> na etapa anterior. O valor de <code>BOT_TOKEN</code> é lido em uma variável também chamada <code>BOT_TOKEN</code>. Além disso, usamos a classe <code>TeleBot</code> para criar uma instância de bot e passamos o <code>BOT_TOKEN</code> para ela.</p><p>Em seguida, precisamos registrar manipuladores de mensagens. Esses manipuladores de mensagens contêm filtros pelos quais uma mensagem deve passar. Se uma mensagem passar pelo filtro, a função decorada é chamada e a mensagem recebida é fornecida como um argumento.</p><p>Vamos definir um manipulador de mensagens que manipule os comandos <code>/start</code> e <code>/hello</code> recebidos.</p><pre><code class="language-python">@bot.message_handler(commands=['start', 'hello'])
def send_welcome(message):
    bot.reply_to(message, "Howdy, how are you doing?")
</code></pre><p>Qualquer nome é aceitável para uma função decorada por um manipulador de mensagens, mas só pode ter um parâmetro (a mensagem).</p><p>Vamos adicionar outro manipulador que ecoa todas as mensagens de texto recebidas de volta ao remetente.</p><pre><code class="language-python">@bot.message_handler(func=lambda msg: True)
def echo_all(message):
    bot.reply_to(message, message.text)
</code></pre><p>O código acima usa uma expressão <code>lambda</code> para testar uma mensagem. Como precisamos ecoar todas as mensagens, sempre retornamos <code>True</code> na função <code>lambda</code>.</p><p>Agora você tem um bot simples, que responde aos comandos <code>/start</code> e <code>/hello</code> com uma mensagem estática e que ecoa todas as outras mensagens enviadas. Adicione o seguinte ao final do seu arquivo para iniciar o bot:</p><pre><code class="language-python">bot.infinity_polling()
</code></pre><p>É isso! Temos um bot do Telegram pronto. Vamos executar o arquivo Python e ir ao Telegram para testar o bot.</p><p>Pesquise o bot usando seu nome de usuário se não conseguir encontrá-lo. Você pode testá-lo enviando comandos como <code>/hello</code> e <code>/start</code> e outros textos aleatórios.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-12-16-101334.png" class="kg-image" alt="Screenshot-2022-12-16-101334" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-12-16-101334.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-12-16-101334.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-12-16-101334.png 1266w" sizes="(min-width: 1200px) 1200px" width="1266" height="987" loading="lazy"><figcaption>Testando o bot</figcaption></figure><p>Observação: todos os manipuladores de mensagens são testados na ordem em que foram declarados no arquivo-fonte.</p><p>Para obter mais informações sobre como usar a biblioteca pyTelegramBotAPI, consulte sua <a href="https://github.com/eternnoir/pyTelegramBotAPI"><strong>documentação</strong></a>.</p><h2 id="como-programar-o-horoscope-bot">Como programar o Horoscope Bot</h2><p>Vamos mudar nossa atenção para a construção de nosso Horoscope Bot agora. Usaremos o encadeamento de mensagens no bot. O bot primeiro perguntará pelo seu signo do zodíaco, o dia e, em seguida, responderá com o horóscopo desse dia específico.</p><p>Internamente, o bot interage com uma API para obter os dados do horóscopo.</p><p>Vamos usar a <a href="https://horoscope-app-api.vercel.app/">API Horoscope</a> que criei em outro tutorial. Se você deseja aprender como criar uma API, pode ler <a href="https://ashutoshkrris.hashnode.dev/how-to-create-a-horoscope-api-with-beautiful-soup-and-flask">este tutorial</a> (em inglês). Certifique-se de explorar a API de horóscopo <a href="https://horoscope-app-api.vercel.app/">aqui</a> antes de começar.</p><h3 id="como-obter-os-dados-de-hor-scopo">Como obter os dados de horóscopo</h3><p>Vamos criar uma função utilitária para obter os dados de horóscopo para um dia específico.</p><pre><code class="language-python">import requests

def get_daily_horoscope(sign: str, day: str) -&gt; dict:
    """Get daily horoscope for a zodiac sign.
    Keyword arguments:
    sign:str - Zodiac sign
    day:str - Date in format (YYYY-MM-DD) OR TODAY OR TOMORROW OR YESTERDAY
    Return:dict - JSON data
    """
    url = "https://horoscope-app-api.vercel.app/api/v1/get-horoscope/daily"
    params = {"sign": sign, "day": day}
    response = requests.get(url, params)

    return response.json()
</code></pre><p>No código Python acima, criamos uma função que aceita dois argumentos de string – <code>sign</code> e <code>day</code> – e retorna dados JSON. Enviamos uma solicitação GET ao URL da API e passamos <code>sign</code> e <code>day</code> como parâmetros de consulta.</p><p>Se você testar a função, obterá um resultado semelhante ao que vemos abaixo:</p><pre><code class="language-json">{
   "data":{
      "date": "Dec 15, 2022",
      "horoscope_data": "Lie low during the day and try not to get caught up in the frivolous verbiage that dominates the waking hours. After sundown, feel free to speak your mind. You may notice that there is a sober tone and restrictive sensation today that leaves you feeling like you will never be able to break free from your current situation. Don't get caught in this negative mindset."
   },
   "status": 200,
   "success": true
}
</code></pre><p>Observação: você pode saber mais sobre a biblioteca <code>requests</code> do Python <a href="https://ashutoshkrris.hashnode.dev/how-to-interact-with-web-services-using-python">neste tutorial</a> (em inglês).</p><h3 id="como-adicionar-um-manipulador-de-mensagens">Como adicionar um manipulador de mensagens</h3><p>Agora que temos uma função que retorna os dados do horóscopo, vamos criar um manipulador de mensagens em nosso bot que pergunte o signo do zodíaco do usuário.</p><pre><code class="language-python">@bot.message_handler(commands=['horoscope'])
def sign_handler(message):
    text = "What's your zodiac sign?\nChoose one: *Aries*, *Taurus*, *Gemini*, *Cancer,* *Leo*, *Virgo*, *Libra*, *Scorpio*, *Sagittarius*, *Capricorn*, *Aquarius*, and *Pisces*."
    sent_msg = bot.send_message(message.chat.id, text, parse_mode="Markdown")
    bot.register_next_step_handler(sent_msg, day_handler)</code></pre><p>A função acima é um pouco diferente das outras funções que definimos anteriormente. A funcionalidade de horóscopo do bot será invocada pelo comando <code>/horoscope</code>. Estamos enviando uma mensagem de texto para o usuário, mas observe que definimos o <code>parse_mode</code> como <strong>Markdown</strong> ao enviar a mensagem.</p><p>Como usaremos encadeamento de mensagens, usamos o método <code>register_next_step_handler()</code>. Esse método aceita dois parâmetros: <strong>a mensagem</strong> enviada pelo usuário e <strong>a função de callback</strong> que deve ser chamada após a mensagem. Assim, passamos a variável <code>sent_msg</code> e uma nova função <code>day_handler</code>, que definiremos a seguir.</p><p>Vamos definir a função <code>day_handler()</code>, que aceita a mensagem.</p><pre><code class="language-python">def day_handler(message):
    sign = message.text
    text = "What day do you want to know?\nChoose one: *TODAY*, *TOMORROW*, *YESTERDAY*, or a date in format YYYY-MM-DD."
    sent_msg = bot.send_message(
        message.chat.id, text, parse_mode="Markdown")
    bot.register_next_step_handler(
        sent_msg, fetch_horoscope, sign.capitalize())
</code></pre><p>Buscamos o signo do zodíaco do atributo <code>message.text</code>. Semelhante à função anterior, ela também pergunta o dia para o qual você deseja saber o horóscopo.</p><p>No final, usamos o mesmo método <code>register_next_step_handler()</code> e passamos <code>sent_msg</code>, a função de <em>callback</em> <code>fetch_horoscope</code> e o <code>sign</code>.</p><p>Vamos, agora, definir a função <code>fetch_horoscope()</code>, que aceita a mensagem e o signo.</p><pre><code class="language-python">def fetch_horoscope(message, sign):
    day = message.text
    horoscope = get_daily_horoscope(sign, day)
    data = horoscope["data"]
    horoscope_message = f'*Horoscope:* {data["horoscope_data"]}\\n*Sign:* {sign}\\n*Day:* {data["date"]}'
    bot.send_message(message.chat.id, "Here's your horoscope!")
    bot.send_message(message.chat.id, horoscope_message, parse_mode="Markdown")
</code></pre><p>Essa é a função final, onde obtemos o signo no parâmetro de função e o dia do atributo <code>message.text</code>.</p><p>Em seguida, buscamos o horóscopo usando a função <code>get_daily_horoscope()</code> e criamos nossa mensagem. No final, enviamos a mensagem com os dados do horóscopo.</p><h2 id="demonstra-o-do-bot">Demonstração do bot</h2><p>Depois de executar o arquivo Python, você pode testar essa funcionalidade. Aqui está a demonstração:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/nTHI2rPV_RE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Horoscope Bot using Python" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="pr-ximos-passos-recomendados">Próximos passos recomendados</h2><p>A partir de agora, o bot para de funcionar assim que paramos nossa aplicação do Python. Para fazê-lo funcionar sempre, você pode implantar o bot em plataformas como o Heroku, o Render e assim por diante.</p><p>Aqui está um link do <a href="https://github.com/ashutoshkrris/Telegram-Horoscope-Bot">repositório no GitHub para esse projeto</a> - sinta-se à vontade para conferir.</p><p>Você também pode adicionar mais funcionalidades ao bot explorando as <a href="https://core.telegram.org/">APIs do Telegram</a>.</p><p>Obrigado pela leitura! Se quiser, você pode seguir o autor no <a href="https://twitter.com/ashutoshkrris">Twitter</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Melhores práticas de acessibilidade – do que lembrar ao criar aplicações para a web acessíveis ]]>
                </title>
                <description>
                    <![CDATA[ Qualquer pessoa deve poder usar os sites e aplicações que você cria – pessoas com ou sem deficiência. Isso é o que tornará o seu site acessível. Pense no último site que você construiu ou no seu site favorito. Você tem certeza de que qualquer pessoa pode usar seu site ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/melhores-praticas-de-acessibilidade-do-que-lembrar-ao-criar-aplicacoes-para-a-web-acessiveis/</link>
                <guid isPermaLink="false">63b37c8344e27f060d7a5b52</guid>
                
                    <category>
                        <![CDATA[ Acessibilidade ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Mon, 20 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/ben-kolde-bs2Ba7t69mM-unsplash-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/accessibility-best-practices-to-make-web-apps-accessible/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Accessibility Best Practices – What to Remember When Building Accessible Web Apps</a>
      </p><p>Qualquer pessoa deve poder usar os sites e aplicações que você cria – pessoas com ou sem deficiência. Isso é o que tornará o seu site acessível.</p><p>Pense no último site que você construiu ou no seu site favorito. Você tem certeza de que qualquer pessoa pode usar seu site e executar as ações críticas necessárias? Você já considerou pessoas com deficiência motora, deficiência visual, deficiência cognitiva e deficiência auditiva?</p><p>A acessibilidade é muitas vezes deixada de lado e tratada como uma reflexão tardia. Quando chega a hora de enviar um recurso, fazemos um teste de acessibilidade e descobrimos que nosso site não estava acessível, corrigindo tudo com gambiarras.</p><p>Tornar um site acessível é um grande empreendimento. Se, no entanto, mantivermos a acessibilidade em mente desde o início, será muito mais fácil criar um aplicação para a web acessível.</p><p>Neste artigo, abordarei 5 coisas que você deve ter em mente DURANTE a criação da sua aplicação para não ter que dar "aquele ajuste" no final.</p><h2 id="5-coisas-para-se-lembrar-para-ter-uma-boa-acessibilidade">5 coisas para se lembrar para ter uma boa acessibilidade</h2><ol><li>HTML <strong>S</strong>emântico</li><li><strong>T</strong>abindex</li><li>Atributos <strong>A</strong>ria</li><li><strong>R</strong>oles (funções)</li><li>Navegação por teclado (do inglês, <strong>K</strong>eyboard) e leitores de tela</li></ol><p>Em resumo, S.T.A.R.K.</p><p>Se você precisar de ajuda para se lembrar disso, pense no Tony Stark.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/ktokatitmir0.0.jpg" class="kg-image" alt="ktokatitmir0.0" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/ktokatitmir0.0.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/ktokatitmir0.0.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/02/ktokatitmir0.0.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w2400/2023/02/ktokatitmir0.0.jpg 2400w" sizes="(min-width: 720px) 720px" width="2000" height="1186" loading="lazy"></figure><p>Vamos examinar cada um deles para entender como usá-los em suas aplicações para a web.</p><h3 id="o-que-o-html-sem-ntico">O que é o HTML semântico?</h3><p>O uso de HTML semântico é importante para a acessibilidade. Isso ocorre porque tecnologias assistivas, como leitores de tela, são capazes de interpretar o que está na página analisando o HTML da página. Ele permite que os usuários executem ações com base nos elementos.</p><p>Por exemplo, se um leitor de tela encontra um botão, ele sinaliza ao usuário que deve clicar nele.</p><p>Vamos considerar alguns casos de uso do que pode acontecer quando você não usa HTML semântico:</p><h4 id="criar-bot-es-usando-div-em-vez-de-button-">Criar botões usando <code>div</code> em vez de <code>button</code>:</h4><p><code>div</code>s são elementos contêineres. Portanto, quando um leitor de tela encontra uma <code>div</code>, ele pensa automaticamente que é um elemento da apresentação.</p><p>Quando um usuário de leitor de tela encontra um elemento <code>div</code> que tem conteúdo ou filhos dentro dele, o leitor de tela anuncia <code>role="group"</code> e o usuário não perceberá que a <code>div</code> é interativa. Portanto, certifique-se de usar o elemento semântico adequado para sua finalidade. Você obtém acessibilidade gratuitamente.</p><h4 id="usar-css-para-falsificar-t-tulos-em-vez-de-usar-as-tags-h1-6-">Usar CSS para falsificar títulos em vez de usar as tags <code>h1-6</code>:</h4><p>Tags de títulos, como <code>&lt;h1&gt;</code> e <code>&lt;h2&gt;</code>, permitem que uma tecnologia assistiva saiba que este é um texto importante e o leitor de tela anunciará "Título".</p><p>Quando você usa o CSS para fazer um título em vez de usar o HTML semântico correto, o significado do texto é perdido para um leitor de tela.</p><p>Portanto, certifique-se de usar HTML semântico sempre que possível.</p><h3 id="o-que-tabindex">O que é tabindex?</h3><p>Adicionar um <code>tabindex</code> torna os elementos interativos navegáveis pelo teclado. Quando você adiciona um <code>tabindex</code> a um elemento, um usuário pode navegar até ele usando apenas o teclado e/ou tecnologias assistivas.</p><ol><li>Você usa um tabindex de <code>0</code> para definir o foco para um elemento na ordem de tabulação padrão,</li><li>Você usa um tabindex de <code>-1</code> para focar programaticamente um elemento usando JavaScript.</li><li>Não atribua um valor <code>&gt;1</code> a tabindex.</li></ol><p>Um aviso importante – você só deve adicionar <code>tabindex</code> a elementos interativos. Não é uma boa prática adicionar <code>tabindex</code> a elementos como <code>div</code>s.</p><p>Em vez de adicionar tabindex, nesse caso, use um elemento semântico, como um <code>button</code>, pois os elementos semânticos já podem ser tabulados e não precisam de um valor <code>tabindex</code> adicional.</p><h3 id="o-que-s-o-atributos-aria">O que são atributos ARIA?</h3><p>Atributos Aria, como <code>aria-checked</code> e <code>aria-label</code>, fornecem informações adicionais para tecnologias assistivas.</p><p>Os atributos Aria são um conjunto de atributos do HTML que você usa para fornecer informações adicionais sobre a finalidade e o estado dos elementos em uma página da web. Esses atributos são especialmente benéficos para tecnologias assistivas para fornecer mais contexto e melhor navegação para os usuários.</p><p>Alguns atributos Aria comuns incluem:</p><ol><li><code>aria-label</code>: usado para fornecer um rótulo ou nome para um elemento.</li><li><code>aria-hidden</code>: usado para indicar que um elemento deve ser ocultado das tecnologias assistivas. Isso pode ser útil para elementos usados para fins de layout, mas não relevantes para o conteúdo da página.</li><li><code>aria-describedby</code>: usado para associar um elemento a uma descrição, o que ajuda a fornecer o contexto de um elemento.</li><li><code>aria-live</code>: usado para indicar que o conteúdo de um elemento pode mudar dinamicamente e que as tecnologias assistivas devem prestar atenção às mudanças no conteúdo do elemento.</li></ol><p>Você pode usar esses atributos em combinação entre si e com atributos HTML padrão para criar conteúdo para a web mais acessível e fácil de usar.</p><h3 id="o-que-o-atributo-aria-role">O que é o atributo <code>aria-role</code>?</h3><p>Você usa o atributo <code>aria-role</code> para definir a finalidade de um elemento HTML e fornecer seu significado semântico.</p><p>Por exemplo, se estiver construindo um componente de grade (<code>grid</code>) com a ajuda de CSS e <code>div</code>s, você pode usar <code>role="grid"</code> para permitir que as tecnologias assistivas saibam sobre a semântica do componente.</p><p>Alguns <code>aria-role</code>s comuns incluem:</p><ol><li><code>button</code>: usado para indicar que um elemento deve ser tratado como um botão.</li><li><code>alert</code>: usado para indicar que um elemento é uma caixa de alerta.</li><li><code>presentation</code>: usado para indicar que um elemento é apenas de apresentação.</li></ol><p>É importante ter cuidado com <code>aria-role</code>. Lembre-se de não exagerar.</p><h3 id="como-tratar-da-navega-o-por-teclado-e-leitores-de-tela">Como tratar da navegação por teclado e leitores de tela</h3><p>Muitos usuários com deficiência motora dependem de seu teclado e tecnologias assistivas para navegar na web. Portanto, é fundamental que cada componente seja navegável usando um teclado e um leitor de tela.</p><p>Você pode testar a acessibilidade do teclado navegando em um site usando apenas o teclado. Aqui estão algumas teclas comuns:</p><ol><li>a tecla <code>tab</code> ajuda a navegar pelas diferentes seções do site.</li><li>a <code>barra de espaço</code> ajuda a selecionar elementos, como uma caixa de seleção.</li><li>a tecla <code>enter</code> serve para pressionar os botões.</li></ol><p>Ao testar a navegação por teclado, certifique-se de pensar no seguinte:</p><ol><li>O foco permanece visível: verifique se você pode ver claramente qual elemento está sendo focado na página. O foco deve permanecer sempre visível.</li><li>Ordem das tabulações: ao percorrer as seções, a ordem das tabulações deve seguir o fluxo natural e a estrutura lógica do site. Ele não deve pular para frente e para trás entre as seções.</li><li>Armadilhas do teclado: certifique-se de que, ao navegar com o teclado, o foco não fique preso em um elemento. Por exemplo, isso pode acontecer quando um modal é aberto ou o foco é navegado para um widget, como um calendário ou o seletor de emojis. Certifique-se de que, ao selecionar um elemento no widget, você possa navegar de volta ao site.</li></ol><h2 id="resumo">Resumo</h2><p>Em geral, testar a acessibilidade durante o desenvolvimento é uma parte importante do processo que pode ajudar a criar um software mais utilizável e acessível para todos os usuários. Testar a acessibilidade com antecedência ajuda a fornecer uma ótima experiência de usuário para todos.</p><p>No próximo artigo, a autora fala sobre as várias ferramentas de acessibilidade e sobre como depurar um problema de acessibilidade. Você pode <a href="http://tinyletter.com/shrutikapoor">se inscrever para recebê-lo em sua caixa de entrada aqui</a>.</p><p>Até lá, boa programação para você!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que é DevTestOps? Como combinar DevOps e TestOps para criar produtos melhores ]]>
                </title>
                <description>
                    <![CDATA[ A tecnologia está sempre melhorando e os desenvolvedores estão sempre tentando encontrar maneiras mais fáceis e melhores de melhorar o software. Foi assim que surgiu o DevOps e, logo, o DevTestOps surgiu como uma nova estratégia. Hoje, empresas como o Spotify aplicam o DevTestOps na produção de software, o que ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-devtestops-como-combinar-devops-e-testops-para-criar-produtos-melhores/</link>
                <guid isPermaLink="false">63b385b844e27f060d7a5c33</guid>
                
                    <category>
                        <![CDATA[ DevOps ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Sun, 19 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/DEVTESTOPS_1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-is-devtestops/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is DevTestOps? How to Combine DevOps and TestOps to Build Better Products</a>
      </p><p>A tecnologia está sempre melhorando e os desenvolvedores estão sempre tentando encontrar maneiras mais fáceis e melhores de melhorar o software. Foi assim que surgiu o DevOps e, logo, o DevTestOps surgiu como uma nova estratégia.</p><p>Hoje, empresas como o Spotify aplicam o DevTestOps na produção de software, o que facilita a atualização, o teste e a implantação de qualquer alteração com rapidez e facilidade.</p><p>Neste artigo, veremos o DevTestOps, seus objetivos e processos. Também veremos como começar a usar o DevTestOps, as práticas recomendadas e por que uma empresa deve adotar o DevTestOps.</p><p>Antes de mergulharmos no DevTestOps, vamos ver o que são DevOps e TestOps e como eles funcionam.</p><h2 id="o-que-s-o-devops-e-testops">O que são DevOps e TestOps?</h2><p>DevOps é uma combinação de Desenvolvimento e Operações. O DevOps foi introduzido no ciclo de vida do desenvolvimento de software devido à necessidade de desenvolvimento contínuo do produto. Ele ajuda as equipes a integrar e implantar atualizações de software com mais facilidade.</p><p>O TestOps envolve a realização de grandes conjuntos de testes de automação em software para que ele seja altamente eficiente com menos bugs.</p><p>Inicialmente, o DevOps foi introduzido em equipes de software que permitiam a colaboração apenas entre desenvolvedores e operadores. Em seguida, os testadores passaram a realizar os testes ao final do desenvolvimento.</p><p>No entanto, isso trouxe alguns desafios para a equipe, especialmente depois de trabalhar em algum software e concluir que estava pronto para produção – apenas para os testadores executarem o software e descobrirem bugs complexos. Foi por meio desses desafios que o DevTestOps surgiu.</p><h2 id="o-que-devtestops">O que é DevTestOps?</h2><p>DevTestOps é um padrão que é parte do ciclo de vida de desenvolvimento de software e que inclui testes, integração e implantação contínuos.</p><p>No DevTestOps, você testa o produto em diferentes estágios de desenvolvimento, o que ajuda a reduzir o número de bugs em estágios posteriores.</p><p>No DevTestOps, as equipes de desenvolvimento, teste e operações trabalham lado a lado para garantir a qualidade e o teste adequado do produto.</p><p>Isso resulta em entrega rápida, com poucos ou nenhum bug no final do ciclo de vida de desenvolvimento de software.</p><p>O DevTestOps surgiu como uma versão aprimorada do DevOps com o TestOps incluído. Isso facilita a criação, implantação e desenvolvimento de produtos de qualidade com menos bugs.</p><h2 id="objetivos-do-devtestops">Objetivos do DevTestOps</h2><p>O DevTestOps tem objetivos que são chamados de manifestos. Os manifestos definem os objetivos que você espera alcançar.</p><p>De acordo com o site <a href="https://www.mabl.com/blog/the-road-to-devtestops">mabl.com</a> (tradução nossa):</p><blockquote>"Existem cinco manifestos de DevTestOps, que incluem:<br>- Teste contínuo em vez de teste no final.<br>- Privilegiar a adoção de todas as atividades de teste em vez de apenas aquelas dos testes funcionais automatizados.<br>- Privilegiar o teste do que agrega valor em vez de testar tudo.<br>- Privilegiar o teste por toda a equipe em vez de testes em departamentos de teste isolados.<br>- Cobertura do produto em vez de cobertura de código." (Fonte: <a href="https://www.mabl.com/blog/the-road-to-devtestops">mabl.com</a>)</blockquote><h2 id="como-o-devtestops-funciona">Como o DevTestOps funciona</h2><p>Existem várias etapas do processo DevTestOps. Elas são:</p><ol><li><strong>Planejar:</strong> nesta etapa, você define os detalhes do produto e faz uma verificação cruzada para garantir que tudo esteja alinhado com o mercado.</li><li><strong>Construir:</strong> nesta etapa, você constrói o programa e o carrega no repositório, realiza testes de unidade e, se o programa não apresentar erros, ele se torna a base de código. Você pode adicionar possíveis atualizações (sugestões ou melhorias) antes de passar para a próxima etapa.</li><li><strong>Testar: </strong>nesta etapa, você executa e analisa todos os casos de teste. Você pode fazer atualizações subsequentes e testar o programa novamente antes de entregá-lo e considerá-lo pronto para implantação.</li><li><strong>Lançar: </strong>você inicia o produto e testa outras atualizações escritas antes de adicioná-lo à base de código.</li><li><strong>Monitorar:</strong> você verifica constantemente o produto em busca de feedback e problemas que são tratados e atualizados imediatamente.</li></ol><h2 id="como-dar-os-primeiros-passos-com-o-devtestops-">Como dar os primeiros passos com o DevTestOps:</h2><p>Muitas organizações já usam o DevOps, mas continuam produzindo software com bugs. Se você quiser mudar para DevTestOps para tentar reduzir os bugs em seu código, abiaxo vemos algumas etapas que você pode seguir.</p><h3 id="adicione-testes-cont-nuos-ao-seu-roteiro-ou-guia-de-devops-">Adicione testes contínuos ao seu roteiro ou guia de DevOps:</h3><p>O DevTestOps tem uma cultura semelhante ao DevOps, exceto pelo fato de que você adiciona testes contínuos. Os testadores devem se tornar parte da equipe de DevOps para que possam testar o software imediatamente após uma atualização.</p><h3 id="crie-uma-cadeia-de-ferramentas-de-devtestops-">Crie uma cadeia de ferramentas de DevTestOps:</h3><p>Uma cadeia de ferramentas inclui todas as ferramentas necessárias para implementar o DevTestOps. Por exemplo, sua cadeia de ferramentas pode incluir ferramentas como Jira, Kubernetes, Selenium, GitHub, Jenkins e muito mais.</p><p>Você pode atribuir funções a diferentes equipes usando essas ferramentas para que possam trabalhar de modo eficaz com elas.</p><h3 id="implemente-as-ferramentas-em-sua-organiza-o-">Implemente as ferramentas em sua organização:</h3><p>Em seguida, você precisará ensinar as equipes a implementar essas ferramentas e a seguir as estratégias que você implementou para a produção de software.</p><p>Você pode adicionar funções de teste a cada equipe, o que transformará a cultura de trabalho e incentivará a colaboração entre os desenvolvedores, testadores e operadores de cada equipe.</p><h3 id="automatize-">Automatize:</h3><p>Você deve aplicar a automação em cada um desses processos, desde a fase de construção até a fase de implantação. Isso ajudará todos os desenvolvedores e testadores a trabalhar com mais eficiência.</p><h3 id="fa-a-melhorias-constantes-">Faça melhorias constantes:</h3><p>Finalmente, você pode atualizar constantemente as ferramentas e processos para acomodar tendências e atualizações relevantes no espaço tecnológico.</p><h2 id="melhores-pr-ticas-para-o-devtestops-">Melhores práticas para o DevTestOps:</h2><p>Aqui estão algumas práticas recomendadas que você pode seguir para implementar o DevTestOps em sua equipe:</p><ul><li>Use as ferramentas e frameworks certas para integração, teste, entrega e implantação. Isso vai depender do que funciona melhor para a organização.</li><li>Aplique automação em testes, implantação e até mesmo em outros estágios. A automação ajudará a acelerar o processo e facilitará que as equipes produzam mais rapidamente e cumpram os prazos.</li><li>Todas as equipes devem se comunicar de modo eficaz. Eles devem promover a colaboração entre as equipes para aumentar a compreensão, o que aumentará a produtividade e eliminará a confusão.</li><li>O pipeline que compreende integração contínua, teste, entrega e implantação deve ser sempre monitorado. Se você identificar um problema, as equipes podem fazer alterações e integrar as atualizações imediatamente.</li></ul><h2 id="por-que-voc-deve-adotar-o-devtestops">Por que você deve adotar o DevTestOps?</h2><p>Existem muitos motivos para adotar o DevTestOps. Primeiro, melhora a qualidade do código.</p><p>Ele também melhora a colaboração entre desenvolvedores, testadores e operadores. Como diz o manifesto, o teste não é mais feito em departamentos de teste isolados, mas em cada fase.</p><p>Além disso, ele economiza tempo gasto na correção de bugs ao testar no final, em vez de em cada estágio.</p><p>Por fim, ele facilita a integração e a implantação contínuas.‌‌</p><h2 id="conclus-o">Conclusão</h2><p>Em um mundo de constantes melhorias em tecnologia, as empresas devem aprimorar continuamente seus softwares para atenderem aos padrões do mercado.</p><p>Com o DevTestOps, fica mais fácil para as equipes de software fazerem atualizações e melhorarem seus produtos para atender aos padrões do mercado.</p><h3 id="recursos-todos-em-ingl-s-">Recursos (todos em inglês):</h3><ul><li><a href="https://www.xenonstack.com/insights/devtestops-advantages%3fhs_amp=true">DevOps Advantages And Best Practices | Quick Guide</a></li><li><a href="https://blog.kms-solutions.asia/an-ultimate-guide-to-devtestops%3fhs_amp=true">What Is DevTestOps And How Can It Transform Agile</a></li><li><a href="https://katalon.com/resources-center/blog/devtestops-orchestration-agile-teams%3fhs_amp=true">What Is DevOps Orchestration For Agile Teams?</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como implementar infraestrutura como código com a AWS ]]>
                </title>
                <description>
                    <![CDATA[ Infraestrutura como código (ou, em inglês, infrastructure as a code, ou IaC) é o processo de provisionamento e gerenciamento de seus recursos de nuvem escrevendo um arquivo de modelo que pode ser lido por humanos e consumível pela máquina. Para o desenvolvimento na nuvem com a AWS, a escolha integrada ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-implementar-infraestrutura-como-codigo-com-a-aws/</link>
                <guid isPermaLink="false">63b320a044e27f060d7a595d</guid>
                
                    <category>
                        <![CDATA[ AWS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Thu, 16 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/network-g381392bcb_1280.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-implement-infrastructure-as-code-with-aws/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Implement Infrastructure as Code with AWS</a>
      </p><p>Infraestrutura como código (ou, em inglês, <em>infrastructure as a code</em>, ou <em>IaC</em>) é o processo de provisionamento e gerenciamento de seus recursos de nuvem escrevendo um arquivo de modelo que pode ser lido por humanos e consumível pela máquina.</p><p>Para o desenvolvimento na nuvem com a AWS, a escolha integrada para infraestrutura como código é o AWS CloudFormation.</p><p>Usando a IaC, os desenvolvedores podem gerenciar a infraestrutura de um projeto com eficiência, permitindo que eles configurem e mantenham facilmente as alterações na arquitetura e nos recursos de um projeto.</p><p>Existem inúmeras ferramentas de IaC disponíveis, como Ansible, Puppet, Chef e Terraform.</p><p>Para este guia, no entanto, usaremos o CloudFormation, que foi feito especificamente para os recursos da AWS.</p><h2 id="o-que-voc-vai-aprender-neste-tutorial">O que você vai aprender neste tutorial</h2><p>Depois de passar por este tutorial, você entenderá como manter seus recursos em um arquivo de software.</p><p>Além disso, você aprenderá os benefícios relacionados à velocidade que a infraestrutura como código traz. Sem a IaC, o tempo e o custo da implantação manual de várias infraestruturas podem ser muito maiores em comparação com a manutenção da infraestrutura como software.</p><p>Neste artigo, vamos considerar um exemplo. Ele demonstrará o provisionamento manual de recursos versus a implantação de um script CloudFormation para criar uma função Lambda sem servidor e uma API REST na AWS.</p><h3 id="servi-os-que-vamos-usar-neste-tutorial">Serviços que vamos usar neste tutorial</h3><p>Vamos usar os seguintes serviços para implementar infraestrutura como código na AWS:</p><!--kg-card-begin: html--><table style="border:none;border-collapse:collapse;table-layout:fixed;width:468pt"><colgroup><col><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;background-color:#cfe2f3;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;text-align: center;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nome do serviço AWS</span></p></td><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;background-color:#cfe2f3;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;text-align: center;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Descrição</span></p></td></tr><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:11pt;font-family:Arial;color:#000000;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;">AWS API Gateway (API GW)</span></p></td><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:11pt;font-family:Arial;color:#000000;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;">Vamos usar este serviço para criar nossa API REST. Ele também permite criar, publicar e monitorar APIs Restful e Sockets seguros.</span></p></td></tr><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:11pt;font-family:Arial;color:#000000;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;">AWS Lambda</span></p></td><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:11pt;font-family:Arial;color:#000000;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;">Vamos usar este serviço para configurar uma função serverless (sem servidor) como exemplo no backend que será integrado a nossa API REST.</span></p></td></tr><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:11pt;font-family:Arial;color:#000000;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;">Identity Access and Management (IAM)</span></p></td><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:11pt;font-family:Arial;color:#000000;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;">Serviço que permite que você gerencie o acesso a vários serviços AWS por meio de roles (funções) e permissões. Vamos criar uma role para nossa função Lambda de forma que possamos acessar o API gateway.</span></p></td></tr><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:11pt;font-family:Arial;color:#000000;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;">AWS CLI</span></p></td><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:11pt;font-family:Arial;color:#000000;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;">Para trabalhar com os serviços e recursos da AWS, você pode usar a interface de linha de comando em vez do console para um acesso mais fácil.</span></p></td></tr><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:11pt;font-family:Arial;color:#000000;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;">AWS SAM</span></p></td><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:11pt;font-family:Arial;color:#000000;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;">Uma abstração do CloudFormation que permite desenvolver as aplicações serverless.</span></p></td></tr></tbody></table><!--kg-card-end: html--><p>Para quem é novo na AWS, é bom ter algum conhecimento dela para entender o artigo. Então, você pode me acompanhar criando uma conta na AWS <a href="https://aws.amazon.com/console/">aqui</a> e certificando-se de ter a <a href="https://aws.amazon.com/cli/">AWS CLI</a> instalada para trabalhar com o exemplo.</p><h3 id="vis-o-geral-do-exemplo">Visão geral do exemplo</h3><p>Para o artigo, implementaremos uma API REST com um <em>gateway </em>de API. Ele será integrado a uma função Lambda de <em>back-end</em> sem servidor que lida com POST e obtém solicitações feitas por nossa API.</p><p>A primeira etapa mostrará como criar e implantar manualmente esses recursos usando o console AWS. A segunda etapa mostrará como automatizar o processo usando o CloudFormation.</p><h2 id="como-implantar-manualmente">Como implantar manualmente</h2><p>Na implantação (ou, em inglês, <em>deployment</em>) manual, trabalharemos dentro do console AWS. É um pouco difícil acompanhar as alterações ao trabalhar fora do IDE local, especialmente para projetos de grande escala.</p><p>Na primeira etapa, criaremos uma função Lambda.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.39.57-AM.png" class="kg-image" alt="Screenshot-2022-09-25-at-1.39.57-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-09-25-at-1.39.57-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-09-25-at-1.39.57-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.39.57-AM.png 1600w" sizes="(min-width: 1200px) 1200px" width="1600" height="724" loading="lazy"></figure><p>Se você deseja que sua função Lambda funcione com algum outro serviço como o <code>Comprehend</code>, deve conceder permissões para esse serviço. Portanto, certifique-se de criar uma função com essas permissões.</p><p>A seguir está nossa função Lambda que retornará "Hello World" quando integrada ao gateway da API.</p><pre><code class="language-py">import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello World!')
    }</code></pre><p>Agora que configuramos nossa função Lambda, a próxima etapa é criar uma API REST para interagir com a função Lambda.</p><p>Para isso, vá para o Amazon API Gateway, clique em "<em>Create API</em>" (Criar API) e selecione REST API nas opções fornecidas.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.40.24-AM.png" class="kg-image" alt="Screenshot-2022-09-25-at-1.40.24-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-09-25-at-1.40.24-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-09-25-at-1.40.24-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.40.24-AM.png 1600w" sizes="(min-width: 1200px) 1200px" width="1600" height="677" loading="lazy"></figure><p>Agora, vamos integrar o Lambda com a API. Para isso, crie um método GET no menu de ações e aponte nossa API REST para a função Lambda.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.40.51-AM.png" class="kg-image" alt="Screenshot-2022-09-25-at-1.40.51-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-09-25-at-1.40.51-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-09-25-at-1.40.51-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.40.51-AM.png 1600w" sizes="(min-width: 1200px) 1200px" width="1600" height="692" loading="lazy"></figure><p>Estamos em condições de implantar e testar nossa API para sua integração adequada com o Lambda. Selecione o nome que desejar – para este exemplo, estou usando "prod".</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.41.22-AM.png" class="kg-image" alt="Screenshot-2022-09-25-at-1.41.22-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-09-25-at-1.41.22-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-09-25-at-1.41.22-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.41.22-AM.png 1600w" sizes="(min-width: 1200px) 1200px" width="1600" height="1005" loading="lazy"></figure><p>Depois de implantar a API, você pode ver um URL no estágio "prod". Atingir esse URL acionará a função Lambda. Como retornamos "Hello World" a partir de nossa função Lambda, você poderá ver o resultado desejado.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.41.46-AM.png" class="kg-image" alt="Screenshot-2022-09-25-at-1.41.46-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-09-25-at-1.41.46-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-09-25-at-1.41.46-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.41.46-AM.png 1600w" sizes="(min-width: 1200px) 1200px" width="1600" height="415" loading="lazy"></figure><h2 id="como-implantar-com-cloudformation">Como implantar com CloudFormation</h2><p>Até aqui, vimos como funciona a implantação manual, que costuma levar alguns minutos.</p><p>Vamos imaginar, no entanto, que temos mais de uma API, método e mais de um desenvolvedor trabalhando neles. Nesse cenário, rastrear todos os recursos e mudanças seria um desafio.</p><p>Portanto, nesta seção, usaremos o AWS CloudFormation. Ele dará flexibilidade aos desenvolvedores, permitindo que eles ajustem sua infraestrutura com um script simples.</p><h3 id="como-o-cloudformation-funciona">Como o CloudFormation funciona?</h3><p>Usaremos o arquivo YAML para provisionar e declarar esses recursos e implantá-los na AWS para criar uma <em>stack</em> do CloudFormation. O CloudFormation é uma <em>stack</em> que contém todos os recursos necessários para o projeto.</p><p>Usaremos o modelo SAM, conforme descrito acima na seção de serviços. É uma abstração do CloudFormation para criar aplicações sem servidor com menos código YAML.</p><p>Para quem não conhece o YAML, você pode pensar nele como se fosse um JSON. O CloudFormation, porém, usa esses dois formatos de arquivo.</p><p><strong>Na primeira etapa</strong>, vamos para nosso IDE local e escrevemos a mesma função Lambda que escrevemos no console da AWS.</p><p><strong>helloworld.py</strong>:</p><pre><code class="language-py">import json

def lambda_handler(event, context):
    # TODO implementar
    return {
        'statusCode': 200,
        'body': json.dumps('Hello World!')
    }</code></pre><p>Em seguida, criaremos um arquivo <strong>template.yaml</strong> contendo nossa infraestrutura. Definiremos nossa função Lambda e API Gateway neste arquivo.</p><p>Para criar este arquivo, precisamos adicionar algumas informações que são comuns a todos os modelos SAM.</p><p><strong>template.yaml</strong>:</p><pre><code class="language-yaml">AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: First CloudFormation template</code></pre><p>Agora, temos que adicionar "Globals" a este arquivo <code>template.yaml</code> do CloudFormation. <strong>Globals</strong> são as configurações comuns para os recursos que você vai implantar. <em>Globals</em> permitem que você declare informações globalmente para um tipo de recurso específico, em vez de especificá-las repetidas vezes para recursos diferentes.</p><p><strong>template.yaml</strong>:</p><pre><code class="language-yaml">Globals:
    #Comum a todas as funções Lambda que você cria
    Function:
      MemorySize: 128
      Runtime: python3.6
      Timeout: 5</code></pre><p>Temos que definir a tag Resources em nosso arquivo <code>template.yaml</code>. A função Lambda e a API REST estarão sob esta tag.</p><p><strong>template.yaml</strong>:</p><pre><code class="language-yaml">Resources:

    ##Lambda e API GW integrados
    helloworld:
        Type: AWS::Serverless::Function
        Properties:
          #nome_de_arquivo.nome_da_função
          Handler: helloworld.lambda_handler

          #REST API criada
          Events:
            PostAdd:
              Type: Api
              Properties:
                Path: /helloworld
                Method: get</code></pre><p>No código acima, definimos parâmetros para criar a função Lambda. Para o evento, criamos uma API REST que aciona a função Lambda.</p><p><strong>Observação:</strong> há alguns parâmetros, como <em>CodeURI</em> e <em>description</em>, que você pode especificar para sua função <em>serverless</em>. A melhor maneira de criar um arquivo de modelo é consultar os documentos do CloudFormation e ver os parâmetros disponíveis para seu recurso/serviço especificado.</p><h2 id="como-implantar-o-arquivo-de-modelo">Como implantar o arquivo de modelo</h2><p>Podemos implantar nosso arquivo <code>template.yaml</code> usando os dois comandos da AWS CLI a seguir:</p><pre><code class="language-yaml">##s3 bucket armazena o modelo sam que precisamos implantar
aws cloudformation package --template-file template.yaml --output-template-file sam-template.yaml --s3-bucket helloworld-sam</code></pre><p>Depois de executar o comando acima, você poderá ver um arquivo de modelo SAM. Usaremos esse arquivo no segundo comando abaixo.</p><p>Neste comando, forneça o caminho apropriado para o arquivo <code>sam-template.yaml</code>:</p><pre><code class="language-yaml">#Implantar a stack
#aponta para o arquivo modeleo criado por um comando anterior e um nome da stack, bem como a região na qual estamos implantando

aws cloudformation deploy --template-file /path to sam-template.yaml file --stack-name test-stack --capabilities CAPABILITY_IAM --region us-east-1</code></pre><p>Depois de executar esses dois comandos, você verá a <em>stack</em> criada na CLI. Você pode verificá-la usando o CloudFormation no console.</p><p>Aqui você verá todos os recursos provisionados por meio do código criado e implantado usando o arquivo <code>template.yaml</code>.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.38.39-AM.png" class="kg-image" alt="Screenshot-2022-09-25-at-1.38.39-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/02/Screenshot-2022-09-25-at-1.38.39-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/02/Screenshot-2022-09-25-at-1.38.39-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Screenshot-2022-09-25-at-1.38.39-AM.png 1600w" sizes="(min-width: 1200px) 1200px" width="1600" height="1168" loading="lazy"></figure><p>Você pode clicar na API e acessar o URL para verificar a saída, como fizemos para a implantação manual.</p><h2 id="resumo">Resumo</h2><p>Era isso! Você implementou com sucesso a infraestrutura como código na AWS usando o CloudFormation.</p><p>Espero que este artigo tenha sido útil para quem deseja entender a implementação de infraestrutura como código na AWS.</p><p>Conecte-se com o autor do artigo pelo <a href="https://www.linkedin.com/in/kadeniyi/">LinkedIn</a> e pelo <a href="https://twitter.com/mkbadeniyi">Twitter</a>.</p><p>Até a próxima! 🙂</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como criar códigos QR impressionantes com Python ]]>
                </title>
                <description>
                    <![CDATA[ Um código de resposta rápida, ou quick response (QR), é um código de barras que um dispositivo digital pode escanear facilmente. Ele codifica os dados como uma série de pixels em uma grade quadrada. Acompanhar informações sobre cadeias de suprimentos usando códigos QR é muito útil em campanhas de marketing ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-codigos-qr-impressionantes-com-python/</link>
                <guid isPermaLink="false">63b2e80a44e27f060d7a5743</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Wed, 15 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/How-to-create-stunning-QR-codes-with-python-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-create-stunning-qr-codes-with-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Create Stunning QR Codes with Python</a>
      </p><p>Um código de resposta rápida, ou <strong>quick response</strong> (QR), é um código de barras que um dispositivo digital pode escanear facilmente. Ele codifica os dados como uma série de pixels em uma grade quadrada.</p><p>Acompanhar informações sobre cadeias de suprimentos usando códigos QR é muito útil em campanhas de marketing e publicidade.</p><p>A International Organization for Standardization (ISO) certificou os códigos QR como um padrão global em 2000. Eles são uma melhoria em relação aos códigos de barras unidimensionais anteriores.</p><p>Os códigos QR foram desenvolvidos na década de 1990 para fornecer mais informações do que um código de barras comum. Eles foram criados pela Denso Wave, afiliada da Toyota, para monitorar a produção de veículos.</p><p>Ao contrário dos códigos de barras, que precisam de um feixe de luz para refletir as linhas paralelas, os códigos QR podem ser escaneados digitalmente por dispositivos como smartphones.</p><p>Os códigos QR são usados em sistemas de criptomoeda para permitir pagamentos digitais, como ao exibir um endereço Bitcoin. Os códigos QR também costumam ser usados para comunicar URLs de sites a dispositivos móveis.</p><p>Neste artigo, usaremos a biblioteca <code>segno</code> para criar belos códigos QR que executam muitas funções.</p><h2 id="o-que-o-segno">O que é o Segno?</h2><p>O <a href="https://pypi.org/project/segno/">Segno</a> é um gerador de código QR de código aberto que permite criar códigos QR regulares e micro com muito pouco esforço. Ele também não possui dependências.</p><p>O Segno oferece alguns tipos de serialização, como SVG, EPS, PNG, PDF e saída de texto. Nenhum desses serializadores chama uma biblioteca externa. Por meio de um design de plug-in, o Segno oferece outros tipos de serialização. PyPy e Python versões 2.6 a 3.4 foram usadas para teste.</p><h3 id="como-instalar-o-segno">Como instalar o Segno</h3><p>Assim como qualquer outra biblioteca Python, você pode instalar o Segno via pip.</p><pre><code class="language-python">pip install segno
</code></pre><h2 id="como-criar-um-c-digo-qr">Como criar um código QR</h2><p>Então, usando o método <code>.make()</code>, vamos começar fazendo o código QR mais básico possível. Como o conteúdo é tão pequeno, o Segno gera automaticamente um código "<strong>micro QR</strong>" de tamanho reduzido, que carrega dados brutos e que você pode copiar ou transferir.</p><pre><code class="language-python">import segno

price_tag = segno.make("Hello World")
price_tag.save("hello-world.png")
</code></pre><p>O código QR é gerado e salvo em nosso diretório de projetos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Price-Tag.png" class="kg-image" alt="Price-Tag" width="21" height="21" loading="lazy"><figcaption>hello-world.png</figcaption></figure><p>Podemos adicionar uma borda ao código QR para torná-lo mais atraente. Você pode fazer isso adicionando o parâmetro <code>border</code> ao método <code>.save()</code>.</p><pre><code class="language-python">import segno
qrcode = segno.make('Vampire Blues')
qrcode.save('vampire-blues.png', border=5)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/vampire-blues.png" class="kg-image" alt="vampire-blues" width="27" height="27" loading="lazy"><figcaption>vampire-blues.png</figcaption></figure><p>Os códigos QR que criamos eram muito pequenos. Podemos fazê-los parecer maiores adicionando o parâmetro de escala como este:</p><pre><code class="language-python">import segno
qrcode = segno.make_qr('Welcome')
qrcode.save('welcome.png', scale=10)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/welcome.png" class="kg-image" alt="welcome" width="290" height="290" loading="lazy"><figcaption>welcome.png</figcaption></figure><h3 id="como-criar-c-digos-qr-coloridos">Como criar códigos QR coloridos</h3><p>Também podemos criar alguns códigos QR coloridos com o Segno – eles são realmente lindos. Isso é possível com a ajuda de muitos serializadores que aceitam os parâmetros escuro e claro para especificar a cor dos módulos escuros e claros.</p><p>Aqui estão alguns exemplos para lhe dar uma ideia do que é possível:</p><pre><code class="language-python">import segno
qrcode = segno.make("Green ave, Kingston")
qrcode.save('address.png', dark='darkred', light='lightblue', scale=10)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/address.png" class="kg-image" alt="address" width="330" height="330" loading="lazy"><figcaption>address.png</figcaption></figure><pre><code class="language-python">import segno
qrcode = segno.make("Green ave, Kingston")
# Módulos escuros com transparência alfa
qrcode.save('address2.png', dark='#0000ffcc', scale=10)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/address2.png" class="kg-image" alt="address2" width="330" height="330" loading="lazy"><figcaption>address2.png</figcaption></figure><pre><code class="language-python">import segno
micro_qrcode = segno.make('Rain', error='q')
micro_qrcode.save('rain.png', dark='darkblue', data_dark='steelblue', scale=5)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/rain.png" class="kg-image" alt="rain" width="105" height="105" loading="lazy"><figcaption>rain.png</figcaption></figure><h2 id="como-salvar-c-digos-qr-em-diferentes-formatos">Como salvar códigos QR em diferentes formatos</h2><p>O Segno nos dá a flexibilidade de salvar nossos códigos QR gerados em diferentes formatos de arquivo, como <code>.svg</code>, <code>.png</code>, <code>.eps</code> e <code>.pdf</code>.</p><p>Veja como você faria isso:</p><pre><code class="language-python">import segno
qrcode = segno.make('Beatles')
qrcode.save('Beatles.svg')
qrcode.save('Beatles.png')
qrcode.save('Beatles.eps')

</code></pre><h2 id="casos-de-uso-para-c-digos-qr-com-exemplos">Casos de uso para códigos QR com exemplos</h2><h3 id="como-criar-um-c-digo-qr-para-compartilhamento-de-url">Como criar um código QR para compartilhamento de URL</h3><p>Podemos gerar facilmente um código QR vinculado a um URL. Isso nos permite obter conteúdo on-line usando a mesma técnica com uma carga útil um pouco maior.</p><p>Vamos criar um código QR que vincule ao canal YouTube do autor deste artigo (Velcast Podcast) e depois vamos salvá-lo.</p><p>Aqui está o código para isso:</p><pre><code class="language-python">import segno

video = segno.make('https://www.youtube.com/channel/UCNhFxpk6hGt5uMCKXq0Jl8A')
video.save('Video.png', dark="yellow", light="#323524", scale=5)
</code></pre><p>O resultado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/Video.png" class="kg-image" alt="Video" width="205" height="205" loading="lazy"><figcaption>video.png</figcaption></figure><h3 id="como-criar-um-c-digo-qr-para-uma-configura-o-wi-fi">Como criar um código QR para uma configuração Wi-Fi</h3><p>Também podemos usar a biblioteca do Segno para criar um código QR para configuração de Wi-Fi. O módulo <code>segno.helpers</code> oferece métodos de fábrica para gerar códigos QR padrão para codificação de coordenadas geográficas, <code>vCards</code> e <code>MeCards</code>, <code>WIFI setups</code> e <code>EPC QR Codes</code>.</p><p>O nível de correção de erro "<strong>L</strong>" é utilizado na criação de códigos QR. Se possível, aplicaremos o nível de correção de erro mais alto sem alterar a versão do QR Code.</p><p>A densidade da imagem do código QR <strong>diminui com a diminuição do nível de correção de erros</strong>, o que aumenta o tamanho mínimo de impressão. Quanto mais danos ele puder suportar antes de perder sua capacidade de leitura, <strong>maior será o nível de correção de erros.</strong></p><p>O equilíbrio ideal entre densidade e resistência para uso geral de marketing é o <strong>Nível L</strong> ou o <strong>Nível M</strong>. Em ambientes industriais, onde pode ser difícil manter um código QR limpo ou sem danos, os <strong>níveis Q</strong> e <strong>H</strong> são as melhores opções.</p><pre><code class="language-python">from segno import helpers

qrcode = helpers.make_wifi(ssid='MyWifi', password='1234567890', security='WPA')
qrcode.designator
'3-M'
qrcode.save('wifi-access.png', scale=10)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/wifi-access.png" class="kg-image" alt="wifi-access" width="370" height="370" loading="lazy"><figcaption>wifi-access.png</figcaption></figure><p>Também podemos fazer esse código deste modo:</p><pre><code class="language-python">
import segno
wifi_settings = {    
    ssid='(Wifi Name)',    
    password='(Wifi Password)',    
    security='WPA',
    }
wifi = segno.helpers.make_wifi(**wifi_settings)
wifi.save("Wifi.png", dark="yellow", light="#323524", scale=8)
</code></pre><p>Podemos usar qualquer uma das duas opções para o código. Eles resultam na mesma coisa, mas representam estilos diferentes de redação e apresentação.</p><p>Casos de uso comuns do uso de códigos QR para acesso Wi-Fi incluem:</p><ul><li>Em vez de fornecer códigos de acesso exclusivos aos consumidores, as empresas podem usar códigos QR para oferecer acesso Wi-Fi gratuito. Os clientes precisam apenas escanear o código para ter acesso.</li><li>As famílias podem usá-lo para conceder aos visitantes acesso à Internet em casa.</li></ul><h3 id="como-codificar-detalhes-de-contatos-em-c-digos-qr">Como codificar detalhes de contatos em códigos QR</h3><p>Também podemos armazenar detalhes de contato em um código QR. Basta usar o método <code>helpers.make_mecard()</code> e passar os dados de contato. É importante observar que podemos passar uma lista para o método.</p><p>Vejamos um exemplo:</p><pre><code class="language-python">from segno import helpers
qrcode = helpers.make_mecard(name='Shittu Olumide', email='me@example.com', phone='+123456789')
qrcode.designator
'3-L'
# Alguns parâmetros aceitam vários valores, como e-mail, telefone, url
qrcode = helpers.make_mecard(name='Shittu Olumide', 
                             email=('me@example.com', 'email@example.com'),
                             url=['http://www.example.com', 'https://example.com/~olu'])
qrcode.save('mycontact.png', scale=5)
</code></pre><p>O Segno também permite que você execute as seguintes ações:</p><ul><li><strong><strong>segno.helpers.make_geo</strong>: </strong>inicia o programa de mapeamento integrado em uma determinada latitude e longitude.</li><li><strong><strong>segno.helpers.make_email</strong>: </strong>envia uma mensagem usando um tópico e corpo predefinidos. É excelente para ativar qualquer número de atividades potenciais de um servidor de e-mail, como assinar boletins informativos, registrar sua chegada em algum lugar e muito mais.</li><li><strong><strong>segno.helpers.make_epc_qr:</strong> </strong>inicia um pagamento eletrônico.</li></ul><h3 id="casos-de-uso-de-c-digo-qr">Casos de uso de código QR</h3><p>Agora que você aprendeu a criar códigos QR, aqui estão algumas de suas aplicações nas empresas e no nosso dia a dia:</p><ul><li>Pagamentos digitais.</li><li>Compartilhamento de informações comerciais.</li><li>Compartilhamento de informações de contato pessoal.</li><li>Menus em código QR em restaurantes.</li><li>Facilitação de autenticação em Wi-Fi.</li></ul><p>E muito mais.</p><h2 id="conclus-o">Conclusão</h2><p>Espero que este pequeno artigo tenha aguçado seu apetite e inspirado você a empregar códigos QR em seu trabalho e projetos pessoais.</p><p>Ao desenvolver alguns códigos QR atraentes e funcionais neste artigo, testamos o módulo do Segno para o Python. Você pode ler a <a href="https://segno.readthedocs.io/en/latest/">documentação</a> oficial para saber mais sobre a biblioteca.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como baixar e cortar MP3s do YouTube com Python ]]>
                </title>
                <description>
                    <![CDATA[ Todo mundo é diferente, mas acredito que quase todos nós gostamos de ouvir música. Se você deseja manter uma versão local dos áudios que costuma ouvir on-line, precisará fazer o download desses arquivos. Às vezes, você também vai querer recortar uma parte desse arquivo de áudio em vez de ter ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-baixar-e-cortar-mp3s-do-youtube-com-python/</link>
                <guid isPermaLink="false">63b2d44444e27f060d7a55dd</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Tue, 14 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/pexels-pixabay-164821.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/download-trim-mp3-from-youtube-with-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Download and Trim MP3s from YouTube with Python</a>
      </p><p><strong>Todo mundo é diferente, mas acredito que quase todos nós gostamos de ouvir música.</strong></p><p>Se você deseja manter uma versão local dos áudios que costuma ouvir on-line, precisará fazer o download desses arquivos. Às vezes, você também vai querer recortar uma parte desse arquivo de áudio em vez de ter o arquivo todo disponível.</p><p>Você pode desenvolver um script em Python para fazer exatamente essas coisas. Você também pode estendê-lo com funcionalidades adicionais, se desejar. Mostrarei a você como fazer isso neste tutorial.</p><h2 id="uma-observa-o-sobre-direitos-autorais">Uma observação sobre direitos autorais</h2><p>Se você já usou a Internet antes, provavelmente está ciente de que questões de direitos autorais (em inglês, <em>copyrights</em>) podem deixar muitas pessoas chateadas – em ambos os lados de um debate sobre como o conteúdo livre deve ser.</p><p><a href="https://github.blog/2020-11-16-standing-up-for-developers-youtube-dl-is-back/">A própria biblioteca que usaremos teve sua parcela de problemas com direitos autorais.</a></p><p>Felizmente, há material livre de direitos autorais disponível para desfrutarmos e brincarmos usando nossos programas. Portanto, usaremos neste tutorial o <a href="https://www.youtube.com/watch?v=8OAPLk20epo">4º Movimento da 9ª Sinfonia de Beethoven</a>, que é isento de royalties.</p><p>Este guia pressupõe que você também usará os métodos ensinados para baixar material livre de direitos autorais. Não use esta informação para infringir direitos autorais!</p><h2 id="o-que-vamos-fazer-neste-tutorial">O que vamos fazer neste tutorial</h2><p>Primeiro, vamos instalar a dependência básica, FFMPEG. Em seguida, instalaremos a biblioteca <code>youtube-dl</code> (que também funciona com o Vimeo e muitas outras plataformas) para baixar o áudio de um URL do YouTube e usá-lo no código em Python.</p><p>Em seguida, faremos o download da biblioteca <code>pydub</code> para cortar arquivos de áudio e implementar essa funcionalidade em nosso código.</p><p>Por fim, criaremos uma interface de usuário amigável para que possamos reutilizar esse script mais tarde sem precisar editar o código.</p><p>Tudo isso será executado dentro de uma função <code>main()</code> para que possamos separar funcionalidade, implementação e uso.</p><h2 id="como-instalar-o-pacote-do-ffmpeg">Como instalar o pacote do FFMPEG</h2><p>Este pacote está no centro de muitos programas multimídia (e todos os de código aberto que usei até agora). Vamos precisar dele para ambas as bibliotecas do Python que instalaremos em breve.</p><h3 id="como-instalar-no-linux">Como instalar no Linux</h3><p>Se você está em uma máquina com o Debian (tal como o Ubuntu ou o Kali), aqui está o comando para instalar o FFMPEG:</p><pre><code>sudo apt-get install ffmpeg</code></pre><p>Se você está usando outros tipos de distribuições, as instruções de instalação estão <a href="https://ffmpeg.org/download.html">aqui</a> (em inglês).</p><h3 id="como-instalar-no-windows">Como instalar no Windows</h3><p>Primeiro, instale o <a href="https://chocolatey.org/how-chocolatey-works">Chocolatey Package Manager</a>. As instruções de instalação estão <a href="https://chocolatey.org/install">aqui</a>.</p><p>Depois de instalar corretamente o Chocolatey (caso ainda não o tenha), baixe o seguinte pacote a partir de uma <strong>instância administrativa do Powershell</strong>:</p><pre><code class="language-powershell">choco install ffmpeg
</code></pre><h3 id="como-instalar-no-mac">Como instalar no Mac</h3><p>Caso você ainda não o tenha, <a href="https://brew.sh/">instale o homebrew</a>. Então, em um terminal, digite:</p><pre><code>brew install ffmpeg</code></pre><h2 id="como-baixar-programaticamente-o-udio-de-urls-do-youtube">Como baixar programaticamente o áudio de URLs do YouTube</h2><p>Antes de mais nada, baixe o pacote <code>youtube-dl</code> com o pip. É um dos pacotes com mais estrelas no GitHub.</p><p><code>pip install youtube-dl</code></p><p>Vamos importar este módulo e, então, declarar uma função que baixa o áudio em formato mp3 com qualidade razoável de um URL do YouTube.</p><pre><code class="language-python">import youtube_dl # client para muitos portais de multimídia

# baixa yt_url para o mesmo diretório no qual o script é executado
def download_audio(yt_url):
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
    }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([yt_url])

def main():
    yt_url = "https://www.youtube.com/watch?v=8OAPLk20epo"
    download_audio(yt_url)

main()
</code></pre><p>O método <code>.download()</code> baixará gradualmente o fluxo de áudio como um arquivo <code>.webm</code>. Depois de detectar que todo o arquivo está disponível, ele usará o <code>ffmpeg</code> para convertê-lo em um arquivo de áudio MP3. Isso significa que, se algo acontecer, digamos que a conexão com a Internet caia quando o arquivo estiver 90% baixado, ele retomará o download em 90% em vez de desde o início – bem legal.</p><p>Observe que, se você já baixou o arquivo mp3, o download será reiniciado e substituirá o arquivo.</p><p>Execute seu script do Python. O download de áudio para esta interpretação do 4º Movimento da 9ª Sinfonia de Beethoven deve ser um arquivo MP3 de aproximadamente 33 Mb com o título do vídeo disponível localmente. Provavelmente, vai ser um pouco lento, então vá fazer um chá.</p><p>Como você pode ver, é possível passar parâmetros opcionais para <code>youtube-dl</code> (que também estará disponível como um programa CLI independente fora do script). Um de seus recursos é <a href="https://github.com/ytdl-org/youtube-dl#video-selection">baixar uma série de vídeos de um URL de lista de reprodução</a>. Se você estiver mais interessado, pode ler a documentação deles. Vou manter o uso mais trivial ao longo deste tutorial.</p><h2 id="como-cortar-o-arquivo-baixado">Como cortar o arquivo baixado</h2><p>Com o arquivo baixado, vamos cortá-lo localmente (você deve ter considerado se é possível simplesmente baixar um clipe do YouTube. Todos os métodos confiáveis que encontrei se resumem basicamente a baixar o arquivo inteiro e depois editar localmente). Para isso, usaremos a <a href="https://github.com/jiaaro/pydub">biblioteca pydub</a>. Você pode instalá-la assim:</p><pre><code class="language-python">pip install pydub</code></pre><p>Esta é uma biblioteca muito boa, que permite manipular completamente o áudio, reduzindo ou aumentando o volume em determinados intervalos, repetindo clipes e assim por diante. Por enquanto, estamos interessados apenas em cortar.</p><p>Para cortar nosso arquivo baixado, teremos que obter o nome do arquivo de nosso MP3 recém-baixado, converter os pontos inicial e final de nosso intervalo de áudio desejado de "horas:minutos:segundos" para milissegundos e, finalmente, usar o pydub para cortar nosso arquivo de áudio.</p><h3 id="como-obter-o-nome-do-arquivo">Como obter o nome do arquivo</h3><p>Infelizmente, o método <code>.download()</code> não retornará nosso nome de arquivo gerado, ao qual também não teremos acesso, pois estamos apenas passando o URL como parâmetro. Temos, porém, o Python – e ele é uma ferramenta fantástica.</p><p>Sabemos que estamos procurando um arquivo <code>.mp3</code> que foi gerado logo antes de nossa operação de pesquisa de nome de arquivo (por padrão, o Python executa em <em>thread </em>única e executará o código de forma síncrona). Pegaremos o nome do nosso MP3 mais recente no diretório do script, e esse será o nosso arquivo.</p><p>Podemos realizar esta operação listando todos os arquivos <code>.mp3</code> no diretório local, coletando suas datas e horas como números inteiros (o que significa tempo em milissegundos contados a partir de uma determinada data no passado – ou seja, quanto maior o valor, mais distante no tempo o arquivo foi criado), e obtendo o arquivo com o valor mais alto.</p><p>Para isso, vamos precisar dos módulos <code>glob</code> para navegar no diretório e <code>os</code> para obter informações de data e hora, ambos disponíveis nativamente.</p><pre><code class="language-python">import glob
import os

def newest_mp3_filename():
    # lista todos os mp3s no diretório local
    list_of_mp3s = glob.glob('./*.mp3')
    # retorna o mp3 com o valor de data e hora mais alto
    return max(list_of_mp3s, key = os.path.getctime)
</code></pre><h3 id="como-obter-hh-mm-ss-como-milissegundos">Como obter HH:MM:SS como milissegundos</h3><p>Assim que fatiarmos nosso arquivo, o <code>pydub</code> esperará intervalos de tempo expressos em milissegundos. Para nós, humanos, calcular o momento exato em milissegundos toda vez que queremos cortar um vídeo seria muito chato. Então, pediremos ao computador que faça isso por nós.</p><p>Nossa entrada será uma string no formato <strong>HH:MM:SS</strong>. Isso funciona bem se quisermos cortar um vídeo com mais de uma hora, mas, na maioria das vezes, queremos apenas obter o intervalo de tempo de minuto:segundo para outro. Então, temos que levar isso em consideração também.</p><p>Um milissegundo é 1/1000 de segundo. Um minuto são 60 segundos e uma hora são 60 minutos. Portanto, temos que obter o valor para horas, depois para minutos e depois para segundos, realizar a conversão de milissegundos em cada um e depois somar as partes para chegar ao resultado.</p><pre><code class="language-python">def get_video_time_in_ms(video_timestamp):
    vt_split = video_timestamp.split(":")
    if (len(vt_split) == 3): # se estiver no formato HH:MM:SS
        hours = int(vt_split[0]) * 60 * 60 * 1000
        minutes = int(vt_split[1]) * 60 * 1000
        seconds = int(vt_split[2]) * 1000
    else: # formato MM:SS
        hours = 0
        minutes = int(vt_split[0]) * 60 * 1000
        seconds = int(vt_split[1]) * 1000
    # ponto no tempo em milissegundos
    return hours + minutes + seconds
</code></pre><h3 id="como-obter-o-udio-cortado">Como obter o áudio cortado</h3><p>Agora, vamos ler nosso MP3 como um objeto <code>pydub</code> e fatiar nosso intervalo desejado. A sintaxe é exatamente a mesma das operações de fatiamento em strings e arrays, mas, em vez de um índice para um elemento, usaremos milissegundos para instantes específicos dentro do áudio.</p><pre><code class="language-python">def get_trimmed(mp3_filename, initial, final = ""):
    if (not mp3_filename):
        # levanta um erro para suspender imediatamente a execução do programa
        raise Exception("No MP3 found in local directory.")
    # lê o mp3 como um objeto PyDub
    sound = AudioSegment.from_mp3(mp3_filename)
    t0 = get_video_time_in_ms(initial)
    print("Beginning trimming process for file ", mp3_filename, ".\n")
    print("Starting from ", initial, "...")
    if (len(final) &gt; 0):
        print("...up to ", final, ".\n")
        t1 = get_video_time_in_ms(final)
        return sound[t0:t1] # t0 up to t1
    return sound[t0:] # t0 até o fim
</code></pre><h2 id="como-juntar-tudo">Como juntar tudo</h2><blockquote>Alle Menschen werden Brüder,<br>Wo dein sanfter Flügel weilt.<br>-- Friedrich Schiller</blockquote><p>Caso você esteja se perguntando, o fragmento anterior se traduz em "criais-nos um mundo irmão, insuflais nosso Canto". É um fragmento de <em>Hino à alegria </em>(e, inglês, <em>Ode to Joy</em>), um poema de Friedrich Schiller, que serve como a maior parte da letra das partes corais do 4º Movimento.</p><p>Este é o fragmento mais famoso do movimento mais famoso da mais famosa sinfonia de Beethoven. É muito provável que você reconheça esta peça, não importando sua origem ou criação.</p><p>Vamos juntar tudo o que fizemos. Faremos o download do áudio do YouTube, fatiaremos o coral de <em>Hino à alegria</em> (de <code>9:51</code> a <code>14:04</code>) e salvaremos como <code>&lt;nome_do_arquivo&gt; - TRIM.mp3</code>.</p><p>Se você seguiu o tutorial corretamente, atualize sua função <code>main()</code> para executar cada etapa de modo a ficar com o MP3 completo e a versão cortada dele como arquivos disponíveis no diretório em que você executará o script. Não se esqueça de executar a função <code>main()</code> no final do script.</p><pre><code class="language-python">def main():
    yt_url = "https://www.youtube.com/watch?v=8OAPLk20epo"
    download_audio(yt_url)
    initial = "9:51"
    final = "14:04"
    filename = newest_mp3_filename()
    trimmed_file = get_trimmed(filename, initial, final)
    trimmed_filename = "".join([filename.split(".mp3")[0], "- TRIM.mp3"])
    print("Process concluded successfully. Saving trimmed file as ", trimmed_filename)
    # salva o arquivo com o mais novo nome de arquivo
    trimmed_file.export(trimmed_filename, format="mp3")
</code></pre><h2 id="como-adicionar-intera-o-de-usu-rio-diretamente-da-interface-de-linha-de-comando">Como adicionar interação de usuário diretamente da interface de linha de comando</h2><p>Para esta parte, precisaremos do módulo <code>sys</code> do Python, que lê a entrada passada pela linha de comando (entre outras coisas). Simplesmente atualizaremos as variáveis na função <code>main()</code> para ler a entrada da CLI em vez dos dados atualmente codificados.</p><p>O ARGV lê a entrada sequencialmente como um <em>array</em>, começando no índice 1 (0 representa o nome do script Python em execução). Vamos configurá-lo para ler um URL como o primeiro argumento e, em seguida, os instantes de corte inicial e final (opcional).</p><pre><code class="language-python">import sys

def main():
    if (not len(sys.argv) &gt; 1):
        print("Please insert a multimedia-platform URL supported by youtube-dl as your first argument.")
        return
    yt_url = sys.argv[1]
    download_audio(yt_url)
    if (not len(sys.argv &gt; 2)): # exit if no instants as args
        return
    initial = sys.argv[2]
    final = ""
    if (sys.argv[3]):
        final = sys.argv[3]
    filename = newest_mp3_filename()
    trimmed_file = get_trimmed(filename, initial, final)
    trimmed_filename = "".join([filename.split(".mp3")[0], "- TRIM.mp3"])
    print("Process concluded successfully. Saving trimmed file as ", trimmed_filename)
    # salva o arquivo com o mais novo nome de arquivo
    trimmed_file.export(trimmed_filename, format="mp3")
</code></pre><p>Execute o arquivo para testá-lo. Lembre-se de atualizar o nome do script para aquele que está em sua máquina.</p><pre><code class="language-bash">python ytauddown.py https://www.youtube.com/watch?v=8OAPLk20epo 9:51 14:04
</code></pre><h2 id="script-final">Script final</h2><p>Esta é a versão final, com tudo junto. Observe que os comentários sobre os módulos estão relacionados apenas ao que estamos usando e que a função <code>main()</code> está sendo invocada na última linha.</p><pre><code class="language-python">import youtube_dl # cliente para baixar a partir de vários portais de multimídia
import glob # operações de diretório
import os # interface para informações fornecidas pelo sistema em arquivos
import sys # interface para a linha de comando
from pydub import AudioSegment # somente operações de áudio

def newest_mp3_filename():
    # lista todos os mp3s no diretório local
    list_of_mp3s = glob.glob('./*.mp3')
    # returna mp3 com o valor de data e hora mais alto
    return max(list_of_mp3s, key = os.path.getctime)

def get_video_time_in_ms(video_timestamp):
    vt_split = video_timestamp.split(":")
    if (len(vt_split) == 3): # se estiver no formato HH:MM:SS
        hours = int(vt_split[0]) * 60 * 60 * 1000
        minutes = int(vt_split[1]) * 60 * 1000
        seconds = int(vt_split[2]) * 1000
    else: # formato MM:SS
        hours = 0
        minutes = int(vt_split[0]) * 60 * 1000
        seconds = int(vt_split[1]) * 1000
    # ponto no tempo em milissegundos
    return hours + minutes + seconds

def get_trimmed(mp3_filename, initial, final = ""):
    if (not mp3_filename):
        # levanta um erro para suspender imediatamente a execução do programa
        raise Exception("No MP3 found in local directory.")
    # lê o mp3 como um objeto PyDub
    sound = AudioSegment.from_mp3(mp3_filename)
    t0 = get_video_time_in_ms(initial)
    print("Beginning trimming process for file ", mp3_filename, ".\n")
    print("Starting from ", initial, "...")
    if (len(final) &gt; 0):
        print("...up to ", final, ".\n")
        t1 = get_video_time_in_ms(final)
        return sound[t0:t1] # t0 up to t1
    return sound[t0:] # t0 up to the end



# baixa yt_url para o mesmo diretório no qual o script é executado
def download_audio(yt_url):
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
    }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([yt_url])

def main():
    if (not len(sys.argv) &gt; 1):
        print("Please insert a multimedia-platform URL supported by youtube-dl as your first argument.")
        return
    yt_url = sys.argv[1]
    download_audio(yt_url)
    if (not len(sys.argv &gt; 2)): # sai se não houver os tempos como argumentos
        return
    initial = sys.argv[2]
    final = ""
    if (sys.argv[3]):
        final = sys.argv[3]
    filename = newest_mp3_filename()
    trimmed_file = get_trimmed(filename, initial, final)
    trimmed_filename = "".join([filename.split(".mp3")[0], "- TRIM.mp3"])
    print("Process concluded successfully. Saving trimmed file as ", trimmed_filename)
    # salva o arquivo com o mais novo nome de arquivo
    trimmed_file.export(trimmed_filename, format="mp3")

# exemplo de uso:
# python ytauddown.py https://www.youtube.com/watch?v=8OAPLk20epo 9:51 14:04
main()
</code></pre><h2 id="exerc-cios-sugeridos">Exercícios sugeridos</h2><ol><li>Detecte se a primeira entrada é um URL válido ou não. Dê uma olhada nas RegEx em Python se não souber por onde começar.</li><li>Detecte se a segunda e a terceira entradas estão no formato válido (horas:minutos:segundos <strong>OU</strong> minutos:segundos).</li><li>Adicione uma opção para renomear o arquivo MP3 diretamente da CLI. Lembre-se de que os argumentos ARGV são executados em ordem.</li><li>Refatore este script para interagir com sua funcionalidade usando uma GUI. Pode ser um aplicativo da web ou local, sua escolha.</li></ol><h2 id="considera-es-finais">Considerações finais</h2><p>Espero que você se divirta com este projeto e faça bom uso dele.</p><p>Lembre-se de que ganhar a vida como artista é muito difícil, especialmente para a maioria sem apoio corporativo. Lembre-se de apoiar os artistas de cujo trabalho você gosta sempre que puder e lembre-se também de apoiar o software de código aberto.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
