<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RENATO ADORNO</title>
    <description>The latest articles on DEV Community by RENATO ADORNO (@renatoadorno).</description>
    <link>https://dev.to/renatoadorno</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F674519%2F7cc7d819-bb5c-463a-8a32-09c8d0d4d7a1.jpg</url>
      <title>DEV Community: RENATO ADORNO</title>
      <link>https://dev.to/renatoadorno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renatoadorno"/>
    <language>en</language>
    <item>
      <title>Dicas essenciais de performance para o Front-End</title>
      <dc:creator>RENATO ADORNO</dc:creator>
      <pubDate>Mon, 10 Feb 2025 17:05:26 +0000</pubDate>
      <link>https://dev.to/renatoadorno/dicas-essenciais-de-performance-para-o-front-end-205</link>
      <guid>https://dev.to/renatoadorno/dicas-essenciais-de-performance-para-o-front-end-205</guid>
      <description>&lt;p&gt;A performance em uma aplicação web é crucial para a experiência do usuário. Um site lento pode resultar em menor engajamento, pior SEO e até perda de receita. Por isso, performance e eficiência são temas recorrentes no dia a dia de um desenvolvedor. No entanto, ao tentar resolver esses problemas, muitas das vezes esquecemos o essencial. Se tem algo que aprendi, é que, na maioria das vezes, as otimizações mais simples são as que causam o maior impacto.Com isso em mente, neste artigo elaborei algumas dicas para tornar sua aplicação web mais rápida e eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evite iframes
&lt;/h2&gt;

&lt;p&gt;Evite ao máximo a utilização de iframes, utilize apenas quando não houver outra solução viável. Além de impactar negativamente o desempenho, eles podem prejudicar a acessibilidade e a usabilidade da aplicação. Além disso, conteúdos dentro de iframes não são indexados por mecanismos de busca, o que pode afetar o SEO. Sempre que possível, busque outras alternativas técnicas como o uso de APIs ou a incorporação direta do conteúdo na página.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquivos CSS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Minifique o CSS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sempre escolha arquivos CSS minificados para um melhor desempenho do site. Um arquivo CSS menor e otimizado reduzirá o tempo de carregamento da página, o que melhorará a experiência do usuário. Além disso, a minificação economizará largura de banda, reduzindo custos operacionais para empresas, diminuindo e otimizando o uso de recursos.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Evite Bloqueios no Carregamento&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Alguns arquivos CSS podem atrasar a renderização da página, pois o navegador precisa processá-los antes de exibir o conteúdo. Para evitar esse bloqueio, utilize técnicas como &lt;code&gt;preload&lt;/code&gt;, que permite que o navegador carregue os estilos antecipadamente, sem interromper a exibição da página.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de como implementar o &lt;code&gt;preload&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"styles.css"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"style"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilize CSS Crítico Inline para o inicio do carregamento.
&lt;/h3&gt;

&lt;p&gt;O CSS crítico, também conhecido como &lt;strong&gt;"above the fold"&lt;/strong&gt;, é o conjunto de estilos necessários para renderizar a parte visível da página no primeiro carregamento. Incorporá-lo diretamente no HTML antes da chamada principal do CSS pode acelerar a exibição do conteúdo e melhorar a experiência do usuário.&lt;br&gt;
Para obter os melhores resultados, minifique o CSS crítico e insira-o dentro de uma tag &lt;code&gt;&amp;lt;style&amp;gt;&amp;lt;/style&amp;gt;&lt;/code&gt; no cabeçalho da página. Isso reduz o tempo de renderização ao evitar requisições adicionais ao servidor.&lt;/p&gt;
&lt;h3&gt;
  
  
  Abuse do CSS
&lt;/h3&gt;

&lt;p&gt;Evite utilizar imagens desnecessárias para efeitos em sua pagina. O CSS hoje já possui recursos de sobra para adicionar efeitos como, sombras, gradientes e bordas. Utilizar o css ao invés de imagens estáticas vai ser muito mais leve e benéfico para o desempenho de sua aplicação.&lt;/p&gt;
&lt;h2&gt;
  
  
  Arquivos JavaScript
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Minifique o JavaScript
&lt;/h3&gt;

&lt;p&gt;Assim como o CSS é importante minificar os arquivos &lt;code&gt;*.js&lt;/code&gt;, assim os espaços, comentários e quebras de linha desnecessárias serão removidos, reduzindo o tamanho desses arquivos e melhora o tempo de carregamento.&lt;/p&gt;
&lt;h3&gt;
  
  
  Evite bloqueios causados por JavaScript
&lt;/h3&gt;

&lt;p&gt;O JavaScript bloqueia a análise sintática normal do documento HTML, então quando o analisador alcança uma tag &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; (particularmente dentro do &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;), ele para e executa o script antes de continuar. Para evitar esse tipo de situação utilize atributos como o &lt;code&gt;async&lt;/code&gt; ou &lt;code&gt;defer&lt;/code&gt; para evitar os bloqueios desnecessários. Caso seu script não seja necessário dentro do &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, carregue os scripts no final do &lt;code&gt;body&lt;/code&gt;, sendo assim outra precaução para evitar os bloqueios. Mas é uma boa prática sempre usar esses atributos para evitar qualquer problema de desempenho.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplos:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;defer&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dicas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;async&lt;/code&gt; quando o script não depender de outros.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;defer&lt;/code&gt; quando houver dependências entre scripts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Otimização de Imagens
&lt;/h2&gt;

&lt;p&gt;Imagens podem ser uma das coisas que mais afetam negativamente o desempenho se não forem otimizadas corretamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Utilize o formato adequado
&lt;/h3&gt;

