<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rafael Silva</title>
    <description>The latest articles on DEV Community by Rafael Silva (@rafa_dev).</description>
    <link>https://dev.to/rafa_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1152142%2F09227ed8-f22c-46dd-a6c6-b63e8d07326a.jpg</url>
      <title>DEV Community: Rafael Silva</title>
      <link>https://dev.to/rafa_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rafa_dev"/>
    <language>en</language>
    <item>
      <title>Notação Big-O</title>
      <dc:creator>Rafael Silva</dc:creator>
      <pubDate>Mon, 06 Nov 2023 10:59:59 +0000</pubDate>
      <link>https://dev.to/rafa_dev/notacao-big-o-48h</link>
      <guid>https://dev.to/rafa_dev/notacao-big-o-48h</guid>
      <description>&lt;p&gt;A notação &lt;strong&gt;Big-O&lt;/strong&gt; é fundamental para a comparação de algoritmos distintos. Seu propósito é determinar a abordagem mais eficiente. Ao enfrentar um mesmo problema, frequentemente nos deparamos com diversas alternativas de solução. O Big-O nos proporciona um insight valioso sobre qual dessas abordagens pode se revelar a mais ágil.&lt;/p&gt;

&lt;p&gt;Podemos afirmar sobre a notação Big-O:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como comparar dois ou mais algoritmos.&lt;/li&gt;
&lt;li&gt;Comparação objetiva entre algoritmos.&lt;/li&gt;
&lt;li&gt;Considera diferenças entre poder de processamento, sistema operacional, linguagem de programação&lt;/li&gt;
&lt;li&gt;O quanto a "complexidade" do algoritmo aumenta de acordo com as entradas.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Vamos supor que precisamos de uma função que some todos os números passados como parâmetros. Teremos duas pessoas desenvolvendo, o que resultará em duas soluções distintas. Nesse cenário, é crucial determinar qual abordagem se mostra mais eficaz.&lt;/p&gt;

&lt;p&gt;Exemplo 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def soma1(n):
    total = 0
    for i in range(n + 1):
        total += i
    return total

time_taken = timeit.timeit(lambda: soma1(10))
print(f"Tempo levado: {time_taken:.6f} segundos")

# Tempo levado: 0.616551 segundos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;strong&gt;soma1(n)&lt;/strong&gt; realiza um loop que itera &lt;strong&gt;n + 1&lt;/strong&gt; vezes, onde &lt;strong&gt;n&lt;/strong&gt; é o parâmetro passado para a função. Portanto, o número de passos que a função executa é proporcional a &lt;strong&gt;n&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dizemos que a função soma1 tem uma complexidade de &lt;strong&gt;O(n)&lt;/strong&gt;, onde &lt;strong&gt;n&lt;/strong&gt; representa a quantidade de passos e que o tempo de execução da função aumentará conforme o aumento do número de passos.&lt;/p&gt;

&lt;p&gt;Exemplo 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def soma2(n):
    return (n * (n + 1)) / 2

time_taken2 = timeit.timeit(lambda: soma2(10))
print(f"Tempo levado: {time_taken2:.6f} segundos")

Tempo levado: 0.173197 segundos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;strong&gt;soma2(n)&lt;/strong&gt; utiliza uma fórmula matemática conhecida para calcular a soma dos números de 1 a n. (retorna a mesma coisa que a função anterior).&lt;/p&gt;

&lt;p&gt;Dizemos que a função &lt;strong&gt;soma2&lt;/strong&gt; tem uma complexidade de O(3), onde &lt;strong&gt;3&lt;/strong&gt; representa a quantidade de passos(Multiplicação, soma e divisão).&lt;/p&gt;

&lt;p&gt;A função soma2 é uma abordagem mais eficiente para o caso, pois já tem uma quantidade definida de passos 'O(3)', afirmando que o quanto a "complexidade" do algoritmo aumenta de acordo com as entradas.&lt;/p&gt;

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

&lt;p&gt;A notação Big-O é uma ótima abordagem para comparar dois ou mais algoritmos e desenvolver soluções mais rápidas e eficientes.&lt;/p&gt;

