<?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[ Marcelo Pena - 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[ Marcelo Pena - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 03 Jun 2026 21:23:52 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/marcelo-pena/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Python para finanças – tutorial de negociação algorítmica para iniciantes ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Harshit Tyagi [https://www.freecodecamp.org/news/author/harshit/] A tecnologia se tornou um ativo nas finanças. As instituições financeiras estão agora evoluindo para empresas de tecnologia, em vez de se concentrarem apenas nos aspectos financeiros do setor.  Os algoritmos matemáticos trazem inovação e rapidez. Eles podem nos ajudar a obter uma vantagem ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/python-para-financas-tutorial-de-negociacao-algoritmica-para-iniciantes/</link>
                <guid isPermaLink="false">6659ba76e669e903cefde4a2</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcelo Pena ]]>
                </dc:creator>
                <pubDate>Tue, 25 Jun 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/image-27.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/algorithmic-trading-in-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python for Finance – Algorithmic Trading Tutorial for Beginners</a>
      </p><p>Escrito por: <a href="https://www.freecodecamp.org/news/author/harshit/">Harshit Tyagi</a></p><p>A tecnologia se tornou um ativo nas finanças. As instituições financeiras estão agora evoluindo para empresas de tecnologia, em vez de se concentrarem apenas nos aspectos financeiros do setor. </p><p>Os algoritmos matemáticos trazem inovação e rapidez. Eles podem nos ajudar a obter uma vantagem competitiva no mercado. </p><p>A velocidade e a frequência das transações financeiras, juntamente com os grandes volumes de dados, têm atraído muita atenção para a tecnologia por parte de todas as grandes instituições financeiras.</p><p>A negociação algorítmica ou quantitativa é o processo de concepção e desenvolvimento de estratégias de negociação com base em análises matemáticas e estatísticas. É uma área extremamente sofisticada das finanças.</p><p>Este tutorial serve como um guia para iniciantes em negociação quantitativa com Python. Você achará este artigo muito útil se for:</p><ol><li>Um estudante ou alguém que aspira a se tornar um analista quantitativo (quant) em um fundo ou banco.</li><li>Alguém que planeja iniciar seu próprio negócio de negociação quantitativa.</li></ol><p>Neste artigo, abordaremos os seguintes tópicos:</p><ul><li>Princípios básicos de ações e negociação</li><li>Extração de dados da API da Quandl</li><li>Análise exploratória de dados sobre preços de ações</li><li>Médias móveis</li><li>Formulação de uma estratégia de negociação com Python</li><li>Visualização do desempenho da estratégia</li></ul><p>Antes de mergulharmos nos detalhes e na dinâmica dos dados de preços de ações, primeiro precisamos entender os princípios básicos das finanças. Se você já está familiarizado com finanças e com a maneira como as negociações funcionam, pode pular esta seção e passar para a próxima.</p><h2 id="o-que-s-o-a-es-o-que-a-negocia-o-de-a-es"><strong>O que são ações<strong>? </strong>O que é a negociação de ações<strong>?</strong></strong></h2><h3 id="a-es"><strong>Ações</strong></h3><p>Uma ação é a representação de uma participação na propriedade de uma corporação, emitida por um determinado valor. É um tipo de título financeiro que estabelece sua reivindicação sobre os ativos e o desempenho de uma empresa.</p><p>Uma organização ou empresa emite ações para arrecadar mais fundos/capital com o objetivo de expandir e se envolver em mais projetos. Essas ações ficam então disponíveis ao público e são compradas e vendidas.</p><h3 id="negocia-o-de-a-es-e-estrat-gia-de-negocia-o">Negociação de ações e estratégia de negociação</h3><p>O processo de compra e venda de ações existentes e previamente emitidas é chamado de negociação de ações. Existe um preço pelo qual uma ação pode ser comprada e vendida. Esse preço continua a flutuar dependendo da demanda e da oferta no mercado de ações.</p><p>Dependendo do desempenho e das medidas tomadas pela empresa, os preços das ações podem subir ou descer, mas o movimento do preço das ações não se limita ao desempenho da empresa.</p><p>Os negociadores pagam dinheiro em troca de participação na empresa, esperando fazer negociações lucrativas e vender as ações a um preço mais alto.</p><p>Outra técnica importante que os negociadores seguem é a venda a descoberto. Isso envolve pegar emprestado ações e vendê-las imediatamente, na esperança de comprá-las posteriormente a um preço mais baixo, devolvê-las ao credor e obter a margem de lucro.</p><p>Assim, a maioria dos negociadores segue um plano e um modelo para negociar. Isso é conhecido como estratégia de negociação.</p><p>Negociadores quantitativos em fundos <em>hedge</em> e bancos de investimento projetam e desenvolvem essas estratégias de negociação e estruturas para testá-las. Isso requer um profundo conhecimento em programação e compreensão das linguagens necessárias para construir sua própria estratégia.</p><p>Python é uma das linguagens de programação mais populares usadas, junto com C++, Java, R e MATLAB. Está sendo amplamente adotada em todas as áreas, especialmente em ciência de dados, devido à sua sintaxe fácil, grande comunidade e suporte de terceiros.</p><p>Você precisará estar familiarizado com Python e estatísticas para aproveitar ao máximo este tutorial. Certifique-se de revisar seus conhecimentos em Python e verificar os <a href="https://archive.org/details/FundamentalsOfMathematicalStatisticsGuptaKapoor/page/n9/mode/2up">fundamentos das estatísticas</a> (texto em inglês).</p><h2 id="extraindo-dados-da-api-da-quandl"><strong><strong>Extra</strong>indo dados da API da <strong>Quandl</strong></strong></h2><p>Para extrair dados de preços de ações, usaremos a <a href="https://docs.data.nasdaq.com/">API da Quandl</a>. Antes, porém, vamos configurar o ambiente de trabalho. Veja como:</p><ol><li>No seu terminal, crie um diretório para o projeto (nomeie-o como quiser):</li></ol><pre><code>mkdir &lt;nome_do_diretorio&gt;</code></pre><ol><li>Certifique-se de ter o <a href="https://www.python.org/downloads/">Python 3</a> e o <a href="https://pypi.org/project/virtualenv/">virtualenv</a> instalados em sua máquina.</li><li>Crie um virtualenv de Python 3 usando <code>virtualenv &lt;nome_do_env&gt;</code> e ative-o usando <code>source &lt;nome_do_env&gt;/bin/activate</code>.	</li><li>Agora, instale o Jupyter Notebook usando o pip, e digite <code>pip install jupyter-notebook</code> no terminal.</li><li>Da mesma maneira, instale os pacotes <code>pandas</code>, <code>quandl</code> e <code>numpy</code>.</li><li>Abra o seu <code>jupyter-notebook</code> pelo terminal</li></ol><p>Agora, o seu notebook deve estar rodando no localhost, como mostra a captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1-1.png" class="kg-image" alt="1-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/1-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1-1.png 800w" width="800" height="138" loading="lazy"></figure><p>Você pode criar seu primeiro notebook clicando no menu suspenso <code>New</code> (Novo) à direita. Certifique-se de ter criado uma conta na <a href="https://docs.quandl.com/">Quandl</a> (texto em inglês). Siga os passos mencionados <a href="https://docs.quandl.com/docs/python-installation">aqui</a> (texto em inglês) para criar sua chave de API.</p><p>Uma vez que você esteja pronto, vamos mergulhar de cabeça:</p><pre><code># importando os pacotes necessários</code></pre><pre><code>import pandas as pd
import quandl as q</code></pre><p>O Pandas será o pacote mais exaustivamente utilizado neste tutorial, pois faremos muitas manipulações de dados e plotagens. </p><p>Depois que os pacotes forem importados, faremos solicitações à API do Quandl usando o pacote Quandl:</p><pre><code># define a chave da API
q.ApiConfig.api_key = "&lt;API key&gt;"</code></pre><pre><code># envia uma solicitação GET para consultar os preços de fechamento diário das
# ações da Microsoft de 1º de janeiro de 2010 a 1º de janeiro de 2019

msft_data = q.get("EOD/MSFT", start_date="2010-01-01", end_date="2019-01-01")</code></pre><pre><code># visualizar as primieras 5 linhas dos dataframe

msft_data.head()</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/2-3.png" class="kg-image" alt="2-3" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/2-3.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/2-3.png 800w" width="800" height="170" loading="lazy"></figure><p>Aqui temos os dados de preços de fechamento diário das ações EOD (de <em>end of the day</em>, em inglês) da Microsoft dos últimos 9 anos. Tudo o que você precisava fazer era chamar o método <code>get</code> do pacote Quandl e fornecer o símbolo da ação, MSFT, e o período de tempo dos dados que você precisa. Isso foi realmente simples, não foi? Vamos avançar para entender e explorar esses dados mais a fundo.</p><h2 id="an-lise-explorat-ria-em-dados-de-pre-os-de-a-es"><strong>Análise exploratória em dados de preços de ações</strong></h2><p>Com os dados em mãos, a primeira coisa que devemos fazer é entender o que eles representam e que tipo de informação eles trazem.</p><p>Imprimindo as informações do DataFrame, podemos ver tudo que ele contém:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/3-1.png" class="kg-image" alt="3-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/3-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/3-1.png 800w" width="800" height="242" loading="lazy"></figure><p>Como visto na captura de tela acima, o DataFrame contém DatetimeIndex, o que significa que estamos lidando com dados de séries temporais.</p><p>Um índice pode ser considerado como uma estrutura de dados que nos ajuda a modificar ou referenciar os dados. Dados de séries temporais são uma sequência de registros instantâneos de preços tirados em intervalos de tempo consecutivos e igualmente espaçados.</p><p>Na negociação, os dados de preços de fechamento diário capturam o movimento de certos parâmetros sobre uma ação, como o preço da ação, ao longo de um período especificado de tempo, com pontos de dados registrados em intervalos regulares.</p><h3 id="terminologia-importante"><strong>Terminologia importante</strong></h3><p>Olhando para outras colunas, vamos tentar entender o que cada coluna representa:</p><ul><li>Open/Close  —  captura o preço de abertura/fechamento das ações</li><li>Adj_Open/Adj_Close — um preço de abertura/fechamento ajustado é o preço de uma ação em qualquer dia de negociação que foi revisado para incluir quaisquer distribuições de dividendos, desdobramentos de ações e outras ações corporativas que ocorreram a qualquer momento antes da abertura do dia seguinte.</li><li>Volume — registra o número de ações que estão sendo negociadas em qualquer dia de negociação.</li><li>High/Low — rastreia o preço mais alto e o mais baixo da ação durante um determinado dia de negociação.</li></ul><p>Essas são as colunas importantes nas quais vamos focar neste momento.</p><p>Podemos aprender sobre as estatísticas resumidas dos dados, que nos mostram o número de linhas, média, máximo, desvios padrão e assim por diante. Tente executar a seguinte linha de código na célula do IPython:</p><pre><code>msft_data.describe()</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/4-1.png" class="kg-image" alt="4-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/4-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/4-1.png 800w" width="800" height="229" loading="lazy"></figure><h3 id="resample-"><strong><strong>resample()</strong></strong></h3><p>O método <code>resample()</code> do Pandas é usado para facilitar o controle e a flexibilidade na conversão de frequência dos dados de séries temporais. Podemos especificar os intervalos de tempo para reamostrar (mudar a frequência de amostragem) os dados para mensal, trimestral ou anual, além de realizar a operação necessária sobre eles.</p><pre><code>msft_data.resample('M').mean()</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/5-1.png" class="kg-image" alt="5-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/5-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/5-1.png 800w" width="800" height="176" loading="lazy"></figure><p>Essa é uma maneira interessante de analisar o desempenho das ações em diferentes períodos de tempo.</p><h3 id="calculando-retornos">Calculando retornos</h3><p>O retorno financeiro é simplesmente o dinheiro ganho ou perdido em um investimento. Um retorno pode ser expressado nominalmente como a variação no valor de um investimento ao longo do tempo. Pode ser calculado como a porcentagem derivada da razão entre o lucro e o investimento.</p><p>Temos o <code>pct_change()</code> à nossa disposição para esse propósito. Aqui está como você pode calcular os retornos:</p><pre><code># Importa o pacote do numpy
import numpy as np</code></pre><pre><code># atribui 'Adj_Close' a 'daily_close'
daily_close = msft_data[['Adj_Close']]</code></pre><pre><code># retorna como variação em percentual
daily_return = daily_close.pct_change()</code></pre><pre><code># substitui valores NA por 0
daily_return.fillna(0, inplace=True)</code></pre><pre><code>print(daily_return)</code></pre><p>Isso imprimirá os retornos que a ação vem gerando diariamente. Multiplicando o número por 100, você obterá a mudança percentual.</p><p>A fórmula usada em <code>pct_change()</code> é:</p><p>Retorno = {(Preço em t) — (Preço em t-1)} / {Preço em t-1}</p><p>Agora, para calcular retornos mensais, tudo que precisa fazer é:</p><pre><code>mdata = msft_data.resample('M').apply(lambda x: x[-1])

monthly_return = mdata.pct_change()</code></pre><p>Após reamostrar os dados para meses (considerando apenas os dias úteis), podemos obter o último dia de negociação no mês usando a função <code>apply()</code>.</p><p><code>apply()</code> recebe uma função e a aplica a cada linha da série Pandas. A função <code>lambda</code> é uma função anônima em Python que pode ser definida sem um nome e só aceita expressões no seguinte formato:</p><pre><code>Lambda: espressão</code></pre><p>Por exemplo, <code>lambda x: x * 2</code> é uma função lambda. Aqui, x é o argumento e <code>x * 2</code> é a espressão avaliada e retornada.</p><h2 id="m-dias-m-veis-no-mercado-financeiro"><strong><strong>Mé</strong>dias móveis no mercado financeiro</strong></h2><p>O conceito de médias móveis vai estabelecer a base para nossa estratégia de negociação baseada em <em>momentum</em>.</p><p>No campo financeiro, os analistas frequentemente têm que avaliar métricas estatísticas continuamente ao longo de uma janela de tempo móvel, o que é chamado de cálculos de janela móvel.</p><p>Vamos ver como podemos calcular a média móvel ao longo de uma janela de 50 dias e deslizar a janela por 1 dia.</p><h3 id="rolling-"><strong><strong>rolling()</strong></strong></h3><p>Esta é a função mágica que faz os truques para nós:</p><pre><code># atribuindo os preços de fechamento ajustados a
adj_pricesadj_price = msft_data['Adj_Close']</code></pre><pre><code># calcular a média móvel
mav = adj_price.rolling(window=50).mean()</code></pre><pre><code># imprime o result
print(mav[-10:])</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/6-1.png" class="kg-image" alt="6-1" width="485" height="223" loading="lazy"></figure><p>Você verá a média móvel em uma janela de 50 dias (aproximadamente 2 meses). As médias móveis ajudam a suavizar qualquer flutuação ou pico nos dados, proporcionando uma curva mais suave para o desempenho da empresa.</p><p>Podemos traçar um gráfico e ver a diferença:</p><pre><code># importa o pacote matplotlib para visualizar o gráfico
import matplotlib.pyplot as plt

adj_price.plot()</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/7-1.png" class="kg-image" alt="7-1" width="405" height="254" loading="lazy"></figure><p>Você pode traçar o gráfico da média móvel:</p><pre><code>mav.plot()</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/8-1.png" class="kg-image" alt="8-1" width="438" height="261" loading="lazy"></figure><p>Você também pode ver a diferença por si mesmo, como os picos nos dados são suavizados para fornecer uma ideia geral sobre o desempenho da ação.</p><h2 id="formulando-uma-estrat-gia-de-negocia-o"><strong><strong>Formula</strong>ndo uma estratégia de negociação</strong></h2><p>Aqui vem a parte final e mais interessante: desenhar e criar a estratégia de negociação. Este será um guia passo a passo para desenvolver uma estratégia de Cruzamento de Média Móvel Simples (<em>Simple Moving Average Crossover</em> - SMAC) baseada em <em>momentum</em>.</p><p>Estratégias baseadas em <em>momentum </em>são fundamentadas em um indicador técnico que capitaliza a continuidade da tendência do mercado. Compramos valores mobiliários que mostram uma tendência de alta e vendemos a descoberto valores mobiliários que mostram uma tendência de baixa.</p><p>A estratégia SMAC é uma estratégia de <em>momentum </em>bem conhecida. É uma estratégia apenas de compra. Aqui, o <em>momentum </em>é o retorno total da ação, incluindo os dividendos, nos últimos <em><strong>n</strong></em> meses. Esse período de <em><strong>n</strong></em> meses é chamado de período de observação. </p><p>Existem 3 principais tipos de períodos de observação: curto prazo, médio prazo e longo prazo. Precisamos definir 2 diferentes períodos de observação de uma série temporal específica. </p><p>Um sinal de compra é gerado quando a média móvel (ou média móvel simples) de período curto ultrapassa a média móvel de período longo. Um sinal de venda ocorre quando a média móvel de período curto cai abaixo da média móvel de período longo. </p><p>Agora, vamos ver como será o código para essa estratégia:</p><pre><code># passo 1: inicialize os períodos de observação curto e longo.

short_lb = 50
long_lb = 120</code></pre><pre><code># passo 2: Inicialize um novo DataFrame chamado signal_df 
#          com uma coluna de sinal.

signal_df = pd.DataFrame(index=msft_data.index)
signal_df['signal'] = 0.0</code></pre><pre><code># Passo 3: crie uma média móvel simples curta 
#          sobre o período de observação curto.

signal_df['short_mav'] = msft_data['Adj_Close'].rolling(window=short_lb,                                     min_periods=1, center=False).mean()</code></pre><pre><code># Passo 4: crie uma média móvel simples longa 
#          sobre o período de observação longo.

signal_df['long_mav'] = msft_data['Adj. Close'].rolling(window=long_lb, min_periods=1, center=False).mean()</code></pre><pre><code># Passo 5: gere os sinais com base na declaração condicional.

signal_df['signal'][short_lb:] = np.where(signal_df['short_mav'][short_lb:] &gt; signal_df['long_mav'][short_lb:], 1.0, 0.0)</code></pre><pre><code># Passo 6: crie as ordens de negociação com base na coluna de posições.

signal_df['positions'] = signal_df['signal'].diff()
signal_df[signal_df['positions'] == -1.0]</code></pre><p>Vamos ver o que está acontecendo aqui. Criamos 2 períodos de observação. O período de observação curto, <code>short_lb</code>, é de 50 dias, e o período de observação mais longo para a média móvel longa é definido como <code>long_lb</code> de 120 dias.</p><p>Criamos um DataFrame projetado para capturar os sinais. Esses sinais são gerados sempre que a média móvel curta cruza a média móvel longa usando <code>np.where</code>. Ele atribui <code>1.0</code> para verdadeiro e <code>0.0</code> se a condição for falsa.</p><p>As colunas <code>positions</code> no DataFrame nos informam se há um sinal de compra, um sinal de venda, ou se deve-se manter a posição. Basicamente, estamos calculando a diferença na coluna de sinais em relação à linha anterior usando <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.diff.html">diff</a>.</p><p>Lá, temos nossa estratégia implementada em apenas 6 passos usando o Pandas. Fácil, não é?</p><p>Agora, vamos tentar visualizar isso usando o Matplotlib. Tudo que precisamos fazer é inicializar um gráfico, adicionar os preços de fechamento ajustados, as médias móveis curtas e longas ao gráfico. Em seguida, fazemos o gráfico (<em>plot</em>) dos sinais de compra e venda usando a coluna de posições no <code>signal_df</code> acima:</p><pre><code># Inicialize o gráfico usando plt.
fig = plt.figure()</code></pre><pre><code># Adicione um subgráfico e rótulo para o eixo y.
plt1 = fig.add_subplot(111,  ylabel='Preço em $')</code></pre><pre><code>msft_data['Adj. Close'].plot(ax=plt1, color='r', lw=2.)</code></pre><pre><code># Plote as médias móveis de curto e longo prazo.
signal_df[['short_mav', 'long_mav']].plot(ax=plt1, lw=2., figsize=(12,8))</code></pre><pre><code># Plotando os sinais de venda.
plt1.plot(signal_df.loc[signal_df.positions == -1.0].index,
			signal_df.short_mav[signal_df.positions == -1.0],'v',
            	markersize=10, color='k')</code></pre><pre><code># Plotando os sinais de compra.
plt1.plot(signal_df.loc[signal_df.positions == 1.0].index,
			signal_df.short_mav[signal_df.positions == 1.0],
			'^',
          	markersize=10, color='m')</code></pre><p>Executando as células acima no Jupyter Notebook resultaria em um gráfico como o abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/image-2.png" class="kg-image" alt="image-2" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/image-2.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/image-2.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/image-2.png 1003w" sizes="(min-width: 720px) 720px" width="1003" height="617" loading="lazy"></figure><p>Agora, você pode ver claramente que sempre que a linha azul (média móvel curta) ultrapassa e vai além da linha laranja (média móvel longa), há um marcador rosa para cima indicando um sinal de compra.</p><p>Um sinal de venda é indicado por um marcador preto para baixo sempre que houver uma queda da média móvel curta (<code>short_mav</code>) abaixo da média móvel longa (<code>long_mav</code>).</p><h2 id="visualize-o-desempenho-da-estrat-gia-no-quantopian">Visualize o desempenho da estratégia no Quantopian</h2><p>O <a href="https://community.quantopian.com/home">Quantopian</a> (texto em inglês) é uma plataforma alimentada por Zipline que possui diversos casos de uso. Você pode escrever seus próprios algoritmos, acessar dados gratuitos, testar sua estratégia, contribuir para a comunidade e colaborar com o Quantopian se precisar de capital.</p><p>Escrevemos um algoritmo para testar nossa estratégia de SMA e aqui estão os resultados:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/10-1.png" class="kg-image" alt="10-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/10-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/10-1.png 800w" width="800" height="321" loading="lazy"></figure><p>Aqui está uma explicação das métricas acima:</p><ul><li><em>Total return</em>: é a porcentagem total de retorno do portfólio desde o início até o final do <em>backtest</em>.</li><li><em>Specific return</em>: é a diferença entre os retornos totais do portfólio e os retornos comuns.</li><li><em>Common return</em>: são retornos atribuíveis a fatores de risco comuns. Existem 11 fatores de risco setoriais e 5 de estilo que compõem esses retornos. Os gráficos de Exposição Setorial e Exposição de Estilo na seção de Risco fornecem mais detalhes sobre esses fatores.</li><li><em>Sharpe</em>: é o <em>sharpe ratio</em> de 6 meses consecutivos. É uma medida de investimento ajustada ao risco. É calculado dividindo os retornos excedentes do portfólio sobre a taxa livre de risco pelo desvio padrão do portfólio.</li><li><em>Max Drawdown</em>: é a maior queda de todo o movimento do pico ao ponto mais baixo na história do portfólio.</li><li><em>Volatility</em>: é o desvio padrão dos retornos do portfólio.</li></ul><p>Parabéns! Você implementou com sucesso sua estratégia de <em>trading</em> quantitativo.</p><h2 id="para-onde-ir-a-partir-daqui"><strong>Para onde ir a partir daqui<strong>?</strong></strong></h2><p>Agora que seu algoritmo está pronto, você precisará realizar <em>backtests</em> dos resultados e avaliar as <a href="https://www.investopedia.com/ask/answers/041415/what-are-some-common-measures-risk-used-risk-management.asp">métricas que mapeiam o risco</a> (texto em inglês) envolvido na estratégia e na ação. Novamente, você pode usar o <a href="https://blueshift.quantinsti.com/">BlueShift</a> e o <a href="https://community.quantopian.com/home">Quantopian</a> para aprender mais sobre <em>backtesting</em> e estratégias de negociação (textos dos links em inglês).</p><p><strong>Recursos adicionais</strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Quantra-logo-Black.png" class="kg-image" alt="Quantra-logo-Black" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Quantra-logo-Black.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Quantra-logo-Black.png 608w" width="608" height="623" loading="lazy"><figcaption>https://quantra.quantinsti.com/learning-track/algorithmic-trading-for-everyone?utm_source=harshit_tyagi&amp;utm_medium=affiliate&amp;utm_campaign=lt_everyone</figcaption></figure><p><a href="https://quantra.quantinsti.com/learning-track/algorithmic-trading-for-everyone?utm_source=harshit_tyagi&amp;utm_medium=affiliate&amp;utm_campaign=lt_everyone">Quantra</a> (texto em inglês) é uma criação da QuantInsti. Com uma variedade de cursos gratuitos e pagos ministrados por especialistas na área, a Quantra oferece um guia completo sobre diversas estratégias de negociação, tanto básicas quanto avançadas.</p><ul><li><a href="https://quantra.quantinsti.com/course/introduction-to-data-science?utm_source=harshit_tyagi&amp;utm_medium=affiliate&amp;utm_campaign=data_science" rel="noopener">Curso de Ciência de Dados </a> (texto em inglês) — eles lançaram um curso introdutório sobre Ciência de Dados que ajuda a construir uma base sólida para projetos na área.</li><li><a href="https://quantra.quantinsti.com/learning-track/algorithmic-trading-for-everyone?utm_source=harshit_tyagi&amp;utm_medium=affiliate&amp;utm_campaign=lt_everyone" rel="noopener">Curso de Negociação para iniciantes</a> (texto em inglês)  — desde negociação por <em>momentum</em> até estratégias de negociação baseadas em aprendizado de máquina e <em>deep learning</em> (aprendizagem profunda), pesquisadores renomados no mundo da negociação, como o Dr. Ernest P. Chan, são os autores desses cursos especializados.</li></ul><h4 id="recursos-gratu-tos"><strong>Recursos gratuítos</strong></h4><p>Para aprender mais sobre algoritmos de negociação, confira esses blogs:</p><ul><li><a href="https://www.quantstart.com/" rel="noopener">Quantstart</a>  (texto em inglês) — eles abrangem uma ampla gama de algoritmos de <em>backtesting</em>, guias para iniciantes e muito mais.</li><li><a href="https://www.investopedia.com/" rel="noopener">Investopedia</a> (texto em inglês) — tudo o que você deseja saber sobre investimentos e finanças.</li><li><a href="https://quantivity.wordpress.com/" rel="noopener">Quantivity</a> (texto em inglês)  — explicações matemáticas detalhadas dos algoritmos, bem como suas vantagens e desvantagens.</li></ul><p>Warren Buffet diz que lê cerca de 500 páginas por <em>dia</em>, o que indica que a leitura é essencial para ter sucesso na área de finanças.</p><p>Embarque nesta jornada de negociação e você poderá levar uma vida cheia de emoção, paixão e matemática.</p><h1 id="ci-ncia-de-dados-com-harshit"><strong><a href="https://www.youtube.com/c/DataSciencewithHarshit?sub_confirmation=1">Ciência de Dados com <strong>Harshit</strong></a></strong></h1><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/_ANbV9lVA-M?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="How to build an Effective Data Science Portfolio" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Com este canal, estou planejando lançar uma <a href="https://towardsdatascience.com/hitchhikers-guide-to-learning-data-science-2cc3d963b1a2?source=---------8------------------">série de vídeos que cobrirá todo o espaço da ciência de dados</a> (em inglês). Aqui está o motivo pelo qual você deve se inscrever no <a href="https://www.youtube.com/channel/UCH-xwLTKQaABNs2QmGxK2bQ">canal</a> (texto em inglês):</p><ul><li>Essas séries abordarão todos os tutoriais de qualidade necessários sobre cada um dos tópicos e subtópicos, como <a href="https://towardsdatascience.com/python-fundamentals-for-data-science-6c7f9901e1c8?source=---------5------------------">fundamentos de Python para Ciência de Dados</a> (texto em inglês).</li><li>Explicações <a href="https://towardsdatascience.com/practical-reasons-to-learn-mathematics-for-data-science-1f6caec161ea?source=---------9------------------">matemáticas e derivações</a> (texto em inglês) sobre o porquê fazemos o que fazemos em aprendizagem de máquina e Deep Learning.</li><li><a href="https://www.youtube.com/watch?v=a2pkZCleJwM&amp;t=2s">Podcasts com Cientistas de Dados e Engenheiros</a> (texto em inglês) do Google, Microsoft, Amazon etc., além de CEOs de grandes empresas orientadas por dados.</li><li><a href="https://towardsdatascience.com/building-covid-19-analysis-dashboard-using-python-and-voila-ee091f65dcbb?source=---------2------------------">Projetos e instruções</a> para implementar os tópicos aprendidos até agora. Saiba mais sobre novas certificações, bootcamps e recursos para conquistar essas certificações, como o <a href="https://youtu.be/yapSsspJzAw"><strong>Exame de Certificação de Desenvolvedor TensorFlow do Google</strong></a> (texto em inglês).</li></ul><p>Se este tutorial foi útil, confira meus cursos de ciência de dados e aprendizagem de máquina na <a href="https://www.wiplane.com/">Wiplane Academy</a> (texto em inglês). Eles são abrangentes, porém compactos, ajudando a construir uma base sólida de trabalho para mostrar.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Uma introdução detalhada aos sistemas distribuídos ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Stanislav Kozlovski O que é um sistema distribuído e por que é tão complicado? Com a expansão tecnológica cada vez maior do mundo, os sistemas distribuídos estão se tornando cada vez mais difundidos. Eles são um vasto e complexo campo de estudo em ciência da computação.  Este ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/uma-introducao-detalhada-aos-sistemas-distribuidos/</link>
                <guid isPermaLink="false">64bc0806b04bf0067ce24c53</guid>
                
                    <category>
                        <![CDATA[ Blockchain ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcelo Pena ]]>
                </dc:creator>
                <pubDate>Sun, 23 Jun 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_iyQPowJqG7o492vz5kNmXw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/a-thorough-introduction-to-distributed-systems-3b91562c9b3c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">A Thorough Introduction to Distributed Systems</a>
      </p><p>Escrito por: Stanislav Kozlovski</p><h2 id="o-que-um-sistema-distribu-do-e-por-que-t-o-complicado">O que é um sistema distribuído e por que é tão complicado?</h2><p>Com a expansão tecnológica cada vez maior do mundo, os sistemas distribuídos estão se tornando cada vez mais difundidos. Eles são um vasto e complexo campo de estudo em ciência da computação. </p><p>Este artigo tem como objetivo apresentar a você os sistemas distribuídos de maneira básica, dando uma ideia das diferentes categorias desses sistemas, sem mergulhar profundamente nos detalhes.</p><h2 id="o-que-um-sistema-distribu-do"><strong>O que é um sistema distribuído<strong>?</strong></strong></h2><p>Em sua definição mais simples, um sistema distribuído é um grupo de computadores trabalhando juntos de modo a parecer como um único computador para o usuário final.</p><p>Essas máquinas possuem um estado compartilhado, operam de maneira concorrente e podem falhar independentemente sem afetar o tempo de atividade de todo o sistema.</p><p>Proponho que trabalhemos gradualmente através de um exemplo de distribuição de um sistema para que você possa ter uma melhor compreensão de tudo isso.</p><p>Vamos usar um banco de dados como exemplo! Bancos de dados tradicionais são armazenados no sistema de arquivos de uma única máquina. Sempre que você deseja buscar/inserir informações nele, você se comunica diretamente com aquela máquina.</p><p>Para distribuir esse sistema de banco de dados, precisaríamos fazer com que esse banco de dados fosse executado em várias máquinas ao mesmo tempo. O usuário deve ser capaz de se comunicar com qualquer máquina que ele escolha e não deve ser capaz de perceber que não está falando com uma única máquina – se ele insere um registro no nó nº 1, o nó nº 3 deve ser capaz de retornar esse registro.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_n-3Db0bssxh7B-A0Jndx0A.png" class="kg-image" alt="1_n-3Db0bssxh7B-A0Jndx0A" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/1_n-3Db0bssxh7B-A0Jndx0A.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_n-3Db0bssxh7B-A0Jndx0A.png 675w" width="675" height="697" loading="lazy"><figcaption>Uma arquitetura que pode ser considerada distribuída</figcaption></figure><h2 id="por-que-distribuir-um-sistema"><strong>Por que distribuir um sistema<strong>?</strong></strong></h2><p>Os sistemas são sempre distribuídos por necessidade. A verdade é que gerenciar sistemas distribuídos é um tópico complexo, repleto de armadilhas e desafios. É uma dor de cabeça implantar, manter e depurar sistemas distribuídos. Então, por que seguir por esse caminho afinal?</p><p>O que um sistema distribuído possibilita é a <strong>escalabilidade horizontal</strong>. Voltando ao nosso exemplo anterior do servidor de banco de dados único, a única maneira de lidar com mais tráfego seria atualizar o hardware em que o banco de dados está sendo executado. Isso é chamado de <strong>escalonamento vertical</strong>.</p><p>O escalonamento vertical é válido até certo ponto, mas, após um determinado ponto, você verá que mesmo o melhor hardware não é suficiente para lidar com volume suficiente de tráfego, sem mencionar o fato de que é impraticável para hospedar.</p><p>O <strong>escalonamento horizontal</strong>, por sua vez, significa simplesmente adicionar mais computadores em vez de atualizar o hardware de um único computador.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/image-6.png" class="kg-image" alt="image-6" width="400" height="389" loading="lazy"><figcaption>O escalonamento horizontal se torna <strong>muito mais barato</strong> após um certo limite.</figcaption></figure><p>É significativamente mais barato do que o escalonamento vertical após um certo limite, mas esse não é o principal motivo de preferência.</p><p>O escalonamento vertical só pode melhorar o desempenho até as capacidades do hardware mais recente. Essas capacidades acabam sendo <strong>insuficientes</strong> para empresas tecnológicas com cargas de trabalho moderadas a grandes.</p><p>A melhor coisa sobre o escalonamento horizontal é que não há limite para o quanto você pode escalar – sempre que o desempenho se degrada, basta adicionar outra máquina, potencialmente até o infinito.</p><p>A facilidade de escalonamento não é o único benefício que você obtém com sistemas distribuídos. <strong>Tolerância a falhas</strong> e <strong>baixa latência</strong> também são igualmente importantes.</p><p><strong><em>Tolerância a falhas</em></strong> – um cluster de dez máquinas em dois <em>data centers</em> é intrinsecamente mais tolerante a falhas do que uma única máquina. Mesmo que um <em>data center</em> pegue fogo, sua aplicação ainda funcionaria.</p><p><em><strong>Baixa latência</strong></em> – o tempo para um pacote de rede viajar pelo mundo é fisicamente limitado pela velocidade da luz. Por exemplo, o tempo mais curto possível para o <strong>tempo de ida e volta</strong> de uma solicitação (ou seja, ir e voltar) em um cabo de fibra óptica entre Nova York e Sydney é de <a href="https://www.oreilly.com/learning/primer-on-latency-and-bandwidth">160 ms</a> (texto em inglês). Sistemas distribuídos permitem que você tenha um nó em ambas as cidades, permitindo que o tráfego atinja o nó mais próximo.</p><p>No entanto, para que um sistema distribuído funcione, é necessário que o software em execução nessas máquinas seja projetado especificamente para ser executado em vários computadores ao mesmo tempo e que lide com os problemas que surgem com isso. Isso acaba sendo uma tarefa complicada.</p><h2 id="escalonando-nosso-banco-de-dados">Escalonando nosso banco de dados</h2><p>Imagine que nossa aplicação para a web se tornou extremamente popular. Imagine também que nosso banco de dados começou a receber o dobro de consultas por segundo do que ele pode lidar. Essa aplicação começaria imediatamente a perder desempenho e isso seria percebido por nossos usuários.</p><p>Vamos trabalhar juntos e fazer com que nosso banco de dados aumente sua capacidade para atender essas altas demandas.</p><p>Em uma aplicação para a web típica, geralmente se lê informações com muito mais frequência do que se insere novas informações ou se modifica as antigas.</p><p>Existe uma maneira de aumentar o desempenho de leitura e é chamada de estratégia <strong><em>p<strong>rimary-</strong>r<strong>eplica </strong>r<strong>eplication</strong></em></strong> (replicação entre mestre-escravo). Você cria dois servidores de banco de dados que sincronizam com o servidor principal. A pegadinha é que você <strong>só pode fazer leituras</strong> dessas novas instâncias.</p><p>Sempre que você inserir ou modificar informações, você se comunica com o banco de dados principal. Ele, por sua vez, informa as réplicas assincronamente sobre a mudança e elas também a salvam.</p><p>Parabéns, agora você pode executar três vezes mais consultas de leitura! Não é ótimo?</p><h3 id="armadilha"><strong>Armadilha</strong></h3><p><strong>Peguei vocês<strong>!</strong></strong> Perdemos imediatamente o "C" nas garantias <strong><a href="https://en.wikipedia.org/wiki/ACID">ACID</a></strong> (texto em inglês) de nosso banco de dados relacional, a Consistência.</p><p>Perceba que, agora, existe a possibilidade de inserirmos um novo registro no banco de dados e, imediatamente após, realizarmos uma consulta de leitura para esse registro e não obtermos nenhuma resposta de volta, como se ele não existisse!</p><p>A propagação de novas informações do primário para a réplica não acontece instantaneamente. Na verdade, existe uma janela de tempo em que você pode obter informações desatualizadas. Se não fosse assim, o desempenho da gravação seria prejudicado, pois teria que aguardar sincronamente a propagação dos dados.</p><p>Sistemas distribuídos envolvem algumas escolhas e renúncias (<em>trade-offs</em> em inglês). Essa questão em particular é algo com que você terá que conviver se quiser escalar adequadamente.</p><h3 id="continuando-a-escalonar">Continuando a Escalonar</h3><p>Utilizando a abordagem do banco de dados replicado, podemos escalonar horizontalmente nosso tráfego de leitura até certo ponto. Isso é ótimo, mas encontramos um obstáculo em relação ao nosso tráfego de escrita — ele ainda está todo em um único servidor!</p><p>Não temos muitas opções aqui. Simplesmente precisamos dividir nosso tráfego de escrita entre vários servidores, já que um não é capaz de lidar com isso.</p><p>Uma maneira é adotar uma <a href="https://en.wikipedia.org/wiki/Multi-master_replication">estratégia de replicação multi-primária</a> (texto em inglês). Nesse caso, em vez de réplicas as quais você só pode ler, você tem vários nós primários que suportam leitura e escrita. Infelizmente, isso se torna complicado rapidamente, pois você agora tem a capacidade de <a href="http://datacharmer.blogspot.bg/2013/03/multi-master-data-conflicts-part-1.html">criar conflitos</a> (por exemplo, inserir dois registros com o mesmo ID – texto em inglês).</p><p>Vamos adotar outra técnica chamada <a href="https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6"><em><strong>fragmentação</strong></em></a> (também chamada de <strong><em>particionamento</em></strong> – texto em inglês).</p><p>Com a fragmentação, você divide o seu servidor em vários servidores menores, chamados de <strong><em>fragmentos</em></strong> (<em>shards</em>, em inglês) Esses fragmentos contêm registros diferentes — você cria uma regra para determinar que tipo de registros é armazenado em cada fragmento. É muito importante criar a regra de tal maneira que os dados sejam distribuídos <strong>de modo uniforme</strong>.</p><p>Uma abordagem possível para isso é definir intervalos de acordo com alguma informação sobre um registro (por exemplo, usuários com nomes de A a D).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/image-1.png" class="kg-image" alt="image-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/image-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/image-1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="610" loading="lazy"></figure><p>Essa abordagem de fragmentação deve ser escolhida com muito cuidado, pois a carga nem sempre é igual com base em colunas arbitrárias. (por exemplo, mais pessoas têm nomes que começam com C em vez de Z). Um único fragmento que recebe mais solicitações do que outros é chamado de <strong><em>hot spot</em></strong> (ponto de acesso) e deve ser evitado. Depois de divididos, a nova fragmentação dos dados torna-se incrivelmente cara e pode causar um significativo tempo de indisponibilidade, como foi o infame caso das <a href="https://mashable.com/2010/10/05/foursquare-downtime-post-mortem/#qyp__Q9UDkqW">11 horas de indisponibilidade do Foursquare</a> (texto em inglês).</p><p>Para manter nosso exemplo simples, suponha que nosso <em>client</em> (a aplicação em Rails) saiba qual banco de dados usar para cada registro. Também vale ressaltar que existem muitas estratégias para o particionamento e esse é um exemplo simples para ilustrar o conceito.</p><p>No momento, já obtivemos bastante sucesso – podemos aumentar nosso tráfego de gravação <strong><em>N</em></strong> vezes, onde <strong><em>N</em></strong> é o número de fragmentos. Isso praticamente nos deixa quase sem limites – imagine o nível de granularidade que podemos ter com essa divisão.</p><h3 id="armadilha-1"><strong>Armadilha</strong></h3><p>Tudo na Engenharia de Software é mais ou menos escolhas e renúncias (<em>trade-offs</em> em inglês), e isso não é uma exceção. O particionamento não é uma tarefa simples e é melhor evitá-lo até que seja <a href="https://www.percona.com/blog/2009/08/06/why-you-dont-want-to-shard/">realmente necessário</a> (texto em inglês).</p><p>Agora, tornamos as consultas por chaves <strong>diferentes das chaves particionadas</strong> incrivelmente ineficientes (elas precisam passar por todos os fragmentos). As consultas de SQL <code>JOIN</code> são ainda piores e complexas, tornam-se praticamente inutilizáveis.</p><h3 id="decentralizado-x-distribu-do">Decentralizado x distribuído</h3><p>Antes de prosseguirmos, gostaria de fazer uma distinção entre esses dois termos.</p><p>Embora as palavras soem semelhantes e possam ser concluídas como significando o mesmo logicamente, suas diferenças têm um impacto tecnológico e político significativo.</p><p><em><strong>Descentralizado</strong></em> ainda é <em><strong>distribuído</strong></em> no sentido técnico, mas todo o sistema descentralizado não é de propriedade de um único ator. Nenhuma empresa pode possuir um sistema descentralizado. Caso contrário, ele deixaria de ser descentralizado.</p><p>Isso significa que a maioria dos sistemas que discutiremos hoje pode ser considerada como <em><strong>sistemas centralizados distribuídos</strong></em> – e é isso que eles foram projetados para ser.</p><p>Se você pensar a respeito, é mais difícil criar um sistema descentralizado porque é preciso lidar com a situação em que alguns dos participantes são mal-intencionados. Isso não ocorre com sistemas distribuídos normais, pois você sabe que é o proprietário de todos os nós.</p><p><em>Observação: essa definição tem sido bastante <a href="https://github.com/WebOfTrustInfo/rebooting-the-web-of-trust/issues/50#issuecomment-154995201">debatida</a> (texto em inglês) e pode ser confundida com outras (peer-to-peer, federado). </em><a href="https://ethereum.stackexchange.com/a/7829"><em>Em literatura mais antiga, também foi definida de maneira diferente</em></a><em> (texto em inglês). Independentemente disso, o que forneci como definição é o que considero ser o mais amplamente utilizado agora, especialmente após a popularização dos termos blockchain e criptomoedas.</em></p><h3 id="categorias-de-sistemas-distribu-dos">Categorias de sistemas distribuídos</h3><p>Agora vamos explorar algumas categorias de sistemas distribuídos e listar seus maiores usos conhecidos publicamente. Tenha em mente que a maioria dos números apresentados está desatualizada e, provavelmente, é significativamente maior no momento em que você está lendo isso.</p><h3 id="armazenamento-distribu-dos-de-dados">Armazenamento distribuídos de dados</h3><p>Os armazenamentos distribuídos de dados são mais amplamente utilizados e reconhecidos como bancos de dados distribuídos. A maioria dos bancos de dados distribuídos são <a href="https://en.wikipedia.org/wiki/NoSQL">NoSQL</a> (texto em inglês), ou seja, bancos de dados não relacionais, limitados à semântica chave-valor. Eles oferecem desempenho e escalabilidade incríveis, mas isso ocorre às custas da consistência ou disponibilidade.</p><blockquote><strong>Escala conhecida</strong> – <a href="http://cassandra.apache.org/">a Apple é conhecida por utilizar 75.000 nós do Apache Cassandra, armazenando mais de 10 petabytes de dados</a> (texto em inglês).</blockquote><p>Não podemos entrar em discussões sobre armazenamento distribuído de dados sem primeiro introduzir o <strong>Teorema CAP</strong>.</p><p><strong>Teorema <strong>CAP</strong></strong></p><p><a href="https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/">Comprovado pela primeira vez em 2002</a> (texto em inglês), o Teorema CAP (sigla em inglês para <em><strong>C</strong>onsistency</em>, <em><strong>A</strong>vailability</em> e <em><strong>P</strong>artition Tolerance</em>) estabelece que um sistema de armazenamento de dados distribuído não pode simultaneamente manter consistência, estar sempre disponível e ser tolerante a partições.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/CAP-VENN.png" class="kg-image" alt="1*hIUyhmHbihiiMRP7hWgBSw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/CAP-VENN.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/CAP-VENN.png 800w" sizes="(min-width: 720px) 720px" width="800" height="600" loading="lazy"><figcaption>Escolha 2 entre 3 (mas não Consistência e Disponibilidade).</figcaption></figure><p>Algumas definições rápidas:</p><ul><li><strong>Consistência </strong>—<strong> </strong>o que você lê e escreve sequencialmente é o que é esperado (lembre-se da situação complicada com a replicação do banco de dados mencionada alguns parágrafos atrás?).</li><li><strong>Disponibilidade</strong> — o sistema como um todo não falha — todo nó não defeituoso sempre retorna uma resposta.</li><li><strong>Tolerância a partições</strong> — o sistema continua a funcionar e manter suas garantias de consistência/disponibilidade apesar das <a href="https://www.symantec.com/security_response/glossary/define.jsp?letter=n&amp;word=network-partition">partições na rede</a> (texto em inglês).</li></ul><p>Na realidade, a tolerância a partições deve ser uma premissa para qualquer armazenamento de dados distribuído. Conforme mencionado em vários lugares, <a href="https://codahale.com/you-cant-sacrifice-partition-tolerance/">como citado neste ótimo artigo</a> (texto em inglês), não é possível ter consistência e disponibilidade sem tolerância a partições.</p><p>Reflexão: se você tiver dois nós que aceitam informações e a conexão entre eles for interrompida, como ambos poderão estar disponíveis e fornecer consistência ao mesmo tempo? Eles não têm conhecimento do que o outro nó está fazendo, podendo assim ficar <em>off-line </em>(indisponíveis) ou operar com informações desatualizadas (inconsistentes).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-4.png" class="kg-image" alt="image-4" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-4.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-4.png 800w" sizes="(min-width: 720px) 720px" width="800" height="529" loading="lazy"><figcaption>O que fazemos?</figcaption></figure><p>No final, você precisa escolher se deseja que seu sistema seja fortemente consistente ou altamente disponível <strong><em>em caso de uma partição de rede</em></strong>.</p><p>A prática mostra que a maioria das aplicações valoriza mais a disponibilidade. Você nem sempre precisa necessariamente de uma consistência forte. Mesmo assim, essa compensação não é necessariamente feita porque você precisa da garantia de 100% de disponibilidade, mas sim porque a latência da rede pode ser um problema quando é necessário sincronizar máquinas para obter uma consistência forte. Esses e outros fatores fazem com que as aplicações normalmente optem por soluções que ofereçam alta disponibilidade.</p><p>Esses bancos de dados se contentam com o modelo de consistência mais fraco – <em><strong>consistência eventual</strong></em> (<em><a href="https://hackernoon.com/eventual-vs-strong-consistency-in-distributed-databases-282fdad37cf7">explicação de consistência forte versus consistência eventual</a> – texto em inglês</em>). Esse modelo garante que se nenhuma nova atualização for feita em um determinado item, <strong>eventualmente</strong> todos os acessos a esse item retornarão o último valor atualizado.</p><p>Esses sistemas fornecem propriedades <strong>BASE</strong> (em oposição ao ACID dos bancos de dados tradicionais):</p><ul><li><strong><strong>B</strong></strong>asically <strong><strong>A</strong></strong>vailable — basicamente disponível — o sistema sempre retorna uma resposta</li><li><strong><strong>S</strong></strong>oft state — estado suave — o sistema pode mudar com o tempo, mesmo durante períodos sem entrada (devido a eventual consistência)</li><li><strong><strong>E</strong></strong>ventual consistency — consistência eventual — na ausência de entrada, os dados se espalharão para todos os nós, mais cedo ou mais tarde — tornando-se assim consistentes</li></ul><p>Exemplos de tais bancos de dados distribuídos disponíveis — <a href="http://cassandra.apache.org/" rel="noopener">Cassandra</a>, <a href="http://basho.com/products/riak-kv/" rel="noopener">Riak</a>, <a href="http://www.project-voldemort.com/voldemort/" rel="noopener">Voldemort</a> (texto em inglês)</p><p>Claro, existem outros armazenamentos de dados que preferem consistência mais forte — <a href="https://hbase.apache.org/" rel="noopener">HBase</a>, <a href="https://www.couchbase.com/" rel="noopener">Couchbase</a>, <a href="https://redis.io/" rel="noopener">Redis,</a> <a href="https://zookeeper.apache.org/" rel="noopener">Zookeeper</a> (texto em inglês)</p><p>O teorema CAP é digno de vários artigos por si só – alguns sobre como você pode <a href="http://www.goland.org/blockchain_and_cap/">ajustar as propriedades CAP de um sistema dependendo de como o <em>client</em> se comporta</a> (texto em inglês) e outros sobre <a href="https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html">como ele não é compreendido corretamente</a> (texto em inglês).</p><p><strong><strong>Cassandra</strong></strong></p><p>Cassandra, como mencionado acima, é um banco de dados No-SQL distribuído que prefere as propriedades do AP fora do CAP, estabelecendo-se com consistência eventual. Devo admitir que isso pode ser um pouco enganador, já que o Cassandra é altamente configurável — você também pode fazer com que ele forneça uma consistência forte em detrimento da disponibilidade, mas esse não é seu caso de uso comum.</p><p>Cassandra utiliza <a href="https://en.wikipedia.org/wiki/Consistent_hashing">hashing consistente</a> (texto em inglês) para determinar quais nós do seu cluster devem gerenciar os dados que você está passando. Você define um <strong>fator de replicação</strong>, que basicamente indica para quantos nós você deseja replicar seus dados.</p><p>Ao ler, você lerá apenas desses nós.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-15.png" class="kg-image" alt="image-15" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-15.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-15.png 800w" sizes="(min-width: 720px) 720px" width="800" height="666" loading="lazy"></figure><p>Cassandra é altamente escalável, proporcionando uma taxa de transferência de escrita absurdamente alta.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-6.png" class="kg-image" alt="image-6" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-6.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-6.png 800w" sizes="(min-width: 720px) 720px" width="800" height="677" loading="lazy"><figcaption>Diagrama possivelmente tendencioso, mostrando teste de desempenho de gravações por segundo.</figcaption></figure><p>Mesmo que esse diagrama possa ser tendencioso e pareça que compara Cassandra a bancos de dados configurados para fornecer consistência forte (caso contrário, não consigo ver por que o MongoDB diminuiria o desempenho quando atualizado de 4 para 8 nós), isso ainda deve mostrar o que é configurado corretamente até o cluster Cassandra é capaz.</p><p>Independentemente disso, no <em>trade-off</em> de sistemas distribuídos que permite escalabilidade horizontal e rendimento incrivelmente alto, o Cassandra não fornece alguns recursos fundamentais dos bancos de dados ACID – ou seja, transações.</p><h3 id="consenso"><strong><strong>Consens</strong>o</strong></h3><p>As transações de banco de dados são difíceis de implementar em sistemas distribuídos, pois exigem que cada nó concorde sobre a ação correta a ser tomada (abortar ou confirmar). Isso é conhecido como <strong>consenso</strong> e é um problema fundamental em sistemas distribuídos.</p><p>Alcançar o tipo de acordo necessário para o problema de "confirmação de transação" é simples se os processos participantes e a rede forem completamente confiáveis. No entanto, os sistemas reais estão sujeitos a uma série de falhas possíveis, como falhas de processos, particionamento de rede e mensagens perdidas, distorcidas ou duplicadas.</p><p>Isto levanta um problema: <a href="http://the-paper-trail.org/blog/a-brief-tour-of-flp-impossibility/">provou-se ser impossível</a> (texto em inglês) garantir que um consenso correto seja alcançado dentro de um prazo limitado em uma rede não confiável.</p><p>Na prática, porém, existem algoritmos que chegam rapidamente a um consenso em uma rede não confiável. Na verdade, Cassandra fornece <a href="https://www.beyondthelines.net/databases/cassandra-lightweight-transactions/">transações leves</a> por meio do uso do algoritmo <a href="https://en.wikipedia.org/wiki/Paxos_(computer_science)">Paxos</a> para consenso distribuído.</p><h2 id="computa-o-distribu-da"><strong>Computação distribuída</strong></h2><p>A computação distribuída é a chave para o fluxo de processamento de Big Data que temos visto nos últimos anos. É a técnica de dividir uma tarefa enorme (por exemplo, agregar 100 bilhões de registos), que nenhum computador é capaz de executar praticamente por si só, em muitas tarefas mais pequenas, cada uma das quais pode caber numa única máquina comum. Você divide sua enorme tarefa em muitas tarefas menores, executa-as em muitas máquinas em paralelo, agrega os dados adequadamente e resolve seu problema inicial. Essa abordagem novamente permite escalar horizontalmente – quando você tem uma tarefa maior, basta incluir mais nós no cálculo.</p><blockquote><a href="https://en.wikipedia.org/wiki/Folding@home" rel="noopener">Folding@Home</a> &nbsp;<a href="https://www.webcitation.org/6CWRdkzP0?url=http://fah-web.stanford.edu/cgi-bin/main.py?qtype=osstats2">160 mil máquinas ativas em 2012</a> (texto em inglês)</blockquote><p>Um dos primeiros inovadores neste espaço foi o Google, que devido à necessidade de suas grandes quantidades de dados teve que inventar um novo paradigma para computação distribuída – MapReduce. Eles publicaram um <a href="http://static.googleusercontent.com/media/research.google.com/en/us/archive/mapreduce-osdi04.pdf">artigo sobre isso em 2004</a> (texto em inglês) e a comunidade de código aberto mais tarde criou o <a href="https://hadoop.apache.org/">Apache Hadoop</a> (texto em inglês) baseado nele.</p><p><strong><strong>MapReduce</strong></strong></p><p>MapReduce pode ser definido simplesmente como duas etapas – <a href="https://en.wikipedia.org/wiki/Map_(higher-order_function)">mapear os dados</a> (Map) e <a href="https://en.wikipedia.org/wiki/Fold_(higher-order_function)">reduzi-los</a> a algo significativo (Reduce).</p><p>Vamos ver um exemplo novamente:</p><p>Digamos que somos a <a href="https://medium.com/">Medium</a> (Plataforma de publicação de artigos) e armazenamos nossas enormes informações em um banco de dados secundário distribuído para fins de armazenamento. Queremos buscar dados que representem o número de palmas enviadas todos os dias durante o mês de abril de 2017 (um ano antes da edição original deste artigo).</p><p>Este exemplo é o mais curto, claro e simples possível, mas imagine que estamos trabalhando com muitos dados (por exemplo, analisando bilhões de aplausos). Obviamente, não armazenaremos todas essas informações em uma máquina e não analisaremos tudo isso em apenas uma máquina. Também não consultaremos o banco de dados de produção, mas algum banco de dados de "armazém" construído especificamente para trabalhos <em>off-line</em> de baixa prioridade.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_eOJWeVtD769sSOCynpFWAA.png" class="kg-image" alt="1_eOJWeVtD769sSOCynpFWAA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/1_eOJWeVtD769sSOCynpFWAA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_eOJWeVtD769sSOCynpFWAA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="421" loading="lazy"></figure><p>Cada trabalho <em>Map</em> é um nó separado que transforma o máximo de dados possível. Cada trabalho percorre todos os dados em um determinado nó de armazenamento e os mapeia para uma tupla simples da data e do número um. Em seguida, são realizadas três etapas intermediárias (<em>das quais ninguém fala</em>) – <em>Shuffle</em>, <em>Sort</em> e <em>Partition</em>. Elas basicamente organizam ainda mais os dados e os excluem para o trabalho de redução apropriado. Como estamos lidando com Big Data, separamos cada trabalho de <em>Reduce</em> para funcionar apenas em uma única data.</p><p>Esse é um bom paradigma e surpreendentemente permite que você faça muitas coisas com ele — você pode encadear vários trabalhos MapReduce, por exemplo.</p><p><strong>Melhores técnicas</strong></p><p>O MapReduce é um tanto legado nos dias de hoje e traz alguns problemas consigo. Por trabalhar em lotes (<em>jobs</em>), surge um problema onde, se o seu <em>job </em>falhar, você precisa reiniciar tudo do zero. Um <em>job</em> de 2 horas falhando pode realmente retardar todo o seu <em>pipeline </em>de processamento de dados e você definitivamente não quer isso, especialmente nas horas de pico.</p><p>Outra questão é o tempo que você espera até receber os resultados. Em sistemas analíticos em tempo real (onde todos têm <em>big data</em> e, portanto, usam computação distribuída), é importante que os seus dados mais recentes estejam o mais novos possível e certamente não sejam de algumas horas atrás.</p><p>Como resultado, <a href="https://www.talend.com/blog/2017/08/28/lambda-kappa-real-time-big-data-architectures/">surgiram outras arquiteturas</a> (texto em inglês) que abordam esses problemas. Nomeadamente, a <a href="https://en.wikipedia.org/wiki/Lambda_architecture">arquitetura Lambda</a> (uma mistura de processamento em lote e processamento em fluxo – texto em inglês) e a <a href="http://milinda.pathirage.org/kappa-architecture.com/">arquitetura Kappa</a> (apenas processamento em fluxo – texto em inglês). Esses avanços no campo trouxeram novas ferramentas que os possibilitam — <a href="https://kafka.apache.org/documentation/streams/">Kafka Streams</a>, <a href="https://spark.apache.org/">Apache Spark</a>, <a href="http://storm.apache.org/">Apache Storm</a>, <a href="http://samza.apache.org/">Apache Samza</a>.</p><h3 id="sistemas-de-arquivos-distribu-dos"><strong>Sistemas de arquivos distribuídos</strong></h3><p>Os sistemas de arquivos distribuídos podem ser considerados como armazenamentos de dados distribuídos. São a mesma coisa como conceito — armazenar e acessar uma grande quantidade de dados em um <em>cluster </em>de máquinas, todas aparecendo como uma só. Eles geralmente andam de mãos dadas com a Computação Distribuída.</p><blockquote>Escala conhecida – <a href="https://www.slideshare.net/Hadoop_Summit/what-it-takes-to-run-hadoop-at-scale-yahoo-perspectives">O Yahoo é conhecido por executar o HDFS em mais de 42.000 nós para armazenamento de 600 Petabytes de dados, lá em 2011</a></blockquote><p>A diferença é que os sistemas de arquivos distribuídos permitem que os arquivos sejam acessados usando as mesmas interfaces e semânticas que os arquivos locais, e não por meio de uma API personalizada como a Cassandra Query Language (<a href="https://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html">CQL</a>).</p><p><strong><strong>HDFS</strong></strong></p><p>O <em>Hadoop Distributed File System</em> (HDFS) é o sistema de arquivos distribuídos usado para computação distribuída através do framework Hadoop. Com ampla adoção, é utilizado para armazenar e replicar grandes arquivos (de GB ou TB em tamanho) em muitas máquinas.</p><p>Sua arquitetura consiste principalmente em <strong><em>NameNodes</em></strong> e <strong><em>DataNodes</em></strong>. Os NameNodes são responsáveis por manter o <em>metadata</em> sobre o <em>cluster</em>, como qual nó contém quais blocos de arquivos. Eles atuam como coordenadores da rede, determinando onde é melhor armazenar e replicar arquivos, além de monitorar a saúde do sistema. Os DataNodes simplesmente armazenam arquivos e executam comandos como replicar um arquivo, escrever um novo entre outros.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-16.png" class="kg-image" alt="image-16" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-16.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-16.png 800w" sizes="(min-width: 720px) 720px" width="800" height="351" loading="lazy"></figure><p>Não surpreendentemente, o HDFS é melhor utilizado com o Hadoop para computação, pois fornece consciência de dados para os <em>jobs </em>de computação. Esses <em>jobs</em> são então executados nos nós que armazenam os dados. Isso aproveita a localidade dos dados — otimizando as computações e reduzindo a quantidade de tráfego na rede.</p><h4 id="ipfs"><strong><strong>IPFS</strong></strong></h4><p>O <a href="https://ipfs.io/"><em>Interplanetary File System</em></a> (IPFS – texto em inglês), sistema de arquivos interplanetário, é um novo e empolgante protocolo de rede <em>peer-to-peer</em> para um sistema de arquivos distribuídos. Aproveitando a tecnologia <a href="https://en.wikipedia.org/wiki/Blockchain">Blockchain</a> (texto em inglês), ele possui uma arquitetura completamente descentralizada, sem um único proprietário ou ponto de falha.</p><p>O IPFS oferece um sistema de nomes (semelhante ao DNS) chamado IPNS e permite que os usuários acessem facilmente informações. Ele armazena arquivos por meio de versionamento histórico, semelhante ao que o <a href="https://en.wikipedia.org/wiki/Git">Git</a> (texto em inglês) faz. Isso permite o acesso a todos os estados anteriores de um arquivo.</p><p>Ainda está passando por um desenvolvimento intenso (versão 0.4 no momento desta edição), mas já viu projetos interessados em construir sobre ele (<a href="https://filecoin.io/">FileCoin</a>, texto em inglês).</p><h3 id="messageria-distribu-da"><strong><strong>Messa</strong>geria distribuída</strong></h3><p>Sistemas de mensageria fornecem um local central para armazenamento e propagação de mensagens/eventos dentro do seu sistema geral. Eles permitem que você desacople a lógica de sua aplicação de falar diretamente com seus outros sistemas.</p><blockquote>Escala conhecida – <a href="https://engineering.linkedin.com/apache-kafka/how-we_re-improving-and-advancing-kafka-linkedin">o cluster Kafka do LinkedIn processou 1 trilhão de mensagens por dia, com picos de 4,5 milhões de mensagens por segundo</a> (texto em inglês).</blockquote><p>Simplificando, uma plataforma de mensagens funciona da seguinte maneira: </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-21.png" class="kg-image" alt="image-21" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-21.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-21.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Uma mensagem é transmitida a partir da aplicação que a potencialmente cria (chamada de <strong>produtor</strong>), entra na plataforma e é lida por potencialmente múltiplas aplicações que têm interesse nela (chamadas de <strong>consumidor</strong>es).</p><p>Se você precisa salvar um determinado evento em vários lugares (por exemplo, criação de usuário no banco de dados, <em>data warehouse</em>, serviço de envio de e-mails e qualquer outra coisa que você possa imaginar), uma plataforma de mensageria é a maneira mais limpa de disseminar essa mensagem.</p><p>Os consumidores podem tanto extrair informações dos <em>brokers</em> (modelo <em>pull</em>) quanto ter os <em>brokers </em>enviando informações diretamente para os consumidores (modelo <em>push</em>).</p><p>Existem algumas plataformas de mensagens populares e de alta qualidade:</p><p><a href="https://www.rabbitmq.com/">RabbitMQ</a> (texto em inglês) — <em>broker </em>de mensagens que permite um controle mais detalhado das trajetórias das mensagens através de regras de roteamento e outras configurações facilmente ajustáveis. Pode ser chamado de <em>broker </em>inteligente, pois possui muita lógica embutida e acompanha rigorosamente as mensagens que passam por ele. Oferece configurações tanto para <strong>AP</strong> quanto para <strong>CP</strong> do teorema <strong>CAP</strong>. Utiliza um modelo <em>push </em>para notificar os consumidores.</p><p><a href="https://kafka.apache.org/">Kafka</a> (texto em inglês) — <em>broker </em>de mensagens (e uma plataforma completa) que é um pouco mais de baixo nível, pois não acompanha quais mensagens foram lidas e não permite uma lógica de roteamento complexa. Isso ajuda a alcançar um desempenho incrível. Na minha opinião, esse é o maior prospecto nesse espaço, com desenvolvimento ativo da comunidade de código aberto e suporte da <a href="https://www.confluent.io/blog">equipe Confluent</a> (texto em inglês). O Kafka, indiscutivelmente, é o mais amplamente utilizado pelas principais empresas de tecnologia. <a href="https://hackernoon.com/thorough-introduction-to-apache-kafka-6fbf2989bbc1">Escrevi uma introdução detalhada sobre isso, onde explico em detalhes todas as suas vantagens</a> (texto em inglês).</p><p><a href="http://activemq.apache.org/">Apache ActiveMQ</a> (texto em inglês) — o mais antigo do grupo, datando de 2004. Usa a API JMS, o que significa que é voltado para aplicativos Java EE. Foi reescrito como <a href="https://activemq.apache.org/artemis/">ActiveMQ Artemis</a> (texto em inglês), que oferece um desempenho excepcional comparável ao Kafka.</p><p><a href="https://aws.amazon.com/sqs/">Amazon SQS</a> (texto em inglês) — um serviço de mensageria fornecido pela AWS. Permite que você integre rapidamente com aplicações existentes e elimina a necessidade de lidar com sua própria infraestrutura, o que pode ser um grande benefício, já que sistemas como o Kafka são notoriamente difíceis de configurar. A Amazon também oferece dois serviços semelhantes — <a href="https://aws.amazon.com/sns/">SNS</a> (texto em inglês) e <a href="https://aws.amazon.com/amazon-mq/">MQ</a> (texto em inglês), este último é basicamente o ActiveMQ, mas gerenciado pela Amazon.</p><h3 id="aplica-es-distribu-das"><strong>Aplicações distribuídas</strong></h3><p>Se você agrupar 5 servidores de Rails atrás de um único balanceador de carga, todos conectados a um banco de dados, poderia chamar isso de aplicação distribuída? Lembre-se da minha definição lá em cima:</p><blockquote>Um sistema distribuído é um grupo de computadores trabalhando juntos para parecer como se fosse um único computador para o usuário final. Essas máquinas têm um estado compartilhado, operam de maneira concorrente e podem falhar independentemente sem afetar o tempo de atividade do sistema como um todo.</blockquote><p>Se você considerar o banco de dados como um estado compartilhado, poderia argumentar que isso pode ser classificado como um sistema distribuído — mas você estaria errado, pois você ignorou a parte "<em>trabalhando juntos</em>" da definição.</p><p>Um sistema é distribuído apenas se os nós se comunicarem entre si para coordenar suas ações. </p><p>Portanto, algo como uma aplicação que executa seu código de <em>back-end</em> em uma <a href="https://en.wikipedia.org/wiki/Peer-to-peer">rede peer-to-peer</a> (texto em inglês) pode ser melhor classificado como uma aplicação distribuída. Independentemente disso, toda essa classificação desnecessária não serve para nada além de ilustrar como somos detalhistas sobre agrupar coisas juntas. </p><blockquote>Escala conhecida – Por exemplo, o enxame BitTorrent de 193.000 nós para um episódio de Game of Thrones, em abril de 2014.</blockquote><h4 id="m-quina-virtual-com-erlang"><strong>Máquina virtual com <strong>Erlang</strong></strong></h4><p>Erlang é uma linguagem funcional que possui ótimas semânticas para concorrência, distribuição e tolerância a falhas. A própria máquina virtual com Erlang lida com a distribuição de uma aplicação do Erlang.</p><p>Seu modelo funciona tendo muitos <a href="https://en.wikipedia.org/wiki/Light-weight_process">processos leves</a> (texto em inglês) e <strong>isolados</strong>, todos com a capacidade de se comunicar entre si por meio de um sistema integrado de passagem de mensagens. Isso é chamado de <a href="http://berb.github.io/diploma-thesis/original/054_actors.html"><strong>Modelo de Ator</strong></a> (texto em inglês) e as bibliotecas Erlang OTP podem ser consideradas como um <em>framework </em>de atores distribuídos (similar ao <a href="https://akka.io/">Akka</a> para a JVM).</p><p>O modelo é o que ajuda a alcançar uma ótima concorrência de maneira bastante simples — os processos são distribuídos pelos núcleos disponíveis do sistema que os executa. Uma vez que isso é indistinguível de um ambiente de rede (exceto pela capacidade de descartar mensagens), a máquina virtual do Erlang pode se conectar a outras máquinas virtuais do Erlang em execução no mesmo <em>data center</em> ou até mesmo em outro continente. Esse conjunto de máquinas virtuais executa uma única aplicação e lida com falhas de máquina por meio de <em>takeover </em>(outro nó é escalonado para executar).</p><p>De fato, a camada distribuída da linguagem foi adicionada para fornecer tolerância a falhas. Software em execução em uma única máquina está sempre em risco de ter essa única máquina falhando e tirando sua aplicação do ar. O software em execução em muitos nós permite um manuseio mais fácil de falhas de hardware, desde que a aplicação tenha sido construída com isso em mente.</p><h4 id="bittorrent"><strong><strong>BitTorrent</strong></strong></h4><p>O BitTorrent é um dos protocolos mais amplamente utilizados para transferir arquivos grandes pela web por meio de <em>torrents</em>. A ideia principal é facilitar a transferência de arquivos entre diferentes pares na rede sem precisar passar por um servidor central.</p><p>Usando um <em>client</em> do BitTorrent, você se conecta a vários computadores ao redor do mundo para baixar um arquivo. Quando você abre um arquivo .torrent, você se conecta a um chamado <a href="https://en.wikipedia.org/wiki/BitTorrent_tracker"><strong><em>tracker</em></strong></a><em> (rastreador)</em>, que é uma máquina que age como coordenador. Ele ajuda na descoberta de pares, mostrando os nós na rede que têm o arquivo que você deseja.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-22.png" class="kg-image" alt="image-22" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-22.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-22.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Exemplo de uma rede</figcaption></figure><p>Você tem as noções de dois tipos de usuário, um <strong><em>leecher</em></strong> e um <strong><em>seeder</em></strong>. Um <em>leecher </em>é o usuário que está baixando um arquivo e um <em>seeder </em>é o usuário que está enviando esse arquivo.</p><p>O interessante sobre redes <em>peer-to-peer</em> é que você, como usuário comum, tem a capacidade de se juntar e contribuir para a rede. </p><p>O BitTorrent e seus precursores (<a href="https://en.wikipedia.org/wiki/Gnutella">Gnutella</a>, <a href="https://computer.howstuffworks.com/napster2.htm">Napster</a> – textos em inglês) permitem que você hospede arquivos voluntariamente e os envie para outros usuários que os desejam. A razão pela qual o BitTorrent é tão popular é que ele foi o primeiro de seu tipo a fornecer incentivos para contribuir com a rede. O problema do <strong><em>Freeriding</em></strong>, onde um usuário apenas baixava arquivos sem contribuir com <em>uploads</em>, era um desafio para os protocolos de compartilhamento de arquivos anteriores.</p><p>O BitTorrent resolveu o freeriding até certo ponto, fazendo com que os <em>seeders </em>enviassem mais para aqueles que fornecem as melhores taxas de download. Ele funciona incentivando você a fazer upload enquanto baixa um arquivo. Infelizmente, depois que você termina, nada o obriga a permanecer ativo na rede. Isso causa uma falta de seeders na rede que têm o arquivo completo e, como o protocolo depende fortemente de tais usuários, soluções como <a href="https://www.reddit.com/r/torrents/comments/2413bo/how_and_why_do_private_trackers_exist/ch2o1bo/">rastreadores privados</a> (texto em inglês) surgiram. Rastreadores privados exigem que você seja membro de uma comunidade (geralmente apenas por convite) para participar da rede distribuída.</p><p>Após avanços na área, <em>torrents </em>sem rastreadores foram inventados. Essa foi uma atualização para o protocolo BitTorrent que não dependia de rastreadores centralizados para reunir metadados e encontrar pares, mas usava novos algoritmos. Um exemplo disso é o <a href="https://en.wikipedia.org/wiki/Kademlia">Kademlia</a> (<a href="https://en.wikipedia.org/wiki/Mainline_DHT">Mainline DHT</a>) (textos em inglês), uma tabela de <em>hash </em>distribuída (DHT) que permite encontrar pares através de outros pares. Na prática, cada usuário desempenha as funções de um rastreador.</p><h3 id="registros-distribu-dos">Registros<strong> d<strong>istribuí</strong>dos</strong></h3><p>Um registro distribuído pode ser pensado como um banco de dados imutável, de apenas anexação, que é replicado, sincronizado e compartilhado entre todos os nós na rede distribuída.</p><blockquote>Escala conhecida – <a href="https://etherscan.io/chart/tx">a Rede Ethereum teve um pico de 1,3 milhão de transações por dia em 4 de janeiro de 2018</a></blockquote><p>Eles aproveitam o padrão de <a href="https://martinfowler.com/eaaDev/EventSourcing.html">Event Sourcing</a> (texto em inglês), permitindo que você reconstrua o estado do registro em qualquer momento de sua história.</p><h4 id="blockchain"><strong><strong>Blockchain</strong></strong></h4><p>A tecnologia Blockchain é atualmente usada para os registros distribuídos e, na verdade, marcou seu início. Essa mais recente e revolucionária inovação no espaço distribuído possibilitou a criação do primeiro protocolo de pagamento verdadeiramente distribuído – o Bitcoin.</p><p>Blockchain é um registro distribuído que carrega uma lista ordenada de todas as transações que já ocorreram em sua rede. As transações são agrupadas e armazenadas em blocos. O blockchain inteiro é essencialmente uma <a href="https://www.andrew.cmu.edu/course/15-121/lectures/Linked%20Lists/linked%20lists.html">lista encadeada</a> (texto em inglês) de blocos (daí o nome). Esses blocos são computacionalmente caros de serem criados e estão intimamente ligados entre si por meio de criptografia.</p><p>Dito de maneira simples, cada bloco contém um <em>hash </em>especial (que começa com uma quantidade X de zeros) do conteúdo do bloco atual (na forma de uma Árvore de Merkle) mais o <em>hash </em>do bloco anterior. Esse <em>hash </em>requer muita potência de CPU para ser produzido porque a única maneira de obtê-lo é através de força bruta.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-26.png" class="kg-image" alt="image-26" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-26.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-26.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Blockchain simplificado</figcaption></figure><p>Os <em><strong>miners</strong> </em>(mineradores) são os nós que tentam calcular o <em>hash </em>(via força bruta). Os <em>miners </em>competem entre si para ver quem consegue encontrar uma string aleatória (chamada de <strong>nonce</strong>) que, quando combinada com o conteúdo, produz o <em>hash </em>mencionado anteriormente. Uma vez que alguém encontre o nonce correto, ele o transmite para toda a rede. Essa string é então verificada por cada nó individualmente e aceita em sua cadeia.</p><p>Isso se traduz em um sistema onde é absurdamente caro modificar o blockchain e absurdamente fácil verificar se ele não foi adulterado.</p><p>É caro alterar o conteúdo de um bloco porque isso produziria um <em>hash </em>diferente. Lembre-se de que o <em>hash </em>de cada bloco subsequente depende dele. Se você mudasse uma transação no primeiro bloco da imagem acima, você mudaria a Raiz de Merkle. Isso, por sua vez, mudaria o <em>hash </em>do bloco (provavelmente sem os zeros iniciais necessários) — isso mudaria o <em>hash </em>do bloco nº 2 e assim por diante. Isso significa que você precisaria forçar um novo nonce para cada bloco após aquele que você acabou de modificar.</p><p>A rede sempre confia e replica a cadeia válida mais longa. Para trapacear o sistema e <strong>eventualmente</strong> produzir uma cadeia mais longa, você precisaria de mais de 50% do poder total de processamento da CPU usado por todos os nós.</p><p>O blockchain pode ser pensado como um mecanismo distribuído para o <em><strong>consenso emergente</strong></em>. O consenso não é alcançado explicitamente — não há eleição ou momento fixo em que o consenso ocorre. Em vez disso, o consenso é um produto <strong>emergente</strong> da interação assíncrona de milhares de nós independentes, todos seguindo regras de protocolo.</p><p>Essa inovação sem precedentes recentemente se tornou um boom no espaço tecnológico, com pessoas prevendo que marcará a criação da <a href="https://medium.com/@matteozago/why-the-web-3-0-matters-and-you-should-know-about-it-a5851d63c949">Web 3.0</a> (texto em inglês). É definitivamente o espaço mais emocionante no mundo da engenharia de software no momento, repleto de problemas extremamente desafiadores e interessantes esperando para serem resolvidos.</p><p><strong><strong>Bitcoin</strong></strong></p><p>O que os protocolos de pagamento distribuídos anteriores não tinham era uma maneira de prevenir de maneira prática o <a href="https://en.wikipedia.org/wiki/Double-spending">problema de gasto duplo</a> (texto em inglês) em tempo real e de maneira distribuída. Pesquisas produziram propostas interessantes[1], mas o Bitcoin foi o primeiro a implementar uma solução prática com vantagens claras sobre os outros. </p><p>O problema de gasto duplo afirma que um ator (por exemplo, Bob) não pode gastar seu único recurso em dois lugares. Se Bob tem $1, ele não deveria poder entregá-lo tanto para Alice quanto para Zack — é apenas um recurso, não pode ser duplicado. Acontece que é realmente difícil alcançar verdadeiramente essa garantia em um sistema distribuído. Existem <a href="https://arxiv.org/abs/0802.0832v1">algumas abordagens de mitigação interessantes</a> (texto em inglês) anteriores ao blockchain, mas elas não resolvem completamente o problema de maneira prática. </p><p>O problema de gasto duplo é facilmente resolvido pelo Bitcoin, pois apenas um bloco é adicionado à cadeia de cada vez. O gasto duplo é impossível dentro de um único bloco, portanto, mesmo que dois blocos sejam criados ao mesmo tempo — apenas um virá a fazer parte da cadeia mais longa eventualmente.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_Q7OSbezEhFEUXjhQ4mrVDg.jpeg" class="kg-image" alt="1_Q7OSbezEhFEUXjhQ4mrVDg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/1_Q7OSbezEhFEUXjhQ4mrVDg.jpeg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_Q7OSbezEhFEUXjhQ4mrVDg.jpeg 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>O Bitcoin depende da dificuldade de acumular poder de processamento da CPU.</p><p>Enquanto em um sistema de votação um atacante só precisa adicionar nós à rede (o que é fácil, já que o acesso gratuito à rede é uma meta de projeto), em um esquema baseado em poder de CPU, um atacante enfrenta uma limitação física: obter acesso a hardware cada vez mais poderoso.</p><p>Essa também é a razão pela qual grupos maliciosos de nós precisam controlar mais de 50% do poder computacional da rede para realmente realizar qualquer ataque bem-sucedido. Menos do que isso, e o restante da rede criará um blockchain mais longo mais rapidamente.</p><h4 id="ethereum"><strong><strong>Ethereum</strong></strong></h4><p>Ethereum pode ser considerado como uma plataforma de software baseada em blockchain programável. Ele tem sua própria criptomoeda (Ether), que alimenta a implementação de <strong><em>contratos inteligentes</em></strong> em seu blockchain. </p><p>Contratos inteligentes são um pedaço de código armazenado como uma única transação no blockchain do Ethereum. Para executar o código, tudo o que você precisa fazer é emitir uma transação com um contrato inteligente como seu destino. Isso, por sua vez, faz com que os nós mineradores executem o código e quaisquer mudanças que ele incorra. O código é executado dentro da Máquina Virtual Ethereum.</p><p><strong><em>Solidity</em></strong>, a linguagem de programação nativa do Ethereum, é o que é usado para escrever contratos inteligentes. É uma linguagem de programação completa de Turing que interage diretamente com o blockchain do Ethereum, permitindo que você consulte o estado, como saldos ou outros resultados de contratos inteligentes. Para evitar loops infinitos, executar o código requer uma certa quantidade de Ether.</p><p>Como o blockchain pode ser interpretado como uma série de <strong><em>mudanças de estado</em></strong>, muitas aplicações distribuídas (<a href="https://medium.com/the-mission/2018-the-year-of-dapps-dbe108860bcb">DApps</a>; texto em inglês) foram construídas em cima do Ethereum e plataformas similares.</p><h3 id="outros-usos-de-registros-distribu-dos">Outros usos de registros distribuídos</h3><p><em><strong><a href="https://en.wikipedia.org/wiki/Proof_of_Existence">Prova de Existência</a></strong></em> (texto em inglês) — um serviço para armazenar de maneira anônima e segura a prova de que um determinado documento digital existia em algum momento no tempo. Útil para garantir a integridade do documento, propriedade e registro de data e hora.</p><p><a href="https://en.wikipedia.org/wiki/Decentralized_autonomous_organization"><strong><em>Organizações autônomas descentralizadas</em></strong></a> (DAO; texto em inglês) — organizações que utilizam blockchain como meio de alcançar consenso sobre as proposições de melhoria da organização. Exemplos são o <a href="https://www.dash.org/governance/">sistema de governança da Dash</a> e o <a href="https://smartcash.readthedocs.io/en/latest/">projeto SmartCash</a> (textos em inglês).</p><p><em><strong>Autenticação descentralizada</strong></em> — armazene sua identidade no blockchain, permitindo que você use <a href="https://en.wikipedia.org/wiki/Single_sign-on">logins únicos</a> em todos os lugares (<em>single sign-on</em>; SSO). Exemplos são <a href="https://sovrin.org/">Sovrin</a> e <a href="https://www.civic.com/products/secure-identity-platform">Civic</a> (textos em inglês).</p><p><em>Há muitos, muitos outros. A tecnologia de registro distribuído realmente abriu possibilidades infinitas. Alguns, provavelmente, estão sendo inventados enquanto falamos!</em></p><p><strong>Resumo</strong></p><p>No curto espaço deste artigo, conseguimos definir o que é um sistema distribuído, por que você usaria um e passamos brevemente por cada categoria. Algumas coisas importantes para lembrar são:</p><ul><li>Sistemas distribuídos são complexos </li><li>São escolhidos pela necessidade de escala e preço </li><li>São mais difíceis de trabalhar</li><li>Teorema CAP — escolha entre Consistência e Disponibilidade</li><li>Eles têm 6 categorias — armazenamento de dados, computação, sistemas de arquivos, sistemas de mensagens, registros, aplicações</li></ul><p>Para ser sincero, mal arranhamos a superfície dos sistemas distribuídos. Não tive a chance de abordar minuciosamente e explicar problemas fundamentais como <a href="https://www.cs.rutgers.edu/~pxk/417/notes/content/consensus.html">consenso</a>, <a href="http://www.cloudbus.org/papers/DataReplicationInDSChapter2006.pdf">estratégias de replicação</a>, <a href="https://swizec.com/blog/week-7-time-clocks-and-ordering-of-events-in-a-distributed-system/swizec/6444">ordenação de eventos e tempo</a>, <a href="http://blog.empathybox.com/post/19574936361/getting-real-about-distributed-system-reliability">tolerância a falhas</a>, <a href="https://www.distributed-systems.net/my-data/papers/2007.osr.pdf">transmissão de mensagens pela rede</a> e <a href="http://the-paper-trail.org/blog/distributed-systems-theory-for-the-distributed-systems-engineer/">outros</a> (textos em inglês).</p><h2 id="aten-o">Atenção</h2><p>Deixe-me compartilhar com você um aviso final:</p><p>Você deve evitar os sistemas distribuídos o máximo possível. A sobrecarga de complexidade que eles trazem consigo não vale o esforço se você puder evitar o problema resolvendo-o de uma maneira diferente ou por meio de alguma outra solução criativa.</p><p><em><em><strong><strong>[1]</strong></strong></em></em><br><a href="https://ieeexplore.ieee.org/document/4268195/">Combate ao duplo gasto usando sistemas P2P cooperativos</a> (texto em inglês), 25 a 27 de junho de 2007 — uma solução proposta na qual cada 'moeda' pode expirar e é atribuído um testemunho (validador) a ela ao ser gasta.</p><p><a href="http://web.archive.org/web/20060329122942/http://unenumerated.blogspot.com/2005/12/bit-gold.html">Bitgold</a> (texto em inglês), dezembro de 2005 — uma visão geral de alto nível de um protocolo extremamente semelhante ao do Bitcoin. Diz-se que ele é o precursor do Bitcoin.</p><p><strong>Leituras adicionais sobre sistemas distribuídos<strong>:</strong></strong></p><p><a href="https://dataintensive.net/">Designing Data-Intensive Applications, Martin Kleppmann</a> — um ótimo livro que aborda tudo sobre sistemas distribuídos e muito mais (em inglês).</p><p><a href="https://www.coursera.org/specializations/cloud-computing">Especialização em computação em nuvem, Universidade de Illinois, Coursera</a> — uma série de cursos (6) que aborda conceitos de sistemas distribuídos e suas aplicações.</p><p><a href="https://aphyr.com/tags/Jepsen">Jepsen</a> — blog que explica muitas tecnologias distribuídas (ElasticSearch, Redis, MongoDB etc).</p><p>Obrigado por dedicar seu tempo para ler este longo artigo (mais de 6.700 palavras)!</p><p>Se, por acaso, você achou este artigo informativo ou considerou que ele proporcionou valor a você, por favor, considere compartilhá-lo com um amigo que possa se beneficiar de uma introdução a esse maravilhoso campo de estudo.</p><h3 id="sobre-stanislav-kozlovski">Sobre Stanislav Kozlovski</h3><p>O autor, atualmente, trabalha na <a href="http://confluent.io/">Confluent</a>. Confluent é uma empresa de Big Data fundada pelos próprios criadores do <a href="https://hackernoon.com/thorough-introduction-to-apache-kafka-6fbf2989bbc1">Apache Kafka</a>! Ele se diz imensamente grato pela oportunidade que lhe deram – atualmente, ele trabalha no próprio Kafka, o que considera incrível! Na Confluent, eles ajudam a moldar todo o ecossistema Kafka de código aberto, incluindo uma nova oferta gerenciada de nuvem Kafka como serviço.</p><p>A Confluent contrata para vários cargos (especialmente SRE/Engenheiros de Software) na Europa e nos EUA! Se você estiver interessado em trabalhar no próprio Kafka, em busca de novas oportunidades ou simplesmente curioso – envie para o autor uma mensagem no <a href="https://twitter.com/StanKozlovski">Twitter</a> e ele se oferece a compartilhar todas as grandes vantagens de se trabalhar por lá.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como adicionar HTTPS ao seu site gratuitamente em 10 minutos e qual a importância disso ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Ayo Isaiah Em 2018, o Google anunciou que o Chrome passaria a marcar todas as páginas HTTP como "Não seguras" [https://security.googleblog.com/2018/02/a-secure-web-is-here-to-stay.html] em sua versão 68. > Nota da tradução: A versão mais recente do Chrome no momento desta tradução é a versão 114. A mudança na barra de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-adicionar-https-ao-seu-site-gratuitamente-em-10-minutos-e-qual-a-importancia-disso/</link>
                <guid isPermaLink="false">64a4cae8d4e9dc0571a4080b</guid>
                
                    <category>
                        <![CDATA[ Segurança ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcelo Pena ]]>
                </dc:creator>
                <pubDate>Tue, 01 Aug 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/0_G1aejey06DjtUAcO_.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/free-https-c051ca570324/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to add HTTPS to your website for free in 10 minutes, and why you need to do this now more than…</a>
      </p><p>Escrito por: Ayo Isaiah</p><p>Em 2018, o Google anunciou que o Chrome passaria a marcar todas as <a href="https://security.googleblog.com/2018/02/a-secure-web-is-here-to-stay.html">páginas HTTP como "Não seguras"</a> em sua versão 68.</p><blockquote>Nota da tradução: A versão mais recente do Chrome no momento desta tradução é a versão 114.</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/KJlpSH4gFVWnNr3gacsE9dQS1bnioHJHOdQK.png" class="kg-image" alt="KJlpSH4gFVWnNr3gacsE9dQS1bnioHJHOdQK" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/KJlpSH4gFVWnNr3gacsE9dQS1bnioHJHOdQK.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/KJlpSH4gFVWnNr3gacsE9dQS1bnioHJHOdQK.png 640w" width="640" height="231" loading="lazy"><figcaption>A mudança na barra de endereços do Chrome</figcaption></figure><p>Este foi o empurrão mais forte para direcionar a web para a criptografia por padrão e foi esperado há muito tempo.</p><p>Embora haja muitas evidências que mostram por que todos deveriam entrar na tendência do HTTPS, muitas pessoas ainda não enxergam o valor em oferecer seus sites de maneira segura.</p><p><em>"Por que eu preciso disso para um blog?"</em></p><p>Já escrevi sobre o <a href="https://freshman.tech/the-value-of-https/">valor do HTTPS</a> anteriormente (texto em inglês), mas apenas para reiterar:</p><ul><li>O HTTPS protege os usuários contra ataques <a href="https://freshman.tech/the-value-of-https/#https-prevents-man-in-the-middle-attacks"><em>Man-In-the-Middle</em></a><em> (texto em inglês)</em>.</li><li>O HTTPS é necessário para aproveitar muitos <a href="https://freshman.tech/the-value-of-https/#many-browser-features-are-exclusive-to-https">novos recursos dos navegadores</a> (texto em inglês), como os "Service Workers"</li><li>HTTPS afeta o <a href="https://freshman.tech/the-value-of-https/#https-can-provide-seo-benefits">SEO</a> (texto em inglês)</li></ul><p>Se você não estiver convencido, leia o <a href="https://doesmysiteneedhttps.com/">DoMysiteneedhttps.com</a> (texto em inglês) para obter a visão completa do porquê todo site da web deve ter segurança.</p><p>Se você ainda não se convenceu, saiba a vida está prestes a se tornar muito mais difícil para você.</p><p>Em um esforço para afastar os usuários de sites inseguros, os navegadores desencorajam sites inseguros em certos contextos.</p><p>O Chrome 56 iniciou essa tendência ao marcar as páginas com campos sensíveis de login como "Não seguro", enquanto o Chrome 62 estendeu esse aviso a todas as páginas HTTP que continham qualquer tipo de campo de entrada. Além disso, o aviso é exibido em todas as páginas HTTP no modo de navegação anônima, independentemente de conterem um campo de entrada ou não.</p><p>O Firefox também alerta os usuários quando tentam preencher um formulário de login inseguro.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/image-3-1.png" class="kg-image" alt="image-3-1" width="567" height="260" loading="lazy"></figure><p>O Chrome decidiu, a partir de 2018, colocar esse aviso em todas as páginas HTTP daqui para frente. O ícone ao lado do rótulo "Não seguro" mudou e o texto passou a ficar em vermelho para enfatizar ainda mais que as páginas HTTP não são confiáveis.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/image-4-1.png" class="kg-image" alt="image-4-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/image-4-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/image-4-1.png 750w" sizes="(min-width: 720px) 720px" width="750" height="363" loading="lazy"></figure><p>Para evitar que os usuários vejam este aviso em seu site, tudo o que você precisa é obter um certificado SSL válido. A boa notícia é que fazer isso não é tão difícil ou caro como costumava ser. Na verdade, vou mostrar como implantar HTTPS em seu site gratuitamente usando o <a href="https://www.cloudflare.com/">Cloudflare</a>. Não vai demorar muito.</p><h3 id="por-que-usar-o-cloudflare">Por que usar o Cloudflare?</h3><p>O CloudFlare pode ajudá-lo a proteger um certificado SSL gratuitamente, independentemente da infraestrutura do lado do servidor que você possui. Ele também funciona para sites hospedados em plataformas que não fornecem acesso ao servidor, como <a href="https://pages.github.com/">GitHub Pages</a>, <a href="https://ghost.org/">Ghost</a> e similares.</p><p>Você não precisa instalar nada nem escrever código. Isso o torna uma ótima opção para implantar HTTPS em seu site e o tempo de configuração não deve levar mais de 10 minutos.</p><p>Ele também fornece uma infinidade de outros benefícios em segurança e desempenho do seu site que não abordarei aqui. Falarei um pouco, no entanto, a respeito de como tudo funciona para que você tenha uma boa ideia de como ele é capaz de fazer todas essas coisas.</p><h3 id="como-funciona-o-cloudflare">Como funciona o Cloudflare</h3><p>O Cloudflare fica bem no meio do tráfego entre os visitantes do seu site e seu servidor. Os visitantes podem ser humanos comuns, rastreadores e bots (como bots de mecanismos de pesquisa) ou hackers. Ao agir como um intermediário entre seu servidor da web e os visitantes de seu site, o Cloudflare ajuda a filtrar todo o tráfego ilegítimo para que apenas as coisas boas passem.</p><p>Agora você deve estar se perguntando se tudo isso pode ter um efeito adverso na velocidade do seu site, mas é exatamente o contrário. O Cloudflare tem centros de dados em todo o mundo. Portanto, usará apenas o endpoint mais próximo do visitante, o que deve tornar seu site muito mais rápido do que antes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/Lc-xzCU5Cw0u2x-u8zDwE3TFVbv-aUj-JjqK.png" class="kg-image" alt="Lc-xzCU5Cw0u2x-u8zDwE3TFVbv-aUj-JjqK" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/Lc-xzCU5Cw0u2x-u8zDwE3TFVbv-aUj-JjqK.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/Lc-xzCU5Cw0u2x-u8zDwE3TFVbv-aUj-JjqK.png 800w" sizes="(min-width: 720px) 720px" width="800" height="474" loading="lazy"><figcaption>Distribuição da rede global do Cloudflare</figcaption></figure><p>Agora que sabemos como o Cloudflare funciona, vamos dar uma olhada em como configurar um site em sua infraestrutura e como acessar o HTTPS gratuitamente. O foco, aqui, será nos recursos que o Cloudflare fornece gratuitamente, mas observe que os planos pagos também estão disponíveis com vários recursos extras.</p><h3 id="configurando-um-novo-site">Configurando um novo site</h3><p>Depois de se <a href="https://www.cloudflare.com/a/sign-up">cadastrar</a> no Cloudflare, a primeira coisa a fazer é adicionar um domínio e escanear [<em>scan</em>] os registros DNS. [disponível em português]</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/o1eN1nEZhtbcRaATWZ1p-nQUCwFBsrWEpalQ.png" class="kg-image" alt="o1eN1nEZhtbcRaATWZ1p-nQUCwFBsrWEpalQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/o1eN1nEZhtbcRaATWZ1p-nQUCwFBsrWEpalQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/o1eN1nEZhtbcRaATWZ1p-nQUCwFBsrWEpalQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="410" loading="lazy"></figure><p>Depois que a verificação for concluída, todos os registros DNS no domínio serão exibidos. Você pode escolher os subdomínios nos quais deseja habilitar o Cloudflare e fazer as modificações desejadas. Quando estiver pronto, clique em <strong><strong><em>Continue</em></strong></strong> para ir para a próxima etapa.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/XTjdrU156BPJ2Foa2rZuyNAjs53doMdCrJRN.png" class="kg-image" alt="XTjdrU156BPJ2Foa2rZuyNAjs53doMdCrJRN" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/XTjdrU156BPJ2Foa2rZuyNAjs53doMdCrJRN.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/XTjdrU156BPJ2Foa2rZuyNAjs53doMdCrJRN.png 800w" sizes="(min-width: 720px) 720px" width="800" height="420" loading="lazy"></figure><p>Selecione o plano gratuito (<em>Free Website</em>) e clique em <strong><strong><em>Continue</em></strong></strong>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/Nc7rVPCFdQ9LKxx-oEFCj-3zlrjrQqgNQvcO.png" class="kg-image" alt="Nc7rVPCFdQ9LKxx-oEFCj-3zlrjrQqgNQvcO" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/Nc7rVPCFdQ9LKxx-oEFCj-3zlrjrQqgNQvcO.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/Nc7rVPCFdQ9LKxx-oEFCj-3zlrjrQqgNQvcO.png 800w" sizes="(min-width: 720px) 720px" width="800" height="541" loading="lazy"></figure><p>Em seguida, você precisará alterar os <em>Nameservers</em> em seu provedor de registro de domínio para os fornecidos pelo Cloudflare. O processo para fazer isso em cada provedor de registro de domínio é um pouco diferente. Portanto, verifique com o seu provedor.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/xnHu2o4MJrpckhGOvUsDcUoGz0UuujOvxDsU.png" class="kg-image" alt="xnHu2o4MJrpckhGOvUsDcUoGz0UuujOvxDsU" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/xnHu2o4MJrpckhGOvUsDcUoGz0UuujOvxDsU.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/xnHu2o4MJrpckhGOvUsDcUoGz0UuujOvxDsU.png 800w" sizes="(min-width: 720px) 720px" width="800" height="412" loading="lazy"></figure><p>Veja como fica no provedor <a href="http://namecheap.com/" rel="noopener">Namecheap</a>:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/-C7vA1eZcIpP3B5vcq-qYK1eC1Y8Khq8PI9H.png" class="kg-image" alt="-C7vA1eZcIpP3B5vcq-qYK1eC1Y8Khq8PI9H" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/-C7vA1eZcIpP3B5vcq-qYK1eC1Y8Khq8PI9H.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/-C7vA1eZcIpP3B5vcq-qYK1eC1Y8Khq8PI9H.png 786w" sizes="(min-width: 720px) 720px" width="786" height="161" loading="lazy"><figcaption>Alterando nameservers no provedor Namecheap</figcaption></figure><p>Agora, você deve esperar que as alterações do <em>nameserver </em>terminem de se propagar. Clique em <em><strong>Recheck Nameservers</strong></em> depois de um tempo para ver se seu site agora está ativo no Cloudflare. Essa é a parte mais demorada da configuração e pode levar até 24 horas, mas, na minha experiência, levou menos de 5 minutos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/9oHlGNn4TMApCJw1v2GWyQ9ulTA-egOhF6Ew.png" class="kg-image" alt="9oHlGNn4TMApCJw1v2GWyQ9ulTA-egOhF6Ew" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/9oHlGNn4TMApCJw1v2GWyQ9ulTA-egOhF6Ew.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/9oHlGNn4TMApCJw1v2GWyQ9ulTA-egOhF6Ew.png 800w" sizes="(min-width: 720px) 720px" width="800" height="436" loading="lazy"></figure><p>Depois que as atualizações do nameserver forem validadas pela Cloudflare, seu site se tornará ativo no serviço.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/1AgkTO0uBz8lv0fAdrJhGXz8Rg5nkPfaZDVO.png" class="kg-image" alt="1AgkTO0uBz8lv0fAdrJhGXz8Rg5nkPfaZDVO" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/1AgkTO0uBz8lv0fAdrJhGXz8Rg5nkPfaZDVO.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/1AgkTO0uBz8lv0fAdrJhGXz8Rg5nkPfaZDVO.png 800w" sizes="(min-width: 720px) 720px" width="800" height="151" loading="lazy"></figure><p>Se você quiser ter certeza absoluta de que suas configurações de DNS se propagaram em todos os lugares, o <a href="http://whatsmydns.net/">What's My DNS</a> fornece uma maneira de verificar qual endereço IP seu domínio resolve em locais diferentes.</p><p>Você também pode usar <code>dig</code> ou <code>nslookup</code> na linha de comando para verificar a configuração de DNS do seu domínio.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/WAC1LFbxuDtbk-hXxrqot4vUKIxl6b3yFUi9.png" class="kg-image" alt="WAC1LFbxuDtbk-hXxrqot4vUKIxl6b3yFUi9" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/WAC1LFbxuDtbk-hXxrqot4vUKIxl6b3yFUi9.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/WAC1LFbxuDtbk-hXxrqot4vUKIxl6b3yFUi9.png 800w" sizes="(min-width: 720px) 720px" width="800" height="570" loading="lazy"><figcaption>Na seção ANSWER SECTION, você verá para qual endereço IP seu domínio resolve</figcaption></figure><p>Assim, você pode ter certeza de que todo o tráfego que vai para o seu domínio agora está sendo roteado pelo Cloudflare.</p><p>Antes de começar a configurar o Cloudflare, certifique-se de que seu navegador não esteja usando os registros DNS antigos de seu cache. No Chrome e no Firefox, você pode fazer isso limpando o histórico do navegador.</p><h3 id="obtendo-ssl-gratuitamente"><strong>Obtendo SSL gratuitamente</strong></h3><p>O SSL ainda é um serviço <em>premium</em> e muitas Autoridades Certificadoras cobram quantias significativas antes de emitir um certificado SSL. Não é algo que você possa obter de graça em algum lugar, mas isso está mudando rapidamente na indústria.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/kIkCSgOncnKEkE5LClz1UeV0dVDP4i8CFZPw.png" class="kg-image" alt="kIkCSgOncnKEkE5LClz1UeV0dVDP4i8CFZPw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/kIkCSgOncnKEkE5LClz1UeV0dVDP4i8CFZPw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/kIkCSgOncnKEkE5LClz1UeV0dVDP4i8CFZPw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="348" loading="lazy"><figcaption>A Comodo cobra US$ 99,95/ano por um certificado SSL</figcaption></figure><p>Agora que você tem o Cloudflare no meio do tráfego da web, você deve obter o SSL em seu domínio automaticamente. Pode levar até 24 horas para que o certificado fique ativo, mas, pela minha experiência, não demora muito.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/cZyriRiq6Ao4k48mLCYMjtaLR-aHLa824hXj.png" class="kg-image" alt="cZyriRiq6Ao4k48mLCYMjtaLR-aHLa824hXj" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/cZyriRiq6Ao4k48mLCYMjtaLR-aHLa824hXj.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/cZyriRiq6Ao4k48mLCYMjtaLR-aHLa824hXj.png 800w" sizes="(min-width: 720px) 720px" width="800" height="207" loading="lazy"><figcaption>Você pode verificar se o certificado do seu site está ativo nas configurações de criptografia.</figcaption></figure><p>Depois que o certificado se tornar ativo, carregue seu site em um navegador. Você deve ver o site servido por HTTPS e um belo cadeado verde na barra de endereços.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/7ehfhEpKBWEG71hCcQY147j1bBiOQ2Q4YLSF.png" class="kg-image" alt="7ehfhEpKBWEG71hCcQY147j1bBiOQ2Q4YLSF" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/7ehfhEpKBWEG71hCcQY147j1bBiOQ2Q4YLSF.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/7ehfhEpKBWEG71hCcQY147j1bBiOQ2Q4YLSF.png 800w" sizes="(min-width: 720px) 720px" width="800" height="312" loading="lazy"></figure><p>Se você visualizar mais informações sobre o certificado, verá a autoridade de certificação que o emitiu (a Comodo, no meu caso) e a data de validade. Uma das grandes vantagens do Cloudflare é que a renovação do certificado é feita automaticamente para você. Assim, não é preciso se preocupar.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/E6A0jelflOxpON3l4OG-p16p7Qy8udwHqtps.png" class="kg-image" alt="E6A0jelflOxpON3l4OG-p16p7Qy8udwHqtps" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/E6A0jelflOxpON3l4OG-p16p7Qy8udwHqtps.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/E6A0jelflOxpON3l4OG-p16p7Qy8udwHqtps.png 684w" width="684" height="583" loading="lazy"></figure><h3 id="diferen-a-entre-ssls-flexible-full-e-full-strict-"><strong>Diferença entre SSLs Flexible, Full e Full (Strict)</strong></h3><p>O Cloudflare torna muito fácil obter o SSL em seu site gratuitamente sem configurar nada, mas nem sempre é o mesmo que servir seu site por SSL diretamente da origem.</p><p>Existem três implementações do SSL do Cloudflare. O primeiro, que você obtém por padrão, é o SSL Flexible. Nesse caso, o tráfego é criptografado entre os usuários do seu site e o Cloudflare, mas essa criptografia não chega até o servidor de origem. O Cloudflare ainda se comunica com seu servidor por HTTP simples.</p><p>Isso significa que qualquer "Man-In-The-Middle" (como provedores de rede) entre o Cloudflare e seu servidor pode ver o tráfego. Se você coletar informações confidenciais em seu site, evite usar essa opção.</p><p>Para ter criptografia até o servidor de origem, você precisa usar a implementação Full ou Full (Strict). O primeiro exige que você instale um certificado válido em seu servidor, mas a autenticidade do certificado não será verificada para que você possa obter um certificado autoassinado. Por outro lado, a implementação Full (Strict) requer que você instale um certificado SSL válido que tenha sido assinado por uma Autoridade de Certificação confiável.</p><p>Se você não deseja comprar SSL de empresas como a Comodo, pode obter certificados Origin CA gratuitos do Cloudflare, que podem ser usados com as opções Full ou Full(Strict), pois são confiáveis para o Cloudflare. Lembre-se, porém, de que esses certificados são confiáveis apenas para o Cloudflare. Deste modo, eles pararão de funcionar se você decidir retirar seu site da infraestrutura do Cloudflare.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/N2mQFmlgiPlsshjqQml8DLEYBpCfSAwW0049.png" class="kg-image" alt="N2mQFmlgiPlsshjqQml8DLEYBpCfSAwW0049" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/N2mQFmlgiPlsshjqQml8DLEYBpCfSAwW0049.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/N2mQFmlgiPlsshjqQml8DLEYBpCfSAwW0049.png 800w" sizes="(min-width: 720px) 720px" width="800" height="208" loading="lazy"></figure><p>Se você não controlar seu ambiente de servidor (por exemplo, se seu site estiver hospedado no GitHub Pages ou plataformas semelhantes), não poderá usar as implementações Full ou Full (Strict), o que significa que, mesmo que seus usuários vejam HTTPS na barra de endereço, o tráfego não será criptografado até o servidor de origem.</p><p>É, contudo, uma grande melhoria em comparação a ter nenhum HTTPS, porque protegerá seus usuários contra "Man-In-The-Middle" no lado do <em>client</em>.</p><h3 id="fortalecer-a-implementa-o-de-ssl"><strong>Fortalecer a implementação de SSL</strong></h3><p>Não importa por qual implementação SSL você opte, existem maneiras de fortalecê-la para garantir que os usuários nunca acessem seu site por HTTP inseguro. O <a href="https://www.ssllabs.com/ssltest/">Qualys SSL Labs</a> é uma ferramenta que ajuda você a executar um teste em sua configuração SSL para ver se há espaço para melhorias.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/f9yR7vx-50TyrX2lWQjMTOiFBwc2oUzoUr3W.png" class="kg-image" alt="f9yR7vx-50TyrX2lWQjMTOiFBwc2oUzoUr3W" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/f9yR7vx-50TyrX2lWQjMTOiFBwc2oUzoUr3W.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/f9yR7vx-50TyrX2lWQjMTOiFBwc2oUzoUr3W.png 800w" sizes="(min-width: 720px) 720px" width="800" height="460" loading="lazy"></figure><p>Mesmo que eu tenha uma nota A em meu domínio, se você detalhar os resultados, verá que definitivamente há espaço para melhorias nos lados da Key Exchange (Troca de Chave) e da Cipher Strength (Força do Ciframento).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/EflHwo97oxMhSWGIz6Gu3Xkbq32PwDsBMUl-.png" class="kg-image" alt="EflHwo97oxMhSWGIz6Gu3Xkbq32PwDsBMUl-" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/EflHwo97oxMhSWGIz6Gu3Xkbq32PwDsBMUl-.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/EflHwo97oxMhSWGIz6Gu3Xkbq32PwDsBMUl-.png 800w" sizes="(min-width: 720px) 720px" width="800" height="334" loading="lazy"></figure><p>Vamos dar uma olhada em algumas coisas que podemos fazer no Cloudflare para fortalecer nosso SSL e obter classificações ainda mais altas.</p><h4 id="for-ar-https-em-todos-os-lugares"><strong>Forçar HTTPS em todos os lugares</strong></h4><p>Depois de usar o HTTPS, você definitivamente desejará impedir que os usuários acessem seu site por meio de uma conexão insegura. Isso pode ser feito no Cloudflare redirecionando todo o tráfego HTTP para HTTPS com um redirecionamento 301.</p><p>Nas configurações de criptografia, encontre a opção <strong><strong>Always use HTTPS</strong></strong> (sempre usa HTTPS) e ative-a.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/x1VBeW7nD6Hitnfm6QHowq2bhGAhDXZEsOHw.png" class="kg-image" alt="x1VBeW7nD6Hitnfm6QHowq2bhGAhDXZEsOHw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/x1VBeW7nD6Hitnfm6QHowq2bhGAhDXZEsOHw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/x1VBeW7nD6Hitnfm6QHowq2bhGAhDXZEsOHw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="140" loading="lazy"></figure><h4 id="habilitar-a-seguran-a-estrita-de-transporte-http-hsts-">Habilitar a segurança estrita de transporte HTTP <strong>(HSTS</strong>)</h4><p><a href="https://freshman.tech/securing-your-website/#http-strict-transport-security-hsts">No passado, escrevi sobre como o HSTS fortalece o SSL</a> do seu site (texto em inglês), mas vamos revisar brevemente.</p><p>O problema ao redirecionar o tráfego HTTP para HTTPS usando apenas um redirecionamento 301 é que a solicitação inicial insegura ainda é enviada pela rede, o que significa que pode ser lida por qualquer pessoa com acesso ao tráfego.</p><p>O HSTS é um cabeçalho de resposta que resolve esse problema, informando ao navegador que ele não pode fazer uma solicitação insegura a um site por um período de tempo especificado.</p><p>Esta é a aparência do cabeçalho:</p><pre><code>strict-transport-security: max-age=31536000</code></pre><p><br>Assim que o navegador receber esse cabeçalho, ele não fará uma solicitação insegura ao seu site pelos próximos 31.536.000 segundos (equivalente a um ano). Em vez disso, todas as solicitações HTTP serão atualizadas internamente para HTTPS antes de serem enviadas pela rede.</p><p>Se você deseja impedir que todos os subdomínios sejam acessados por HTTP, precisará usar a diretiva <strong>includeSubdomains</strong>. Você também pode adicionar a diretiva <strong>preload</strong> para permitir que os fabricantes de navegadores incluam seu site diretamente no navegador como sendo apenas HTTPS.</p><pre><code>strict-transport-security: max-age=31536000; includeSubdomains; preload</code></pre><p><br>Uma vez que você tenha ativado o HSTS em seu domínio, pode ter certeza de que, uma vez que alguém tenha carregado seu site via HTTPS, eles só poderão acessá-lo através do esquema seguro dali em diante.</p><p>Portanto, antes de habilitar o HSTS em seu site, certifique-se de ter confiança de que todo o seu tráfego será servido via HTTPS. Caso contrário, você enfrentará problemas.</p><p>Para habilitar isso no Cloudflare, vá para as configurações de <strong>Crypto</strong> e role para baixo até a seção <strong>HTTP Strict Transport Security (HSTS)</strong>. Clique em <strong><strong>Change HSTS Settings</strong></strong> [Alterar configurações de HSTS], habilite todas as opções relevantes e clique em <strong>Save</strong>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/duTVMCLbBXZtlp5QoKLu4gBuzz-qnGRH3CRS.png" class="kg-image" alt="duTVMCLbBXZtlp5QoKLu4gBuzz-qnGRH3CRS" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/duTVMCLbBXZtlp5QoKLu4gBuzz-qnGRH3CRS.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/duTVMCLbBXZtlp5QoKLu4gBuzz-qnGRH3CRS.png 607w" width="607" height="945" loading="lazy"></figure><p>Caso esteja se perguntando, o suporte dos navegadores para o HSTS é bastante bom.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/kvk9x7Ffgtm8Hj7uJG3SNbqcVvhv6bdv0Sxy.png" class="kg-image" alt="kvk9x7Ffgtm8Hj7uJG3SNbqcVvhv6bdv0Sxy" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/kvk9x7Ffgtm8Hj7uJG3SNbqcVvhv6bdv0Sxy.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/kvk9x7Ffgtm8Hj7uJG3SNbqcVvhv6bdv0Sxy.png 800w" sizes="(min-width: 720px) 720px" width="800" height="411" loading="lazy"></figure><h4 id="corrigir-refer-ncias-ao-esquema-inseguro"><strong>Corrigir referências ao esquema inseguro</strong></h4><p><br>Se você incorporar um recurso passivo (como uma imagem) de maneira insegura em uma página segura, o navegador ainda vai carregá-lo normalmente. A única diferença é que o cadeado verde é removido da barra de endereços. Você pode ver um exemplo desse erro <a href="https://mixed.badssl.com/">aqui</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/PztuGkSktiMG9zRjN4Dc1Haa9ZU4ExWAkcvG.png" class="kg-image" alt="PztuGkSktiMG9zRjN4Dc1Haa9ZU4ExWAkcvG" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/PztuGkSktiMG9zRjN4Dc1Haa9ZU4ExWAkcvG.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/PztuGkSktiMG9zRjN4Dc1Haa9ZU4ExWAkcvG.png 681w" width="681" height="349" loading="lazy"></figure><p>Se você verificar o console do navegador, verá algumas mensagens de aviso ou erros que apontam para o recurso que foi incorporado de maneira insegura. Nesse caso, é:</p><pre><code>&lt;img class="mixed" src="http://mixed.badssl.com/image.jpg" alt="HTTP image"&gt;</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/WD4db17NSC2rNZo4gXdamnM6A4q54CE0Y0kQ.png" class="kg-image" alt="WD4db17NSC2rNZo4gXdamnM6A4q54CE0Y0kQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/WD4db17NSC2rNZo4gXdamnM6A4q54CE0Y0kQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/WD4db17NSC2rNZo4gXdamnM6A4q54CE0Y0kQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="272" loading="lazy"></figure><p>Para corrigir isso, basta alterar o esquema para HTTPS e tudo ficará bem novamente.</p><pre><code>&lt;img class="mixed" src="https://mixed.badssl.com/image.jpg" alt="HTTP image"&gt;</code></pre><p>Se você tem muito conteúdo em seu site incorporado de modo inseguro, encontrar e corrigir cada um pode ser bastante tedioso. O Cloudflare pode ajudar novamente aqui com o recurso <a href="https://support.cloudflare.com/hc/en-us/articles/227227647-How-do-I-use-Automatic-HTTPS-Rewrites-">Automatic HTTPS Rewrites</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/TInVTocyWO2EfauqD6OfOpmHWb0x65C5-cq3.png" class="kg-image" alt="TInVTocyWO2EfauqD6OfOpmHWb0x65C5-cq3" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/TInVTocyWO2EfauqD6OfOpmHWb0x65C5-cq3.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/TInVTocyWO2EfauqD6OfOpmHWb0x65C5-cq3.png 800w" sizes="(min-width: 720px) 720px" width="800" height="140" loading="lazy"></figure><p>Para ter uma certeza absoluta de que nenhum conteúdo do seu site será servido de modo inseguro, considere implementar uma <a href="https://freshman.tech/securing-your-website/#content-security-policy-csp">Política de Segurança de Conteúdo</a> (Content Security Policy, CSP – texto em inglês) em seu site.</p><p>Agora, vamos ver como as alterações acima afetaram nosso relatório do SSL Labs. Rodei o teste novamente em meu domínio e agora obtemos uma classificação A+.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/Q0jdFp2spaP7pWbehBEXBQJMFblx4K3YPKIT.png" class="kg-image" alt="Q0jdFp2spaP7pWbehBEXBQJMFblx4K3YPKIT" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/Q0jdFp2spaP7pWbehBEXBQJMFblx4K3YPKIT.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/Q0jdFp2spaP7pWbehBEXBQJMFblx4K3YPKIT.png 800w" sizes="(min-width: 720px) 720px" width="800" height="379" loading="lazy"></figure><p>Se você verificar as classificações individuais no gráfico, nada mudou, mas ainda assim obtemos uma implementação de SSL muito segura gratuitamente e em apenas alguns minutos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/L9vbROCIfrsio5SwUybP-eTil0YGuclRgUzy.png" class="kg-image" alt="L9vbROCIfrsio5SwUybP-eTil0YGuclRgUzy" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/L9vbROCIfrsio5SwUybP-eTil0YGuclRgUzy.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/L9vbROCIfrsio5SwUybP-eTil0YGuclRgUzy.png 800w" sizes="(min-width: 720px) 720px" width="800" height="368" loading="lazy"></figure><h3 id="alternativas-ao-cloudflare-para-ssl-gratuito">Alternativas ao Cloudflare para SSL gratuito</h3><p>Se você preferir não usar o Cloudflare por algum motivo, existem outras maneiras de tornar o seu site acessível via HTTPS de maneira gratuita. Aqui estão duas opções que você pode experimentar:</p><h3 id="let-s-encrypt">Let’s Encrypt</h3><p>Se você tiver controle sobre o seu servidor, pode implantar rapidamente o HTTPS no seu site usando o <a href="https://letsencrypt.org/">Let's Encrypt</a>. Eles oferecem certificados SSL gratuitos com validade de três meses e que podem ser renovados automaticamente.</p><p>Mesmo se você não tiver acesso ao servidor, verifique com o seu provedor de hospedagem. Alguns hosts permitem o uso do Let's Encrypt SSL sem fornecer acesso ao <em>shell </em>(linha de comando).</p><h3 id="gerenciador-de-certificados-amazon-aws">Gerenciador de Certificados Amazon AWS</h3><p>A <a href="https://aws.amazon.com/certificate-manager/">Amazon</a> também emite e renova automaticamente certificados SSL para clientes em sua infraestrutura da Amazon Web Services (AWS). Desse modo, você pode configurar e esquecer o HTTPS em seu site se estiver usando recursos da AWS, como o Cloudfront.</p><p>Independentemente de como você implementa o HTTPS em seu site, o mais importante é garantir que você o configure o mais rápido possível para que seus usuários obtenham os benefícios de segurança que ele oferece e para não perder várias funcionalidades interessantes nos navegadores que ajudam a criar experiências melhores na web.</p><p>Se você gostou deste artigo, compartilhe com outras pessoas que possam se beneficiar da leitura. A propósito, confira o blog do autor em <a href="https://freshman.tech/">freshman.tech</a> para ver mais artigos sobre desenvolvimento para a web. Obrigado pela leitura.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