&lt;p&gt;Evite utilizar imagens &lt;strong&gt;JPEG&lt;/strong&gt;, &lt;strong&gt;PNG&lt;/strong&gt; e principalmente formatos como &lt;strong&gt;Base64&lt;/strong&gt;, priorize o formato &lt;strong&gt;WebP&lt;/strong&gt;, que é moderno e oferece compressão superior ao JPEG e PNG sem perder qualidade. Imagens vetoriais (SVG) também é um excelente formato, perfeito para ícones, logos e gráficos vetoriais.&lt;br&gt;
Ferramentas como o &lt;a href="https://developers.google.com/web/tools/lighthouse/" rel="noopener noreferrer"&gt;Lighthouse&lt;/a&gt; ajudam a identificar imagens que podem ser convertidas para formatos mais eficientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comprima suas Imagens
&lt;/h3&gt;

&lt;p&gt;Como nem sempre imagem WebP vão ser opções viáveis para sua aplicação você pode optar por comprimir suas imagens ao invés de alterar o formato.&lt;br&gt;
Imagens comprimidas carregam mais rápido e consomem menos dados. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dicas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valide o tamanho e formato da imagem para o usuário não fazer upload de imagens muito grandes ou de formatos incompatíveis, (“Acredite se quiser, mas sempre vai ter um usuário desavisado tentando fazer o upload de um PSD”).&lt;/li&gt;
&lt;li&gt;Utilize uma ferramenta de compressão, antes de enviar a imagem para o servidor ao qual ela vai ficar armazenada.&lt;/li&gt;
&lt;li&gt;Defina um nível de compressão abaixo de &lt;strong&gt;85%&lt;/strong&gt; para manter um equilíbrio entre qualidade e tamanho.&lt;/li&gt;
&lt;li&gt;Para comprimir imagens utilize ferramentas como &lt;a href="https://tinypng.com/" rel="noopener noreferrer"&gt;TinyPNG&lt;/a&gt; ou  &lt;a href="https://imageoptim.com/" rel="noopener noreferrer"&gt;ImageOptim&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Utilize CDN
&lt;/h2&gt;

&lt;p&gt;Atualmente uma página web minimamente otimizada já faz a utilização de uma &lt;strong&gt;CDN (Content Delivery Network)&lt;/strong&gt;, sendo utilizada para armazenar arquivos estáticos, como imagens, CSS, JavaScript e vídeos.&lt;/p&gt;

&lt;p&gt;O objetivo ao utilizar uma CDN é reduzir a distância física entre o servidor e o usuário final, permitindo um carregamento mais rápido do conteúdo. Caso queira saber um pouco mais, a Cloudflare possui um excelente &lt;a href="https://www.cloudflare.com/pt-br/learning/cdn/what-is-a-cdn" rel="noopener noreferrer"&gt;artigo sobre CDN&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflexões
&lt;/h2&gt;

&lt;p&gt;Na rotina de um desenvolvedor é muito comum precisar tomar decisões envolvidas por &lt;a href="https://app.uff.br/riuff/bitstream/handle/1/21720/Artigo_Karen.pdf?isAllowed=y&amp;amp;sequence=1" rel="noopener noreferrer"&gt;trade-offs&lt;/a&gt;, sabendo que ganhar em um aspecto pode significar perder em outro, ou seja, não existe uma solução perfeita para todos os problemas, nem sempre ter uma aplicação 100% otimizada vai ser o melhor; sempre há um custo envolvido, seja em termos de desempenho, escalabilidade, tempo de desenvolvimento ou facilidade de manutenção.&lt;br&gt;
Em resumo, ser um bom desenvolvedor vai além de apenas escrever um código eficiente, mas também incluem entender esses &lt;a href="https://app.uff.br/riuff/bitstream/handle/1/21720/Artigo_Karen.pdf?isAllowed=y&amp;amp;sequence=1" rel="noopener noreferrer"&gt;trade-offs&lt;/a&gt; e saber tomar melhores decisões, além de várias outras habilidades.&lt;/p&gt;

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

&lt;p&gt;Otimização e performance vai muito além das dicas deste artigo, no entanto, pequenas mudanças como compressão de imagens, minificação de código junto com a uso de CDN podem fazer uma grande diferença na velocidade e eficiência do seu site.&lt;br&gt;
Caso queira avaliar o desempenho do seu site, existem excelentes ferramentas como &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt; e &lt;a href="https://www.webpagetest.org/" rel="noopener noreferrer"&gt;WebPageTest&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://roadmap.sh/best-practices/frontend-performance" rel="noopener noreferrer"&gt;https://roadmap.sh/best-practices/frontend-performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://app.uff.br/riuff/bitstream/handle/1/21720/Artigo_Karen.pdf?isAllowed=y&amp;amp;sequence=1" rel="noopener noreferrer"&gt;https://app.uff.br/riuff/bitstream/handle/1/21720/Artigo_Karen.pdf?isAllowed=y&amp;amp;sequence=1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.empiricus.com.br/explica/trade-off/" rel="noopener noreferrer"&gt;https://www.empiricus.com.br/explica/trade-off/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/pt-br/learning/cdn/what-is-a-cdn/" rel="noopener noreferrer"&gt;https://www.cloudflare.com/pt-br/learning/cdn/what-is-a-cdn/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>performance</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Como as metodologias de desenvolvimento web SPA e SSR impactam o SEO</title>
      <dc:creator>RENATO ADORNO</dc:creator>
      <pubDate>Wed, 25 Jan 2023 00:03:27 +0000</pubDate>
      <link>https://dev.to/renatoadorno/como-as-metodologias-de-desenvolvimento-web-spa-e-ssr-impactam-o-seo-3p7g</link>
      <guid>https://dev.to/renatoadorno/como-as-metodologias-de-desenvolvimento-web-spa-e-ssr-impactam-o-seo-3p7g</guid>
      <description>&lt;h2&gt;
  
  
  O que é SEO?