</description>
      <category>estruturadedados</category>
      <category>python</category>
    </item>
    <item>
      <title>Começando com Docker</title>
      <dc:creator>Rafael Silva</dc:creator>
      <pubDate>Mon, 25 Sep 2023 10:37:14 +0000</pubDate>
      <link>https://dev.to/rafa_dev/comecando-com-docker-2pc3</link>
      <guid>https://dev.to/rafa_dev/comecando-com-docker-2pc3</guid>
      <description>&lt;p&gt;Docker é um software que reduz a complexibilidade do setup ao permitir que configuremos &lt;strong&gt;containers&lt;/strong&gt;, que funcionam como servidores para executar nossas aplicações. Com facilidade, podemos criar &lt;strong&gt;ambientes **independentes que operam em diversos Sistemas Operacionais, o que torna os projetos mais **eficientes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Considere o seguinte: um projeto pode ter muitos requisitos para funcionar em sua máquina. Isso pode resultar em perda de tempo ao instalar e configurar todo o ambiente necessário. Com o Docker, você pode simplesmente pegar uma **imagem **pronta para executar o projeto.&lt;/p&gt;

&lt;p&gt;Para aprofundarmos nosso conhecimento em Docker, é crucial compreender duas partes essenciais: os Containers e as Imagens. São elementos fundamentais para o funcionamento eficaz do Docker.&lt;/p&gt;

&lt;h3&gt;
  
  
  Container
&lt;/h3&gt;

&lt;p&gt;Um container é um conjunto de código capaz de executar uma ação, como rodar uma aplicação em Node.js, PHP ou Java. Para serem executados, os containers fazem uso de imagens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imagem
&lt;/h3&gt;

&lt;p&gt;Uma imagem é o "projeto" que será executado pelo container. Todas as instruções necessárias para a execução estão declaradas dentro dessa imagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Na Prática
&lt;/h2&gt;

&lt;p&gt;Para você entender melhor, vamos criar um simples container, e nele terá uma simples imagem com uma aplicação em NodeJs ( vou considerar que já tenha o docker instalado em sua maquina, caso não tenha, siga: &lt;a href="https://www.docker.com/"&gt;https://www.docker.com/&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Primeiro, precisamos iniciar uma aplicação em nodeJs, pra isso,&lt;br&gt;
em uma pasta, utilizaremos o comando: &lt;code&gt;npm init&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se tudo der certo, agora temos um arquivo &lt;code&gt;package.json&lt;/code&gt; em nosso projeto, mas agora precisamos instalar o Express para criar nosso servidor. Para isso, rodamos o comando: &lt;code&gt;npm install express&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KgrTl97s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pxdi0x77mmgrv15u9fim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KgrTl97s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pxdi0x77mmgrv15u9fim.png" alt="Image description" width="463" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora com tudo instalado, iremos criar um simples servidor utilizando o express. vamos criar um arquivo com qualquer nome, (eu irei chamar de &lt;code&gt;app.js&lt;/code&gt;). Nele vamos adicionar a implementação para criar o servidor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) =&amp;gt; {
    res.send('Olá minha Imagem')
})