&lt;/h2&gt;

&lt;p&gt;SEO (Search Engine Optimization) é o processo de otimizar um site para que ele seja melhor classificado nos mecanismos de busca, como o Google. Isso é feito através de uma série de técnicas, incluindo otimização de conteúdo, técnica e backlinks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Porque SEO é Importante?
&lt;/h2&gt;

&lt;p&gt;É importante porque a maioria das pessoas usa mecanismos de busca para encontrar informações na internet, e sites que aparecem nas primeiras páginas dos resultados de busca tendem a receber mais tráfego e, consequentemente, mais clientes potenciais. Além disso, sites bem ranqueados no Google tendem a ter mais confiança e autoridade em relação aos seus concorrentes. Portanto, o SEO é crucial para o sucesso de um site, pois ajuda a garantir que ele seja visto por um público maior e tenha mais chances de converter visitantes em clientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o SEO funciona?
&lt;/h2&gt;

&lt;p&gt;O Google usa uma combinação de algoritmos e tecnologias para rastrear, indexar e classificar sites na internet. A primeira etapa do processo é o rastreamento, onde o Google usa robôs chamados "spiders" para percorrer a web e encontrar novos sites e atualizações de sites existentes.&lt;/p&gt;

&lt;p&gt;Uma vez que o Google encontra um site, ele o indexa, ou adiciona à sua base de dados. A indexação é o processo pelo qual o Google analisa o conteúdo do site e o armazena em sua base de dados para que possa ser recuperado mais tarde quando alguém faz uma pesquisa.&lt;/p&gt;

&lt;p&gt;A classificação é a etapa final do processo, onde o Google usa seus algoritmos para determinar a relevância e importância de um site em relação a uma consulta de pesquisa específica. O algoritmo do Google leva em conta uma série de fatores, incluindo o conteúdo do site, a qualidade dos backlinks apontando para o site e a estrutura técnica do site.&lt;/p&gt;

&lt;p&gt;É importante notar que o algoritmo do Google é constantemente atualizado e aprimorado, e as técnicas e estratégias recomendadas para SEO também mudam ao longo do tempo. Portanto, é importante estar sempre atento às atualizações do algoritmo e fazer o possível para manter o seu site otimizado de acordo com as melhores práticas de SEO atuais.&lt;/p&gt;

&lt;h2&gt;
  
  
  O SEO funciona em uma aplicação SPA utilizando React ou outras tecnologias semelhantes?
&lt;/h2&gt;

&lt;p&gt;Durante muito tempo, o Google enfrentou dificuldades para acessar o conteúdo renderizado com Javascript e aconselhava que o conteúdo não pudesse ser visualizado sem habilitar o Javascript, já que muitos sites fornecem um documento vazio no HTML e deixam o Javascript cuidar do resto. Isso causou problemas para os desenvolvedores, uma vez que muitos sites estavam começando a utilizar cada vez mais Javascript para construir suas páginas e era necessario que os rastreadores tivessem a capacidade executar Javascript para rastrear e indexar o conteúdo.. Entretanto, essa situação mudou! Há alguns anos atrás, o Google anunciou que seu robô de rastreamento agora pode renderizar e indexar páginas com Javascript.&lt;/p&gt;

&lt;p&gt;O desenvolvimento da Web tem evoluído muito nos ultimos anos e os rastreadores precisam se manter atualizados para indexar todas as páginas existentes. Um artigo da &lt;a href="https://moz.com/blog/search-engines-ready-for-javascript-crawling" rel="noopener noreferrer"&gt;Moz&lt;/a&gt; de 2017 mostrou como os diferentes rastreadores de mecanismos de pesquisa lidavam com o javascript naquela época. No entanto, em 2020, é seguro assumir que todos eles estão melhorando nisso e que a maioria dos Single Page Applications (SPA's) estão sendo indexados corretamente.&lt;/p&gt;

&lt;p&gt;Na teoria significa que os desenvolvedores podem usar todas as vantagens do Javascript de bibliotecas como o React para construir suas páginas sem se preocupar com a indexação do Google, já que agora o Google pode rastreá-las e indexá-las corretamente. Isso  também significa que os desenvolvedores podem criar conteúdo mais rico e interativo sem se preocupar com a indexação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparando o desesempenho no SEO de aplicações SPA e SSR
&lt;/h2&gt;

&lt;p&gt;A principal desvantagem da &lt;strong&gt;Single-page application&lt;/strong&gt; (SPA) é que ela serve inicialmente um documento HTML vazio, o que força um rastreador a executar o Javascript antes de ver qualquer conteúdo. Já o Server-side Rendering (SSR) tem uma vantagem inicial, pois todo o conteúdo importante está disponível no primeiro HTML. &lt;/p&gt;

&lt;p&gt;A questão é: o quão grande é a vantagem inicial?&lt;/p&gt;

&lt;p&gt;Para tirar essas conclusoes e necesario a realização de testes já que não temos como saber como os diferentes crawlers realmente funcionam sob o capô, a única maneira de descobrir qual das duas metodologias para sites da Web é melhor é criar um experimento, e foi justamente o que esse &lt;a href="https://spa-blog.kroghweb.no/seo-in-2020-ssr-vs-spa" rel="noopener noreferrer"&gt;blog&lt;/a&gt; fez em 2020.&lt;/p&gt;

&lt;p&gt;De acordo com a experiencia retratada no &lt;a href="https://spa-blog.kroghweb.no/seo-in-2020-ssr-vs-spa" rel="noopener noreferrer"&gt;blog&lt;/a&gt; foi criado e publicado dois sites identicos, um SPA e outro SSR, resumindo o resultado depois de um mes foi o seguinte:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;SSR&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Total de impressões: 89&lt;/p&gt;

&lt;p&gt;Total de cliques:: 12&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;SPA&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Total de impressões: 1&lt;/p&gt;

&lt;p&gt;Total de cliques: 0&lt;/p&gt;

&lt;p&gt;Além disso, o site SSR está na primeira página (número 5) no Google . Enquanto isso, a versão do SPA não foi encontrada nas primeiras paginas no Google.&lt;/p&gt;

&lt;p&gt;A o resultado desse experimento é que ambas as aplicações foram indexados como o google promete porém em questoes de desempenho a aplicação SSR teve um desempenho muito melhor em relação a SPA. Ou seja se ao desenvolver uma aplicação  que tenha uma de suas prioridades o SEO é recomendo que utulize a metodologia SSR.&lt;/p&gt;

&lt;p&gt;Há alguns anos atrás o SSR era uma opção mais cara e mais difícil de escalar, por exigir muito do servidor, porem hoje conseguimos utilizar o Next.js para mitigar os problemas uma aplicação SSR e ter todo o conteúdo disponível no primeiro HTML e garantir um bom desempenho no SEO, e sem precisar deixar de lado o react já que o Nextjs é um *&lt;strong&gt;&lt;em&gt;Framework React.&lt;/em&gt;&lt;/strong&gt;*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://spa-blog.kroghweb.no/seo-in-2020-ssr-vs-spa" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; voce pode conferir a experiencia completa, ao qual foi minha principal fonte de referencia para este artigo.&lt;/p&gt;

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

&lt;p&gt;O Google cumpre o que promete porem as as aplicações SSR continuam desempenhando muito melhor sendo muito mais eficientes em relação a SPAs, pode ser que daqui alguns anos isso mude ou hoje em 2023 já tenha mudado, mas não consegui encontrar uma fonte segura que pudesse trazer um resultado diferente.&lt;/p&gt;

&lt;p&gt;Neste artigo abordei como essas duas diferentes metodologias de desenvolvimento e como impactam no desempenho do SEO, mas é claro que o SEO vai muito alem disso, pois é necessario a criação de conteúdo de qualidade, utilização de títulos e subtítulos, adição de imagens e vídeos, atualização regular do conteúdo, utilização de URLs amigáveis, otimização da estrutura e velocidade do site e obtenção de links de qualidade. Todas essas tecnicas também podem ajudar o muito o SEO do seu site.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ssr</category>
      <category>react</category>
    </item>
    <item>
      <title>Padrões de Commits (Commit Patterns)</title>
      <dc:creator>RENATO ADORNO</dc:creator>
      <pubDate>Sun, 06 Mar 2022 01:24:50 +0000</pubDate>
      <link>https://dev.to/renatoadorno/padroes-de-commits-commit-patterns-41co</link>
      <guid>https://dev.to/renatoadorno/padroes-de-commits-commit-patterns-41co</guid>
      <description>&lt;p&gt;A utilização do git no dia a dia dos Devs é essencial, seja para desenvolver projetos pessoais ou empresariais, todo código que será desenvolvido ou consumido por mais de uma pessoa, eventualmente será utilizado o git.&lt;/p&gt;

&lt;p&gt;Portanto, é de muita importância que todos os envolvidos no projeto entendam as mudanças ocorridas e quais foram os contextos de alteração do código. Para isso o &lt;code&gt;git commit&lt;/code&gt; precisa ser utilizado apropriadamente.&lt;/p&gt;

&lt;p&gt;Commits mal comentados podem ser muito danosos ao projeto, uma vez que não conseguimos entender a natureza das mudanças ocorridas e o contexto que se aplica, diante disso existe o &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o Conventional Commits ?
&lt;/h2&gt;

&lt;p&gt;O Conventional Commits é uma convenção simples de mensagens de commit, que segue um conjunto de regras e que ajuda os projetos a terem um histórico de commit explícito e bem estruturado.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Conventional Commits&lt;/strong&gt; deixara a linha do tempo de um projeto mais estruturada e fácil de entender. Quando documentados utilizando o &lt;strong&gt;Conventional Commits&lt;/strong&gt; nos mostram quem alterou, quando, em qual contexto e qual tipo de alteração foi feita.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como utilizar ?
&lt;/h2&gt;

&lt;p&gt;A mensagem do commit deve ser estruturada da seguinte forma:&lt;/p&gt;

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

:emoji: &amp;lt;tipo&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;escopo&lt;span class="o"&gt;)&lt;/span&gt;: &amp;lt;descrição&amp;gt;


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

&lt;/div&gt;

&lt;p&gt;Os commits terão um emoji para dar uma identificação visual a mensagem, um tipo, um escopo para dar contexto, e uma descrição onde poderá colocar os detalhes do commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS:&lt;/strong&gt; O emoji e o escopo são opcionais, porém é recomendado que siga o escopo a cima.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tipos de Commits
&lt;/h2&gt;