app.listen(port, () =&amp;gt; {
    console.log('Executando na porta:', port)
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, o nosso servidor já está funcionando, mas precisamos falar sobre o docker, e onde ele se encaixa nisso.&lt;/p&gt;

&lt;p&gt;Pra começar, precisamos criar um arquivo &lt;code&gt;dockerfile&lt;/code&gt;, arquivo de configuração para definir as instruções necessárias para criar uma imagem Docker.&lt;/p&gt;

&lt;p&gt;Primeiro, precisamos entender o que contem no corpo desse arquivo, e qual a utilidade de cada camada.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;FROM: Imagem base&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;WORKDIR: Diretório da aplicação&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;EXPOSE: Porta da aplicação&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;COPY: Arquivos que precisam ser copiados&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CMD: Define o comando padrão a ser executado durante a implantação de uma instância da imagem do contêiner.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claro que existem outras camadas que podem ter no dockerfile, mas para este exemplo, essas são as camadas básicas para criar nossa imagem.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo, iremos criar um dockerfile de acordo a nossa aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node
WORKDIR /app
COPY package*.json .

run npm install

COPY . .

EXPOSE 3000

CMD [ "node", "app.js" ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, para criar essa imagem, precisamos rodar o comando de build. Em um terminal, dentro do local onde tem o dockerfile, rodamos o comando: &lt;code&gt;docker build .&lt;/code&gt;. Isso irá criar uma imagem do docker, baseado na sua aplicação.&lt;/p&gt;

&lt;p&gt;Para rodarmos nossa imagem em um container, basta rodarmos o comando: &lt;code&gt;docker run -p 3000:3000 [IMAGE ID]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Importante lembrar que, a primeira porta é onde irá rodar o docker, e a segunda porta é a da sua aplicação.&lt;/p&gt;

&lt;p&gt;Tudo pronto. Agora podemos compartilhar essa imagem com outros desenvolvedores, e eles não vão precisar passar pelo processo de criação do servidor, pois a imagem já está configurada pra isso.&lt;/p&gt;

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

&lt;p&gt;O Docker simplifica o desenvolvimento e execução de aplicações através da utilização de containers, proporcionando portabilidade e eficiência.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>developer</category>
    </item>
    <item>
      <title>TDD</title>
      <dc:creator>Rafael Silva</dc:creator>
      <pubDate>Sat, 02 Sep 2023 17:12:22 +0000</pubDate>
      <link>https://dev.to/rafa_dev/tdd-2mpa</link>
      <guid>https://dev.to/rafa_dev/tdd-2mpa</guid>
      <description>&lt;p&gt;Hoje em dia, é bastante comum encontrar aplicações que são desenvolvidas sem o uso do teste, pois algumas pessoas acreditam que os teste podem ser uma perda de tempo. Muitos optam por ignorar essa etapa e decidem fazer os teste da funcionalidade direto em produção. A tecnologia é muito imprevisível, erros e bugs podem nos pegar de surpresa, transformando as correções, mais trabalhosas e demoradas do que os testes.&lt;/p&gt;

&lt;p&gt;Pra isso, hoje existem vários métodos e ferramentas, de testar nossa aplicação e hoje vamos falar do TDD, mas afinal, o que é isso?&lt;/p&gt;

&lt;h3&gt;
  
  
  TDD ( Test-driven Development )
&lt;/h3&gt;

&lt;p&gt;TDD ou Test-Driven Development ( Desenvolvimento orientado a teste ) é uma forma de desenvolvimento de software que te obriga a escrever testes antes do código de produção. Para isso, o TDD tem 3 etapas a serem seguidas, que são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desenvolvimento do teste:&lt;/strong&gt; Primeiro escrevemos o testa da funcionalidade. Geralmente, esse primeiro teste falha, pois ainda não existe a funcionalidade em produção.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hAeZtZQr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hdgwucyoiazrr24fchzj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hAeZtZQr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hdgwucyoiazrr24fchzj.png" alt="Image description" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse caso, vamos ter o erro na linha 6, pois o SignUpController ainda não existe em produção, o que nos leva a segunda etapa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desenvolvimento da funcionalidade:&lt;/strong&gt; Agora, precisamos desenvolver a funcionalidade de produção. Nesta etapa, o foco não é o código, mas a função deve ter o mínimo para que o teste seja aprovado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---7q3Vbs6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mblr0ja0ogu7tzz9sgr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---7q3Vbs6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mblr0ja0ogu7tzz9sgr.png" alt="Image description" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pode observar que é um código simples, mas tem tudo que o nosso teste precisa para ser aprovado. Mas sabemos que esse código pode melhorar, o que leva a terceira etapa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refino:&lt;/strong&gt; Nesta etapa você precisa refinar o código, garantindo que o teste esteja passando, resultando em uma funcionalidade testada, eficiente e limpa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zdjqDyj8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n41a7ptz5bjk8mf7efk8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zdjqDyj8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n41a7ptz5bjk8mf7efk8.png" alt="Image description" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Concluindo
&lt;/h3&gt;

&lt;p&gt;O uso de testes não é tão complexo quanto parece, e os benefícios que eles proporcionam são muito maiores do que o tempo que você gasta desenvolvendo-os.&lt;/p&gt;

&lt;p&gt;Obrigado :)&lt;/p&gt;

</description>
      <category>tdd</category>
      <category>testing</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