&lt;p&gt;O commit possui os elementos estruturais abaixo (tipos), que informam a intenção do seu commit ao utilizador(a) de seu código.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;fix&lt;/code&gt; - Commits do tipo fix indicam que seu trecho de código commitado está solucionando um problema (bug fix), (se relaciona com o PATCH do versionamento semântico).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;feat&lt;/code&gt;- Commits do tipo feat indicam que seu trecho de código está incluindo um novo recurso (se relaciona com o MINOR do versionamento semântico).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docs&lt;/code&gt; - Commits do tipo docs indicam que houveram mudanças na documentação, como por exemplo no Readme do seu repositório. (Não inclui alterações em código).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;style&lt;/code&gt; - Commits do tipo style indicam que houveram alterações referentes a formatações de código, semicolons, trailing spaces, lint... (Não inclui alterações em código).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;refactor&lt;/code&gt; - Commits do tipo refactor referem-se a mudanças devido a refatorações que não alterem sua funcionalidade, como por exemplo, uma alteração no formato como é processada determinada parte da tela, mas que manteve a mesma funcionalidade, ou melhorias de performance devido a um code review.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;build&lt;/code&gt; - Commits do tipo build são utilizados quando são realizadas modificações em arquivos de build e dependências.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;test&lt;/code&gt; - Commits do tipo test são utilizados quando são realizadas alterações em testes, seja criando, alterando ou excluindo testes unitários. (Não inclui alterações em código)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;chore&lt;/code&gt; - Commits do tipo chore indicam atualizações de tarefas de build, configurações de administrador, pacotes... como por exemplo adicionar um pacote no gitignore. (Não inclui alterações em código)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Emojis
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Tipo de commit&lt;/th&gt;
      &lt;th&gt;Emojis&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
 &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Commit inicial&lt;/td&gt;
      &lt;td&gt; 🎉 &lt;code&gt;:tada:&lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; Tag de versão  &lt;/td&gt;
      &lt;td&gt; 🔖 &lt;code&gt;:bookmark:&lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Novo recurso   &lt;/td&gt;
      &lt;td&gt; ✨ &lt;code&gt;:sparkles:&lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Lista de ideias (tasks)    &lt;/td&gt;
      &lt;td&gt; 🔜 &lt;code&gt; :soon: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Bugfix  &lt;/td&gt;
      &lt;td&gt; 🐛 &lt;code&gt;:bug:&lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Documentação  &lt;/td&gt;
      &lt;td&gt; 📚 &lt;code&gt;:books:&lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Testes  &lt;/td&gt;
      &lt;td&gt; 🧪 &lt;code&gt;:test_tube: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Adicionando um teste&lt;/td&gt;
      &lt;td&gt; ✅ &lt;code&gt; :white_check_mark: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; Teste de aprovação &lt;/td&gt;
      &lt;td&gt; ✔️ &lt;code&gt; :heavy_check_mark: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Acessibilidade    &lt;/td&gt;
      &lt;td&gt; ♿ &lt;code&gt; :wheelchair: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Texto     &lt;/td&gt;
      &lt;td&gt; 📝 &lt;code&gt; :pencil: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Package.json em JS      &lt;/td&gt;
      &lt;td&gt; 📦 &lt;code&gt; :package: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;  Em progresso        &lt;/td&gt;
      &lt;td&gt; 🚧 &lt;code&gt; :construction: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;   Arquivos de configuração        &lt;/td&gt;
      &lt;td&gt; 🔧 &lt;code&gt; :wrench: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;   Removendo uma dependência        &lt;/td&gt;
      &lt;td&gt; ➖ &lt;code&gt; :heavy_minus_sign: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;   Adicionando uma dependência        &lt;/td&gt;
      &lt;td&gt; ➕ &lt;code&gt; :heavy_plus_sign: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;   Revertendo mudanças         &lt;/td&gt;
      &lt;td&gt; 💥 &lt;code&gt; :boom: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;   Alterações de revisão de código        &lt;/td&gt;
      &lt;td&gt; 👌 &lt;code&gt; :ok_hand: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
   &lt;tr&gt;
      &lt;td&gt;   Refatoração        &lt;/td&gt;
      &lt;td&gt; ♻️ &lt;code&gt; :recycle: &lt;/code&gt;   &lt;/td&gt;
   &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;   Mover/Renomear        &lt;/td&gt;
      &lt;td&gt; 🚚 &lt;code&gt; :truck: &lt;/code&gt;   &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Exemplos de utilização
&lt;/h2&gt;

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

&lt;p&gt;Com os 4 commits a cima teremos o seguinte histórico:&lt;/p&gt;

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




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

&lt;p&gt;Algumas partes deste artigo como por exemplo o uso de emojis é uma particularidade minha não necessariamente é o mais certo a se fazer, muitas empresas usam padrões de commits diferentes. O importante é se atentar ao escrever a mensagem de um commit, para que outros entendam e fique bem claro oque foi alterado ou criado.&lt;/p&gt;




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

&lt;p&gt;Escrevi este artigo no intuito de ajudar os Devs iniciantes como eu, e também registrar mais um dos meus aprendizados nesta longa caminhada de estudos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obrigado a todos que leram até aqui!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;p&gt;O uso dos emojis foi uma ideia que tirei deste repositório &lt;a href="https://github.com/iuricode/padroes-de-commits/blob/main/README.md" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Manipulando containers Docker</title>
      <dc:creator>RENATO ADORNO</dc:creator>
      <pubDate>Tue, 15 Feb 2022 15:51:22 +0000</pubDate>
      <link>https://dev.to/renatoadorno/principais-comandos-docker-3b0b</link>
      <guid>https://dev.to/renatoadorno/principais-comandos-docker-3b0b</guid>
      <description>&lt;p&gt;Neste artigo vou abordar o que eu aprendi sobre Containers Docker, de uma forma pratica.&lt;br&gt;
Para utilização do Docker é necessário conhecer alguns comandos e entender de forma clara e direta para que servem, assim como alguns exemplos de uso.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como executar um container
&lt;/h2&gt;

&lt;p&gt;Para iniciar um container é necessário saber a partir de qual imagem será executado. Para listar as imagens que seu Docker host tem localmente, execute o comando abaixo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção:&lt;/strong&gt; se a imagem não estiver em sua maquina local, o Docker irá baixar automaticamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container run &amp;lt;parâmetros&amp;gt; &amp;lt;imagem:tag&amp;gt; &amp;lt;CMD&amp;gt; &amp;lt;argumentos&amp;gt;
&lt;span class="c"&gt;#ou&lt;/span&gt;
docker run &amp;lt;parâmetros&amp;gt; &amp;lt;imagem&amp;gt; &amp;lt;CMD&amp;gt; &amp;lt;argumentos&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os parâmetros mais utilizados na execução de containers são:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parâmetro&lt;/th&gt;
&lt;th&gt;Explicação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-d&lt;/td&gt;
&lt;td&gt;Execução do container em background&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-i&lt;/td&gt;
&lt;td&gt;Modo interativo. Mantém o STDIN aberto mesmo sem console anexado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-t&lt;/td&gt;
&lt;td&gt;Aloca uma pseudo TTY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--rm&lt;/td&gt;
&lt;td&gt;Remove automaticamente o container após finalização, pode ser chamado de modo &lt;strong&gt;cleanup&lt;/strong&gt; (Não funciona com -d)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--name&lt;/td&gt;
&lt;td&gt;Nomear o container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-v&lt;/td&gt;
&lt;td&gt;Mapeamento de volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-p&lt;/td&gt;
&lt;td&gt;Mapeamento de porta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-m&lt;/td&gt;
&lt;td&gt;Limitar o uso de memória RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-c&lt;/td&gt;
&lt;td&gt;Balancear o uso de CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Segue um exemplo simples do seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; meu_python python bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De acordo com o comando acima, será iniciado um container com o nome meu_python, criado a partir da imagem python e o processo executado nesse container será o bash.&lt;/p&gt;

&lt;p&gt;Vale lembrar que, caso o CMD não seja especificado no comando docker container run, é utilizado o valor padrão definido no Dockerfile da imagem utilizada. No nosso caso é python e seu comando padrão executa o binário python, ou seja, se não fosse especificado o bash, no final do comando de exemplo acima, ao invés de um shell bash do GNU/Linux, seria exibido um shell do python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como renomear um container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker rename CONTAINER NEW_NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como listar containers
&lt;/h2&gt;

&lt;p&gt;Esse comando é responsável por mostrar todos os containers, mesmo aqueles não mais em execução.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container &lt;span class="nb"&gt;ls&lt;/span&gt; &amp;lt;parâmetros&amp;gt;
&lt;span class="c"&gt;#ou &lt;/span&gt;
docker ps 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parâmetro&lt;/th&gt;
&lt;th&gt;Explicação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-a&lt;/td&gt;
&lt;td&gt;Lista todos os containers, inclusive os desligados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-l&lt;/td&gt;
&lt;td&gt;Lista os últimos containers, inclusive os desligados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-n&lt;/td&gt;
&lt;td&gt;Lista os últimos N containers, inclusive os desligados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-q&lt;/td&gt;
&lt;td&gt;Lista apenas os ids dos containers, ótimo para utilização em scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Gerenciar containers
&lt;/h3&gt;

&lt;p&gt;Para iniciar, reiniciar, pausar, resumir e parar um container execute o comando abaixo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container &amp;lt;COMANDO&amp;gt; &amp;lt;CONTAINER ID &lt;span class="o"&gt;||&lt;/span&gt; NAME&amp;gt;
&lt;span class="c"&gt;#ou  &lt;/span&gt;
docker &amp;lt;COMANDO&amp;gt; &amp;lt;CONTAINER ID &lt;span class="o"&gt;||&lt;/span&gt; NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comandos&lt;/th&gt;
&lt;th&gt;Explicação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;restart&lt;/td&gt;
&lt;td&gt;Reinicia um container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pause&lt;/td&gt;
&lt;td&gt;Pausa a execução do container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unpause&lt;/td&gt;
&lt;td&gt;Tira o container do modo pausa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stop&lt;/td&gt;
&lt;td&gt;Encerra a execução do container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rm&lt;/td&gt;
&lt;td&gt;Apaga um container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rm -f&lt;/td&gt;
&lt;td&gt;Apaga um container ativo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Como retomar o acesso a um container interativo rodando em segundo plano
&lt;/h2&gt;

&lt;p&gt;Entrar no modo interativo com container ativo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container attach &amp;lt;CONTAINER ID &lt;span class="o"&gt;||&lt;/span&gt; NAMES&amp;gt;
&lt;span class="c"&gt;#ou  &lt;/span&gt;
docker attach &amp;lt;CONTAINER ID &lt;span class="o"&gt;||&lt;/span&gt; NAMES&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para sair do modo interativo, digite &lt;code&gt;exit&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para sair do container mas mante-lo em execução tecle &lt;code&gt;ctrl + pq&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como apagar containers que não estão sendo utilizados
&lt;/h2&gt;

&lt;p&gt;Remove todos os containers inativos do seu computador&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vale ressaltar que a ideia dos &lt;strong&gt;containers&lt;/strong&gt; é a de &lt;strong&gt;serem descartáveis&lt;/strong&gt;. Caso você use o mesmo container por muito tempo sem descartá-lo, provavelmente está usando o Docker incorretamente. O Docker não é uma máquina, é um processo em execução. E, como todo processo, deve ser descartado para que outro possa tomar seu lugar na reinicialização do mesmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como motirar os processos dentro de um container
&lt;/h2&gt;

&lt;p&gt;O comando &lt;code&gt;top&lt;/code&gt;, assim como nos terminais linux, traz as informações sobre os processos que estão sendo rodados, mas dentro do container, o que não inclui, por exemplo, serviços que são compartilhados com o sistema hospedeiro. Ele é útil para quando estamos rodando containers em segundo plano&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container top &amp;lt;CONTAINER ID &lt;span class="o"&gt;||&lt;/span&gt; NAMES&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Dica para monitorar containers
&lt;/h2&gt;

&lt;p&gt;Instale o &lt;strong&gt;&lt;a href="https://ctop.sh/" rel="noopener noreferrer"&gt;ctop&lt;/a&gt;&lt;/strong&gt; para monitorar e manipular todos os containers em sua maquina&lt;/p&gt;

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

&lt;p&gt;Para utilizar basta digitar &lt;code&gt;ctop&lt;/code&gt; em seu terminal.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>docker</category>
    </item>
    <item>
      <title>Introdução ao Docker</title>
      <dc:creator>RENATO ADORNO</dc:creator>
      <pubDate>Mon, 14 Feb 2022 15:46:28 +0000</pubDate>
      <link>https://dev.to/renatoadorno/introducao-a-containers-docker-1hlk</link>
      <guid>https://dev.to/renatoadorno/introducao-a-containers-docker-1hlk</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Docker
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; é uma empresa de conteinerização que permite a criação e uso de &lt;strong&gt;containers Linux&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com o &lt;strong&gt;Docker&lt;/strong&gt;, você pode tratar containers como máquinas virtuais modulares extremamente leves. Além de obter flexibilidade com esses containers, você pode criar, implantar, copiar e movê-los de um ambiente para outro, o que ajuda a otimizar seus aplicativos para a nuvem.&lt;/p&gt;

&lt;p&gt;Em poucas palavras, o Docker é um programa de computador, uma ferramenta de linha de comando, uma plataforma de conteinerização, um produto e uma empresa.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Containers
&lt;/h2&gt;

&lt;p&gt;Containers são uma forma de virtualização a nível de sistema operacional que permite rodar múltiplos sistema isolados em um único sistema operacional&lt;/p&gt;

&lt;p&gt;Uma virtualização comum, como por exemplo o VMware, é muito pesada e não performática.&lt;/p&gt;

&lt;p&gt;Container não é como uma virtualização comum, a diferença principal, é que os containers conseguem compartilhar o mesmo kernel do sistema operacional, sendo assim muito mais performático.&lt;/p&gt;

&lt;p&gt;Outra diferença de uma virtualização comum, é que, um container não deve ser utilizado para abrigar várias aplicações, e é justamente por isso que ele ocupa muito menos espaço que uma VM. Sua tendência é de manter somente o essencial no seu conteúdo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Imagens Docker
&lt;/h2&gt;

&lt;p&gt;A imagem do Docker é aquela que vem com o código e pode ser executada em qualquer plataforma onde o Docker Engine esteja instalado.&lt;br&gt;
Vamos dar um exemplo: Pense que um desenvolvedor escreve código e então ele empacota todo o código, dependências, instaláveis ​​etc em um arquivo chamado Dockerfile e cria uma imagem a partir dele. Agora esta imagem se for dada a qualquer desenvolvedor em qualquer plataforma será executada no Docker Engine como um container. As imagens do Docker são o núcleo de todo o Docker como plataforma. O Docker Image segue uma arquitetura em camadas que ajuda a imagem ser construída mais rapidamente.&lt;/p&gt;

&lt;p&gt;Imagens podem se referir a praticamente qualquer tipo de container. Um exemplo disso é pensar o próprio sistema operacional Ubuntu, que possui &lt;a href="https://hub.docker.com/_/ubuntu" rel="noopener noreferrer"&gt;uma imagem oficial no Docker Hub&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://hub.docker.com/" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt; é o principal repositório de imagens &lt;em&gt;Docker&lt;/em&gt; atualmente. Nele, possuímos o que é chamado de &lt;a href="https://docs.docker.com/registry/introduction/" rel="noopener noreferrer"&gt;Registro&lt;/a&gt; &lt;em&gt;(Registry)&lt;/em&gt; *, onde requisitamos essas imagens.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;O Registry é um sistema de armazenamento e entrega, no qual podemos ter um usuário com nossas próprias imagens. Algo que lembra muito o GitHub, já que podemos dar pull nessas imagens para uso posterior.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Fluxo entre Containers e Imagens
&lt;/h2&gt;

&lt;p&gt;Para explicar melhor a dinâmica entre &lt;strong&gt;containers e imagens&lt;/strong&gt;, falaremos um pouco de como funciona o fluxo padrão do &lt;em&gt;Docker&lt;/em&gt; :&lt;/p&gt;

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

&lt;h5&gt;
  
  
  Fluxo padrão do Docker
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Tudo começa em um arquivo chamado &lt;code&gt;Dockerfile&lt;/code&gt; . Este arquivo possui as instruções* necessárias para que possamos gerar uma imagem;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Aqui vão instruções de qual sistema operacional usar, tal como quais comandos devem ser executados quando a imagem for rodada em um container .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Após isso, podemos dar &lt;code&gt;push&lt;/code&gt; ou &lt;code&gt;pull&lt;/code&gt; &lt;em&gt;(como em um repositório do GitHub)&lt;/em&gt; em uma imagem no &lt;code&gt;Registry&lt;/code&gt; *;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Você pode dar pull na sua própria imagem (caso tenha dado &lt;code&gt;push&lt;/code&gt; nela) ou em outra a sua escolha.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Registro mais comum é o &lt;code&gt;Docker Hub&lt;/code&gt; , mas temos outros exemplos, como mostrado na imagem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Por último, rodamos a imagem em um &lt;code&gt;container&lt;/code&gt; , &lt;em&gt;utilizando o comando &lt;code&gt;run&lt;/code&gt; .&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Após isso, temos que dizer pro container o que deve acontecer, se ele deve se manter ativo ou não, caso o contrário, o container é encerrado. O que faz parte de seu ciclo de vida.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Como instalar o Docker
&lt;/h2&gt;

&lt;p&gt;Siga os links do tutorial direto da documentação oficial do Docker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.docker.com/engine/install/debian/" rel="noopener noreferrer"&gt;&lt;strong&gt;Debian&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.docker.com/engine/install/fedora/" rel="noopener noreferrer"&gt;&lt;strong&gt;Fedora&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.docker.com/desktop/mac/install/" rel="noopener noreferrer"&gt;&lt;strong&gt;MacOS&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.docker.com/desktop/windows/install//" rel="noopener noreferrer"&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>docker</category>
    </item>
    <item>
      <title>Como configurar e instalar o GitHub CLI.</title>
      <dc:creator>RENATO ADORNO</dc:creator>
      <pubDate>Wed, 22 Sep 2021 21:44:49 +0000</pubDate>
      <link>https://dev.to/renatoadorno/como-configurar-e-instalar-o-github-cli-3j4c</link>
      <guid>https://dev.to/renatoadorno/como-configurar-e-instalar-o-github-cli-3j4c</guid>
      <description>&lt;h3&gt;
  
  
  Siga os passos a seguir:
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Passo 1:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Primeiro iremos instalar o &lt;code&gt;gh&lt;/code&gt; de acordo com seu sistema operacional.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Distribuições Linux
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Debian, Ubuntu Linux, Raspberry Pi OS (apt)
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cli.github.com/packages/githubcli-archive-keyring.gpg | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/githubcli-archive-keyring.gpg
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/github-cli.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Fedora, CentOS, Red Hat Enterprise Linux (dnf)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf config-manager &lt;span class="nt"&gt;--add-repo&lt;/span&gt; https://cli.github.com/packages/rpm/gh-cli.repo
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;openSUSE/SUSE Linux (zypper)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo zypper addrepo https://cli.github.com/packages/rpm/gh-cli.repo
sudo zypper ref
sudo zypper install gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;zypper ref
&lt;span class="nb"&gt;sudo &lt;/span&gt;zypper update gh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mac OS
&lt;/h2&gt;

&lt;p&gt;GitHub CLI está disponível via &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; , &lt;a href="https://www.macports.org/"&gt;MacPorts&lt;/a&gt; e &lt;a href="https://docs.conda.io/en/latest/"&gt;Conda&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Homebrew&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew install gh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atualizar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew upgrade gh&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;MacPorts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo port install gh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atualizar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo port selfupdate &amp;amp;&amp;amp; sudo port upgrade gh&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conda&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;conda install gh --channel conda-forge&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atualizar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;conda update gh --channel conda-forge&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Windows
&lt;/h2&gt;

&lt;p&gt;GitHub CLI está disponível via &lt;a href="https://github.com/microsoft/winget-cli"&gt;WinGet&lt;/a&gt; , &lt;a href="https://scoop.sh/"&gt;scoop&lt;/a&gt; e &lt;a href="https://chocolatey.org/"&gt;Chocolatey&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Chocolatey&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;choco install gh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atualizar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;choco upgrade gh&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  scoop
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scoop install gh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atualizar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scoop update gh&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;WinGet&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instalar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;winget install GitHub.cli&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atualizar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;winget upgrade GitHub.cli&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 2:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Depois de ter instalado o &lt;code&gt;gh&lt;/code&gt; corretamente,&lt;/strong&gt; &lt;strong&gt;agora iremos configurar para começar a utilização.&lt;/strong&gt; &lt;/p&gt;

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

&lt;p&gt;Primeiro execute &lt;code&gt;gh auth login&lt;/code&gt; para autenticar com sua conta GitHub.&lt;/p&gt;

&lt;p&gt;Logo depois de um &lt;strong&gt;ENTER&lt;/strong&gt; e você será solicitado a autenticar usando seu &lt;strong&gt;navegador&lt;/strong&gt; ou colar um &lt;strong&gt;token.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurando um editor para o &lt;code&gt;gh&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Para definir seu editor preferido, você pode usar em seu terminal &lt;code&gt;gh config set editor nome_do_editor&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se você não definir o editor, para macOS e Linux, o &lt;code&gt;gh&lt;/code&gt;respeitará &lt;a href="https://cli.github.com/manual/gh_help_environment"&gt;as variáveis de ambiente do&lt;/a&gt; editor com base em seu &lt;a href="https://github.com/rbenv/rbenv/wiki/unix-shell-initialization#shell-init-files"&gt;sistema operacional e configuração de shell&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;No macOS e no Linux, o editor padrão é o Nano. No Windows, o editor padrão é o Bloco de notas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/cli/cli/blob/trunk/docs/install_linux.md"&gt;https://github.com/cli/cli/blob/trunk/docs/install_linux.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cli/cli#installation"&gt;https://github.com/cli/cli#installation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cli.github.com/manual/gh_gist_create"&gt;https://cli.github.com/manual/gh_gist_create&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>bash</category>
      <category>git</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
