<?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: Cadu Magalhães</title>
    <description>The latest articles on DEV Community by Cadu Magalhães (@1cadumagalhaes).</description>
    <link>https://dev.to/1cadumagalhaes</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%2F609060%2F3c44672a-7339-495b-8677-eeffc1c8bbca.jpeg</url>
      <title>DEV Community: Cadu Magalhães</title>
      <link>https://dev.to/1cadumagalhaes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/1cadumagalhaes"/>
    <language>en</language>
    <item>
      <title>Roadmap de Engenharia de Dados para 2025</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Fri, 25 Jul 2025 19:56:27 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/roadmap-de-engenharia-de-dados-para-2025-4oo</link>
      <guid>https://dev.to/1cadumagalhaes/roadmap-de-engenharia-de-dados-para-2025-4oo</guid>
      <description>&lt;p&gt;Tenho 2 objetivos com esse roadmap: primeiro, é uma lista muito completa dos assuntos que acredito que te fariam ser fora da curva na área de Engenharia de Dados. Segundo, é a lista dos assuntos que pretendo cumprir no blog.&lt;/p&gt;

&lt;p&gt;Em alguns tópicos já deixei quais serão os posts, mas isso pode mudar. A ordem também não é certa, visto que muito do que está aqui não é sequencial.&lt;/p&gt;

&lt;p&gt;Já tenho material revisado para um mês de publicação, começando com o post de &lt;em&gt;História e evolução da Engenharia de Dados&lt;/em&gt;, para o dia 01 de Agosto de 2025. Sinto que em tempos de conteúdo e código escritos por IA, minha forma de resistir é fazer essas publicações. Tentar construir conteúdo de qualidade, com muita curadoria e pesquisa, e que traz o que eu pessoalmente acho interessante -contexto, história - para contribuir com a parte técnica.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introdução e Contexto Histórico&lt;/li&gt;
&lt;li&gt;
Nível 101 – Iniciante

&lt;ul&gt;
&lt;li&gt;
1. Fundamentos de Bancos de Dados

&lt;ul&gt;
&lt;li&gt;1.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;1.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

2. Pipelines de Dados

&lt;ul&gt;
&lt;li&gt;2.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;2.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

3. Fundamentos de Arquitetura de Dados

&lt;ul&gt;
&lt;li&gt;3.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;3.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

4. Desenvolvimento e Ferramentas Essenciais

&lt;ul&gt;
&lt;li&gt;4.1 Linguagem de Programação&lt;/li&gt;
&lt;li&gt;4.2 SQL&lt;/li&gt;
&lt;li&gt;4.3 APIs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

Nível 201 – Intermediário / Preparando-se para o Mercado

&lt;ul&gt;
&lt;li&gt;
1. Arquitetura de Dados Avançada

&lt;ul&gt;
&lt;li&gt;1.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;1.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

2. Modelagem de Dados

&lt;ul&gt;
&lt;li&gt;2.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;2.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

3. Transformação de Dados e Apache Spark

&lt;ul&gt;
&lt;li&gt;3.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;3.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

4. SQL Avançado

&lt;ul&gt;
&lt;li&gt;4.1 Conceitos Teóricos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

5. Fundamentos de Cloud Computing e DataOps

&lt;ul&gt;
&lt;li&gt;5.1 Cloud Computing&lt;/li&gt;
&lt;li&gt;5.2 DataOps&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

6. Orquestradores de Dados

&lt;ul&gt;
&lt;li&gt;6.1 Conceitos Teóricos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

7. No Code e Low Code em Engenharia de Dados

&lt;ul&gt;
&lt;li&gt;7.1 Conceitos Teóricos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

8. Soft Skills e Gestão de Projetos

&lt;ul&gt;
&lt;li&gt;8.1 Conceitos Teóricos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

9. Conceitos Avançados em Analytics Engineering

&lt;ul&gt;
&lt;li&gt;9.1 Conceitos Teóricos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

Nível 301 – Avançado e Tendências

&lt;ul&gt;
&lt;li&gt;
1. Processamento de Dados em Streaming e Arquiteturas em Tempo Real

&lt;ul&gt;
&lt;li&gt;1.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;1.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

2. Observabilidade, Monitoramento e Documentação de Dados

&lt;ul&gt;
&lt;li&gt;2.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;2.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

3. Data Quality e Governança

&lt;ul&gt;
&lt;li&gt;3.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;3.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

4. Engenharia de Software Aplicada à Engenharia de Dados

&lt;ul&gt;
&lt;li&gt;4.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;4.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

5. Mensageria e Integração em Tempo Real

&lt;ul&gt;
&lt;li&gt;5.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;5.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

6. MLOps

&lt;ul&gt;
&lt;li&gt;6.1 Conceitos Teóricos&lt;/li&gt;
&lt;li&gt;6.2 Exemplos Práticos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

Módulo de Carreira e Desenvolvimento Profissional

&lt;ul&gt;
&lt;li&gt;1. Certificações&lt;/li&gt;
&lt;li&gt;2. Preparação para Entrevistas&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Sugestões de Livros e Referências Essenciais&lt;/li&gt;

&lt;li&gt;Conclusões&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdução e Contexto Histórico
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Evolução dos bancos de dados: do modelo relacional, ACID, às origens dos bancos NoSQL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Surgimento do Big Data: Hadoop, MapReduce e a evolução para frameworks distribuídos como Spark e Flink.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transição do armazenamento on-premise para a era da nuvem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Impactos da Engenharia de Software&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="[https://blog.cadumagalhaes.dev/introducao-a-engenharia-de-dados](https://blog.cadumagalhaes.dev/introducao-a-engenharia-de-dados)"&gt;&lt;strong&gt;Introdução à Engenharia de Dados&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;História e evolução da Engenharia de Dados&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Nível 101 – Iniciante
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Fundamentos de Bancos de Dados
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modelos de Bancos de Dados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relacional:&lt;/strong&gt; Estrutura tabular, integridade referencial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Não Relacional:&lt;/strong&gt; Documentos, key-value, grafos, colunar, in-memory, timeseries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OLTP:&lt;/strong&gt; Foco em operações transacionais com alta frequência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OLAP:&lt;/strong&gt; Ambientes otimizados para análises multi dimensionais e consultas complexas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Transações:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conceitos de atomicidade, consistência, isolamento e durabilidade (ACID).&lt;/li&gt;
&lt;li&gt;Exemplos práticos de rollback, commit e gerenciamento de concorrência.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Casos de Uso e Quando Utilizar Cada Tipo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bancos relacionais para transações críticas e integridade dos dados.&lt;/li&gt;
&lt;li&gt;Bancos não relacionais para escalabilidade, flexibilidade de esquemas e alta performance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  1.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bancos Relacionais:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criação de esquemas, tabelas, índices e realização de transações (ex.: PostgreSQL).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Bancos NoSQL:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementação de operações CRUD em MongoDB ou Redis, com exemplos de indexação e consultas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Engenharia de dados 101 – Fundamentos de bancos de dados&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Pipelines de Dados
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ETL:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extração, transformação e carregamento: processos, vantagens e desafios.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

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

&lt;ul&gt;
&lt;li&gt;Extração, carregamento e, posteriormente, transformação: quando utilizar e vantagens.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Comparação ETL x ELT:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critérios para escolha, impacto em performance, custo e arquitetura.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Processamento de Dados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Batch:&lt;/strong&gt; Processamento em blocos com execução agendada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming:&lt;/strong&gt; Processamento em tempo real, com tolerância à latência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquiteturas Híbridas:&lt;/strong&gt; Combinação de batch e streaming para cenários específicos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Introdução a modelagem de dados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Incremental Load:&lt;/strong&gt; Carregamento de dados apenas quando há mudanças.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Row Versioning:&lt;/strong&gt; Manutenção de versões das linhas para auditoria e concorrência.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementação de ETL:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Script em Python para extrair, transformar e carregar dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Implementação de ELT:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Carregamento de dados brutos em um data warehouse e transformações via SQL.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Processamento Batch x Streaming:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demonstração com Apache Spark (modos batch e streaming) e exemplos de arquiteturas híbridas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 101 – Fundamentos de Pipelines de dados&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Fundamentos de Arquitetura de Dados
&lt;/h3&gt;

&lt;h4&gt;
  
  
  3.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Warehouse:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conceitos, arquitetura e casos de uso.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Data Lake:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Armazenamento de dados brutos, escalabilidade e flexibilidade.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Data Mart:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subconjuntos de dados específicos para áreas de negócio.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Arquiteturas Híbridas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integração de múltiplos conceitos para atender cenários complexos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  3.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementação de um Data Warehouse:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projeto básico utilizando ferramentas open-source.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Construção de um Data Lake:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demonstração de ingestão e organização de dados brutos. &lt;em&gt;Posts Relacionados:&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Engenharia de dados 101 – Fundamentos de arquitetura de dados&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Desenvolvimento e Ferramentas Essenciais
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.1 Linguagem de Programação
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tipos de Dados e Estruturas Básicas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tipos de Dados:&lt;/strong&gt; Trabalhar com strings, números, booleanos, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estruturas Básicas:&lt;/strong&gt; Listas, tuplas, dicionários e conjuntos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Programação Orientada a Objetos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conceitos de classes e objetos.&lt;/li&gt;
&lt;li&gt;Implementação de métodos padrão (ex.: &lt;code&gt;__add__&lt;/code&gt;, &lt;code&gt;__get__&lt;/code&gt;, etc).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Estruturas de Dados Avançadas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Árvores, grafos, heaps, e outros conceitos fundamentais da ciência da computação que auxiliam na criação de algoritmos eficientes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de Pacotes e Organização de Projetos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ferramentas para gerenciamento de pacotes: pip, Poetry, uv, etc.&lt;/li&gt;
&lt;li&gt;Construção e disponibilização de bibliotecas, organização de projetos e uso de ambientes virtuais.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Manipulação de Arquivos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leitura e escrita em diferentes formatos: CSV, JSON, YAML, TOML.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Testes e Qualidade de Código:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boas práticas de testes unitários e integração para garantir a robustez do código.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Conceitos e Técnicas Modernas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de context managers, dataclasses e decorators.&lt;/li&gt;
&lt;li&gt;Programação assíncrona com &lt;code&gt;async/await&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h4&gt;
  
  
  4.2 SQL
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Definição e Manipulação de Dados (DDL &amp;amp; DML):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comandos básicos: &lt;code&gt;CREATE&lt;/code&gt;, &lt;code&gt;REPLACE&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Consulta de Dados (DQL):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilização de operadores condicionais e lógicos.&lt;/li&gt;
&lt;li&gt;Ordenação, definição de limites (&lt;code&gt;LIMIT&lt;/code&gt;, &lt;code&gt;OFFSET&lt;/code&gt;) e união de resultados.&lt;/li&gt;
&lt;li&gt;Junções (JOINs) para combinar dados de múltiplas tabelas.&lt;/li&gt;
&lt;li&gt;Funções de agregação, como &lt;code&gt;COUNT&lt;/code&gt;, &lt;code&gt;SUM&lt;/code&gt;, &lt;code&gt;AVG&lt;/code&gt;, entre outras.&lt;/li&gt;
&lt;li&gt;Tratamento de texto com funções como &lt;code&gt;LOWER&lt;/code&gt;, &lt;code&gt;UPPER&lt;/code&gt;, &lt;code&gt;CONCAT&lt;/code&gt; e expressões regulares.&lt;/li&gt;
&lt;li&gt;Funções de manipulação de datas e timestamps.&lt;/li&gt;
&lt;li&gt;Uso de subconsultas e Common Table Expressions (CTEs).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h4&gt;
  
  
  4.3 APIs
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conceitos Fundamentais:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Princípios de APIs REST: métodos HTTP (GET, POST, PUT, DELETE), códigos de status e autenticação.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Boas Práticas e Estratégias:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementação de estratégias de tratamento de falhas e retry.&lt;/li&gt;
&lt;li&gt;Gerenciamento de requisições paginadas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Desenvolvimento de APIs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Princípios e práticas para a construção de uma API própria, desde o design até a implementação.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Posts Relacionados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 101 – Fundamentos de Python&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python aplicado à Engenharia de Dados&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 101 – Fundamentos de SQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 101 – Criando e consumindo API’s&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Essa estrutura detalhada garante que cada aspecto essencial da programação, SQL e APIs seja abordado de forma clara e completa, facilitando a compreensão e aplicação dos conceitos na prática.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nível 201 – Intermediário / Preparando-se para o Mercado
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Arquitetura de Dados Avançada
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Listagem e Definição de Arquiteturas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revisão avançada de Data Warehouse, Data Lake e Data Mart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Mesh e Data Lakehouse:&lt;/strong&gt; Conceitos emergentes e seus impactos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Arquiteturas Lambda, Kappa e Medallion:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Princípios, benefícios, desafios e comparação teórica.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Tópico de Comparação Teórica:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critérios, casos de uso e trade-offs entre as arquiteturas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  1.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementação Prática:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projetos demonstrando uma arquitetura Medallion com ferramentas de transformação e ingestão de dados.&lt;/li&gt;
&lt;li&gt;Orquestração de pipelines em arquiteturas Lambda ou Kappa.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 201 – Arquitetura de dados&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Modelagem de Dados
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conceitos Fundamentais:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Indexação:&lt;/strong&gt; Técnicas para acelerar consultas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalização e Desnormalização:&lt;/strong&gt; Teoria, vantagens e desvantagens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slowly Changing Dimensions (SCD):&lt;/strong&gt; Gerenciamento de alterações em dados dimensionais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change Data Capture (CDC):&lt;/strong&gt; Captura das alterações ocorridas em sistemas operacionais.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Formatos de Modelagem:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modelagem Relacional:&lt;/strong&gt; Estrutura e integridade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modelagem Dimensional:&lt;/strong&gt; (Star schema, Snowflake) para BI e análises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Big Table:&lt;/strong&gt; Quando e como utilizar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outras Abordagens:&lt;/strong&gt; Data Vault, modelagem em grafos, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exercícios Práticos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criação de modelos de dados para cenários variados.&lt;/li&gt;
&lt;li&gt;Otimização de consultas e demonstrações de normalização/desnormalização.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 201 – Modelagem de dados&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Transformação de Dados e Apache Spark
&lt;/h3&gt;

&lt;h4&gt;
  
  
  3.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Frameworks de Transformação:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Foco em Apache Spark:&lt;/strong&gt; Conceitos de RDD, DataFrame, Spark SQL e streaming com Spark.&lt;/li&gt;
&lt;li&gt;Menção breve a outros frameworks (Apache Beam, Hadoop) e comparação conceitual.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;dbt e Outras Ferramentas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teoria sobre dbt (Data Build Tool) e outras alternativas para transformação de dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  3.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Projeto Spark:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post exclusivo ensinando a configurar, desenvolver e executar um job de transformação com Spark – do consumo à escrita em um data warehouse.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Implementação com dbt:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exemplo prático de transformação utilizando dbt.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 – Frameworks de transformação de dados&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 – Fundamentos de PySpark&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. SQL Avançado
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tópicos Avançados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Funções de janela, técnicas de otimização, análise de planos de execução e tuning de performance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exemplos de como extrair insights complexos de grandes volumes de dados usando SQL avançado.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Desafios SQL:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exercícios práticos para resolver problemas de performance e implementar consultas complexas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 – SQL Avançado&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 - Otimização de consultas SQL&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Fundamentos de Cloud Computing e DataOps
&lt;/h3&gt;

&lt;h4&gt;
  
  
  5.1 Cloud Computing
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conceitos de Infraestrutura:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Noções de redes, infraestrutura, sistemas operacionais, firewall, dns, e comparação entre soluções cloud (AWS, Azure, GCP) e ambientes on-premise.&lt;/li&gt;
&lt;li&gt;Serverless x Gerenciado&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Serverless e Cloud Native:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containers, Kubernetes e CNCF&lt;/li&gt;
&lt;li&gt;Abordagem de funções serverless e arquiteturas orientadas a eventos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  5.2 DataOps
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integração de Práticas DevOps em Dados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testes de código e de dados, versionamento e orquestração contínua (CI/CD).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Alertas, Monitoramento e Alta Disponibilidade:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estratégias para configurar alertas, dashboards, logs e tracing (usando Open Metrics, Open Telemetry) para garantir resiliência e disponibilidade.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 – Fundamentos de Cloud Computing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 – Fundamentos de DataOps&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Orquestradores de Dados
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;talvez mencionar aqui em orquestração sobre ferramentas de extração (airbyte, fivetran, etc)&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comparativo de Soluções:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Análise das principais ferramentas: Airflow, Dagster, Prefect, Mage&lt;/li&gt;
&lt;li&gt;Introdução a orquestradores mais gerais, como o n8n.&lt;/li&gt;
&lt;li&gt;Ferramentas dentro de provedores (gcp workflows, azure data factory, aws step functions, databricks jobs, snowflake data pipelines, etc)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Apache Airflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Funcionamento, principais conceitos (DAGs, Operators, Hooks) e casos de uso.&lt;/li&gt;
&lt;li&gt;Criação de pipelines com Airflow, integração com APIs e bancos de dados.&lt;/li&gt;
&lt;li&gt;Airflow moderno: taskflow api, agendamento por datasets, agendamentos complexos com timetables&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 – Orquestradores de Dados&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 201 – Fundamentos de Apache Airflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tudo que você precisa saber sobre Apache Airflow&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. No Code e Low Code em Engenharia de Dados
&lt;/h3&gt;

&lt;h4&gt;
  
  
  7.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ferramentas No Code/Low Code:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introdução ao Apache Hop e outras plataformas como KNIME, Alteryx, Google DataPrep, Talend Data Preparation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Vantagens e Desafios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando e por que utilizar abordagens no code/low code na engenharia de dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Demonstração de um Projeto No Code:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração e execução de um pipeline utilizando uma dessas ferramentas, enfatizando facilidade de integração e visualização.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 201 – No Code/Low Code em Engenharia de Dados&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  8. Soft Skills e Gestão de Projetos
&lt;/h3&gt;

&lt;h4&gt;
  
  
  8.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comunicação e Documentação:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Técnicas de storytelling com dados, documentação eficaz e visualização para stakeholders.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Gestão Ágil de Projetos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metodologias ágeis e frameworks de gerenciamento aplicados a projetos de dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Colaboração e Liderança:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desenvolvimento de habilidades interpessoais e liderança em equipes multidisciplinares.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 201 – Soft Skills e Gestão de Projetos&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  9. Conceitos Avançados em Analytics Engineering
&lt;/h3&gt;

&lt;h4&gt;
  
  
  9.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transformação para Analytics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de ferramentas como dbt para criar modelos analíticos robustos, camadas semânticas e data marts focados em BI.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Integração com BI e Data Visualization:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estratégias para conectar pipelines a ferramentas de visualização (Looker, Tableau, Power BI) e modelagem de dados para análises avançadas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Projeto de Analytics Engineering:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criação de um pipeline completo que vai da ingestão de dados à construção de dashboards interativos e insights de negócios.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 201 – Fundamentos de Analytics Engineering&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Nível 301 – Avançado e Tendências
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Processamento de Dados em Streaming e Arquiteturas em Tempo Real
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Processamento Streaming:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comparativo entre Spark Streaming, Apache Flink, Kafka Streams e outros.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Arquiteturas em Tempo Real:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processamento de eventos e aplicações críticas em tempo real.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  1.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipeline de Streaming:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desenvolvimento de um pipeline integrado com Kafka ou ferramentas similares.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 301 – Processamento de dados em streaming&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Observabilidade, Monitoramento e Documentação de Dados
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Observabilidade e Monitoramento:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estratégias de logging, métricas, tracing e alertas usando ferramentas como Grafana e Kibana.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Documentação de Dados e Governança:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boas práticas para rastreamento de lineage, catalogação (Data Catalogs) e manutenção da documentação contínua.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dashboards e Automação:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração de dashboards e criação de processos automatizados de documentação.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 301 – Observabilidade&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(Novo) Engenharia de dados 301 – Documentação e Governança de Dados&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Data Quality e Governança
&lt;/h3&gt;

&lt;h4&gt;
  
  
  3.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Qualidade dos Dados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testes unitários e de dados, validação, auditoria e políticas de compliance (LGPD, GDPR).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Criptografia, mascaramento, controle de acesso, compliance e &lt;strong&gt;Data Anonymization&lt;/strong&gt; (técnicas de anonimização para proteger dados sensíveis).&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  3.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Processos Automatizados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementação de pipelines de validação e monitoramento da qualidade dos dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 301 – Data Quality&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Engenharia de Software Aplicada à Engenharia de Dados
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sistemas Distribuídos e Concorrência:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fundamentos, desafios e padrões de design para sistemas escaláveis.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Integração com Microserviços:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arquiteturas orientadas a eventos e mensageria.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Containerização e Orquestração:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de Docker, Kubernetes e práticas de CI/CD para ambientes de dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  4.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Projeto Integrado:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Construção de um sistema distribuído que integra ingestão, processamento (batch/stream) e orquestração com containerização.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 301 – Sistemas distribuídos e concorrência&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engenharia de dados 301 – Engenharia de Software para Dados&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Mensageria e Integração em Tempo Real
&lt;/h3&gt;

&lt;h4&gt;
  
  
  5.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sistemas de Mensageria:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comparativo entre Kafka, Google PubSub, AWS SQS, RabbitMQ e outros.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Arquiteturas para Integração:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ingestão e processamento de dados em tempo real.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  5.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementação Prática:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração de um sistema de mensageria para ingestão e processamento de eventos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 301 –Fundamentos de mensageria de dados&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. MLOps
&lt;/h3&gt;

&lt;h4&gt;
  
  
  6.1 Conceitos Teóricos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integração de Dados e Machine Learning:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estruturação de pipelines que conectem o processamento de dados com fluxos de ML.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Ferramentas e Práticas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de MLflow, Kubeflow, BentoML e outras ferramentas para experimentação, versionamento e implantação de modelos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  6.2 Exemplos Práticos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Projeto de MLOps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criação de um pipeline demonstrando a transição do desenvolvimento até a produção de modelos, com monitoramento de performance e qualidade.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Posts Relacionados:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engenharia de dados 301 – Fundamentos de MLOps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Módulo de Carreira e Desenvolvimento Profissional
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Certificações
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Principais Certificações:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Cloud Professional Data Engineer&lt;/li&gt;
&lt;li&gt;AWS Certified Data Analytics – Specialty&lt;/li&gt;
&lt;li&gt;Azure Data Engineer Associate&lt;/li&gt;
&lt;li&gt;Databricks Certified Data Engineer&lt;/li&gt;
&lt;li&gt;AWS Certified Data Engineer&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Dicas para Certificação:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Materiais de estudo, simulados e estratégias de preparação.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Preparação para Entrevistas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Técnicas e Estratégias:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perguntas comuns em entrevistas técnicas e comportamentais para engenheiros de dados.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Exercícios Práticos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resolução de desafios práticos e dicas para apresentação de projetos e experiências.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Recursos Complementares:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guias, cursos online e comunidades para troca de experiências.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sugestões de Livros e Referências Essenciais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Designing Data-Intensive Applications&lt;/strong&gt; – Martin Kleppmann&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Streaming Systems&lt;/strong&gt; – Tyler Akidau, Slava Chernyak e Reuven Lax&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Data Warehouse Toolkit&lt;/strong&gt; – Ralph Kimball&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Pipelines Pocket Reference&lt;/strong&gt; – James Densmore&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Artigos, white papers e documentações oficiais das principais ferramentas (Airflow, Spark, Kubernetes, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Como atualização rápida, posso dizer que nos últimos meses acabei trabalhando e pesquisando muito sobre ML, modernizei a maior parte da infraestrutura das nossas aplicações. Coloquei algumas coisas pra rodar no meu homelab, que agora tem 2 nós. Fiz alguns projetos internacionais.&lt;/p&gt;

&lt;p&gt;E ta ficando cada vez mais difícil me encaixar num rótulo de cargo: Data Engineer, MLOps Engineer, SRE, desenvolvedor, arquiteto. E pra mim isso é ótimo, porque toda essa variedade me ajuda a manter motivado. Comecei a me envolver em discussões e contribuições de alguns projetos open source do meu dia a dia: Airflow, Airbyte, Open Data Discovery, dbt. To fazendo o &lt;a href="https://github.com/1cadumagalhaes/airsql" rel="noopener noreferrer"&gt;AirSQL&lt;/a&gt;, que é basicamente pra facilitar a minha própria vida com airflow mas acho que pode ser bem útil por aí.&lt;/p&gt;

&lt;p&gt;E no próximo semestre eu vou estar até trabalhando como “pesquisador” de ML, na área de visão computacional, que é um dos produtos que a gente ta querendo dar escala. Ganhamos um desafio de aceleração do Google, e além de um orçamento bizarro de créditos de cloud, vamos conseguir mentorias e até usar o espaço Google For Startups aqui em SP.&lt;/p&gt;

</description>
      <category>roadmap</category>
      <category>braziliandevs</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Introdução à Engenharia de Dados</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Tue, 25 Feb 2025 19:16:41 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/introducao-a-engenharia-de-dados-323e</link>
      <guid>https://dev.to/1cadumagalhaes/introducao-a-engenharia-de-dados-323e</guid>
      <description>&lt;p&gt;Antes de começar com o roadmap, acho importante discutir o que realmente é Engenharia de Dados.&lt;/p&gt;

&lt;p&gt;Alguns anos atrás, não existiam todas essas carreiras diferentes em dados; o trabalho era dividido entre Analistas de Negócios (ou BA de Business Analysts, BI de Business Intelligence, etc) e Desenvolvedores. O hype em volta dos dados criou a demanda para os trabalhos especializados, e até hoje (uma ou duas décadas depois), o mercado ainda não se estabilizou.&lt;/p&gt;

&lt;p&gt;De forma resumida, a Engenharia de Dados pode ser dividida em duas etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fundação das operações relacionadas a dados: planejar, desenvolver e dar manutenção para arquiteturas de dados, sistemas de processamentos e etc. Ou seja, ajudar a definir o que será usado (quais ferramentas, plataformas) e como será usado.&lt;/li&gt;
&lt;li&gt;Construção de pipelines de dados: a partir de toda a fundação definida, passam a focar no desenvolvimento de pipelines pra baixar, transformar*, mover e disponibilizar dados no melhor formato para o restante das pessoas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;*obs: hoje, é muito comum as empresas separarem a transformação como responsabilidade dos Analytics Engineers, de forma que os Data Engineers focam na fundação&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Um pouco de história
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fnx4aq91dlfr51lf8tp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fnx4aq91dlfr51lf8tp.png" alt="Imagem de um roadmap. Começa nos anos 60 com data warehouse, depois ETL nos anos 80. Google Distributed Filesystem em 2003, MapReduce em 2004, Hadoop em 2006, AWS também em 2006" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se formos olhar de forma rigorosa, a Engenharia de Dados surgiu no início dos anos 2000, junto com o boom da internet e com  criação do conceito de "Big Data" (por muito tempo, o termo era "&lt;em&gt;Big Data Engineer&lt;/em&gt;"). Podemos dizer que começou "oficialmente" lá em 2003 quando o Google publicou artigos sobre o seu sistema de arquivos distribuídos, e mais tarde sobre MapReduce. Inspirados nisso, engenheiros do Yahoo criaram o Hadoop em 2006, e a partir daí a história foi se desenvolvendo.&lt;/p&gt;

&lt;p&gt;Mas os fundamentos - a ideia de Data Warehouse, de ETL - surgiram muitos anos antes. O termo "Data Warehouse" foi cunhado entre as décadas de 60 e 70, mas foi estabelecido de verdade com a publicação do livro "Construindo um Data Warehouse", de Bill Inmon (considerado pai dos data warehouses).&lt;/p&gt;

&lt;p&gt;Outro marco importante foi o surgimento da computação em nuvem, com a AWS em 2006. Essa mudança de paradigma diminuiu os custos relacionados ao tratamento de dados, permitindo escalabilidade e flexibilidade. E a partir daí foram surgindo novas ferramentas para lidar com as necessidades de forma eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais responsabilidades de um Engenheiro de Dados
&lt;/h2&gt;

&lt;p&gt;De forma geral, podemos considerar o seguinte como responsabilidades da área de engenharia de dados&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Construir e manter uma infraestrutura de dados escalável

&lt;ul&gt;
&lt;li&gt;Definir a arquitetura de dados (Data Warehouse, Data Lake, etc), criando uma estrutura que atenda as necessidades atuais mas que possa escalar para os requisitos futuros&lt;/li&gt;
&lt;li&gt;Implementar os modelos de dados planejados, estruturando os dados de forma que suportem acessos e consultas de forma eficiente&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Garantir qualidade, segurança e governança de dados

&lt;ul&gt;
&lt;li&gt;Implementar validações e testes para garantir a acurácia, confiança e consistência dos dados&lt;/li&gt;
&lt;li&gt;Estabelecer padrões para uso dos dados, e garantir que estão sendo seguidos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Otimizar custos

&lt;ul&gt;
&lt;li&gt;Otimizar o armazenamento de dados e a performance de consultas e processamentos, usando as melhores práticas de indexação, particionamento e clusterização&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Monitoramento e manutenção de pipelines de dados

&lt;ul&gt;
&lt;li&gt;Implementar processos de validação, sistemas de alertas e notificação, ferramentas de automação de workflows, de forma que qualquer problema no processamento seja detectado o mais rápido possível&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Principais habilidades de um Engenheiro de Dados
&lt;/h2&gt;

&lt;p&gt;Atualmente o mercado exige muito mais do que somente SQL, Python e uma plataforma de nuvem ou banco de dados. Na minha experiência, além desses 3 pilares é preciso ter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conhecimentos básicos de engenharia de software: versionamento e git, CI/CD&lt;/li&gt;
&lt;li&gt;O básico de linux, redes, infraestrutura. Em alguns casos, uma ferramenta de automação de deploy como terraform ou ansible&lt;/li&gt;
&lt;li&gt;Um framework de processamento de dados, como spark&lt;/li&gt;
&lt;li&gt;Conhecimento de um orquestrador, sendo Airflow o mais comum&lt;/li&gt;
&lt;li&gt;API's, HTTP, web scrapping&lt;/li&gt;
&lt;li&gt;Arquitetura de dados, modelagem e conhecimentos básicos de bancos de dados (SQL vs noSQL, por exemplo)&lt;/li&gt;
&lt;li&gt;Em casos mais avançados, conhecimento sobre processamento em streaming. Kafka, Flink, além do próprio spark&lt;/li&gt;
&lt;li&gt;E mais recentemente, a utilização de uma ferramenta de transformação de dados, como dbt ou dataform&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparação de carreiras
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cargo&lt;/th&gt;
&lt;th&gt;Responsabilidades&lt;/th&gt;
&lt;th&gt;Principais habilidades&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Engenheiro de dados&lt;/td&gt;
&lt;td&gt;Desenvolve e mantém arquiteturas e pipelines de dados.&lt;/td&gt;
&lt;td&gt;SQL, Python, plataformas de nuvem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engenheiro de analytics&lt;/td&gt;
&lt;td&gt;Intermediário entre engenharia e análise, focando na transformação de dados brutos para formatos utilizáveis pelos analistas e cientistas&lt;/td&gt;
&lt;td&gt;Modelagem de dados, SQL, Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cientista de dados&lt;/td&gt;
&lt;td&gt;Analisa os dados para extrair insights e construir modelos preditivos&lt;/td&gt;
&lt;td&gt;Estatística, Machine Learning, R/Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analista de dados&lt;/td&gt;
&lt;td&gt;Interpreta dados e provê insights para ajudar em decisões de negócio&lt;/td&gt;
&lt;td&gt;Data visualization, SQL, planilhas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Onde esses cargos colaboram&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engenheiros de dados e Engenheiros de analytics:&lt;/strong&gt; Colaboram para garantir que os dados estão propriamente estruturados e disponíveis para análises&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engenheiros de analytics e Cientistas de dados:&lt;/strong&gt; Trabalham juntos para transformar os dados em formatos próprios para modelagem e análise&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cientistas de dados e Analistas de dados:&lt;/strong&gt; Ambos interpretam dados, mas os cientistas de dados costumam desenvolver modelos, enquanto os analistas focam em apresentação de insights&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Um exemplo do mundo real&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engenheiro de dados:&lt;/strong&gt; Configuram uma pipeline que baixa dados de uma ferramenta de análise de interação dos usuários num site&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engenheiro de analytics:&lt;/strong&gt; Transformam esses dados brutos em tabelas estruturadas com as métricas e dimensões mais importantes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cientista de dados:&lt;/strong&gt; Usam os dados estruturados para prever abandono e conversão de usuários&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analista de dados:&lt;/strong&gt; Interpretam os dados estruturados e os resultados do modelo para fazer recomendações de negócio, como aumentar a retenção de usuários
## Uma análise do mercado de trabalho
De acordo com o &lt;a href="https://www.marketdataforecast.com/market-reports/big-data-engineering-services-market" rel="noopener noreferrer"&gt;Market Data Forecast&lt;/a&gt;, o mercado global de Engenharia de Dados valeu 75 bilhões de dólares em 2024, e a taxa de crescimento anual projetada é de 17% até 2033, de forma que deve atingir os 88 bilhões de dólares ainda em 2025.
Isso tudo devido a alguns fatores levantados pela pesquisa:&lt;/li&gt;
&lt;li&gt;A rápida adoção de Big Data no setor bancário e fintechs&lt;/li&gt;
&lt;li&gt;O sempre crescente volume de dados&lt;/li&gt;
&lt;li&gt;Aumento da demanda para análises e insights em tempo real
A pesquisa também aponta a dificuldade de informações em tempo real como uma barreira no crescimento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando falamos de vagas, de acordo com o &lt;a href="https://www.dice.com/technologists/ebooks/tech-job-report/" rel="noopener noreferrer"&gt;Tech Job Report da Dice&lt;/a&gt;, Engenharia de dados é a 6ª carreira com mais publicações de vagas, tendo um crescimento de 42% de 2021 para 2022. Além disso, SQL e Python são a 2ª e 3ª habilidades mais procuradas em todas as vagas nesse mesmo período.&lt;/p&gt;

&lt;p&gt;Infelizmente os dados do Linkedin só são disponíveis com pagamento, mas fazendo uma pesquisa superficial no google, conseguimos encontrar que aproximadamente 1% dos perfis da plataforma (aproximadamente 9 milhões) são de pessoas Engenheiras de Dados. Também conseguimos confirmar que as habilidades mais procuradas são definitivamente SQL e Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;No fim, a definição de &lt;code&gt;Engenharia de dados&lt;/code&gt; acaba sendo feita por cada empresa, de forma que as responsabilidades, atribuições e habilidades vão sempre variar bastante. Mas, de forma geral, os fundamentos costumam ser os mesmos. O próximo post será o planejamento do roadmap de engenharia de dados, destrinchando todos os tópicos que pretendo abordar. Inicialmente o roadmap deve ter tópicos iniciantes e intermediários, mas todos os assuntos serão aprofundados da melhor forma possível. Meu objetivo é não só listar ferramentas e dar exemplos de utilização, mas construir uma boa base de conhecimento teórico e prático com todos os assuntos. &lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Criação de conteúdo, open source e planos para 2025</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Tue, 18 Feb 2025 15:43:37 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/criacao-de-conteudo-open-source-e-planos-para-2025-4i34</link>
      <guid>https://dev.to/1cadumagalhaes/criacao-de-conteudo-open-source-e-planos-para-2025-4i34</guid>
      <description>&lt;p&gt;Faz quase 1 ano que não publico nada. Há praticamente 6 meses, minha presença na internet é quase 0.&lt;br&gt;
Apesar disso, continuei indo aos eventos, fiz algumas palestras. E trabalhei muito. Criamos algumas funcionalidades com modelos de ML (processamento de imagem e de texto), conseguimos um "teste" de estresse na prática em produção, com um dos clientes requisitando mais de 80 req/s. Otimizamos nossas pipelines, reduzimos custos, testamos várias ferramentas open source.&lt;br&gt;
Estudei muito sobre desenvolvimento e arquitetura de software, infraestrutura, machine learning, e bastante teoria de engenharia de dados. &lt;/p&gt;

&lt;p&gt;Troquei de trabalho, me permiti ter uma rotina que faça melhor pra minha saúde mental. Fiz várias entrevistas pra gringa, até consegui fazer alguns freelances ganhando em dólar. &lt;/p&gt;

&lt;p&gt;E mesmo sem energia nenhuma pra publicar, não consigo deixar de pensar que deveria estar produzindo conteúdo pra comunidade. Que deveria colaborar com open source, tirar os meus próprios projetos do papel. E nesse intervalo todo eu me permiti descansar, apesar dessa auto cobrança.&lt;/p&gt;

&lt;p&gt;Ao longo desses meses eu estudei formas de tornar meus projetos viáveis. Até pensei em lançar alguns micro saas pra ver se ganho na loteria e faço um dinheirinho. Enfim, tenho muitos planos e não sei por quanto tempo vou me manter na linha.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projetos Open Source
&lt;/h2&gt;

&lt;p&gt;As vezes eu até começo os meus projetos, mas dificilmente dou continuidade e mantenho eles vivos. Então vou focar nestes dois:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;**&lt;a href="https://datacareer.guide" rel="noopener noreferrer"&gt;https://datacareer.guide&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Aqui eu vou centralizar alguns roadmaps. Gostaria muito da ajuda de gente de Ciência e Análise de Dados, então entra em contato se tiver afim de contribuir. Eu mesmo vou construir os roadmaps de Engenharias de Dados e Analytics. A ideia é listar os temas, dividir por "experiência" (iniciante até avançado), e agregar conteúdos sobre cada um dos temas. No meu caso, devo listar alguns dos meus próprios posts por ex.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://eventos.cadumagalhaes.dev" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://eventos.cadumagalhaes.dev" rel="noopener noreferrer"&gt;https://eventos.cadumagalhaes.dev&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Repensei um pouco na infra dele, e estou pensando se não vale a pena migrar o ""backend"" para uma planilha. De qualquer forma, vou cadastrar mais eventos essa semana, e em breve vou resolvendo as issues uma de cada vez.
Além disso, também vou contribuir mais ativamente com os projetos que utilizo no dia a dia. Airflow, dbt, cosmos, superset, formbricks, kubernetes e vários outros. Desenvolvi muita coisa localmente que poderiam ser disponibilizadas nos projetos principais.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Criação de conteúdo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cursos
&lt;/h3&gt;

&lt;p&gt;Tenho visto um grande movimento de bootcamps, cursos, "academy"s de dados, etc. Alguns tem períodos gratuitos, introduções e etc. Mas para mim, conhecimento deve ser gratuito, então não pretendo colocar uma barreira no que produzo.&lt;br&gt;
De qualquer forma, tenho rascunhos de alguns cursos para tirar do papel, e com exceção de algumas coisas muito especializadas (ex: como trabalhar com dados de uma ferramenta paga), tudo será gratuito. Talvez eu faça como nosso colega &lt;a href="https://www.twitch.tv/teomewhy" rel="noopener noreferrer"&gt;Teo Calvo&lt;/a&gt;, e apresente os cursos ao vivo. Infelizmente, se não tiver audiência eu vou desanimar e lançar em videos gravados mesmo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Videos
&lt;/h3&gt;

&lt;p&gt;Também tenho várias ideias de produção de conteúdo específica de vídeos: desafios, opiniões, tutoriais, convidar alguns dos meus amigos por ai para ter conversas. Confesso que nesse ponto meu perfeccionismo me atrapalha um pouco, porque gostaria de produzir com qualidade (o que precisa de conhecimento, tempo, equipamento e etc). Vou tentar passar essa barreira e só lançar o que conseguir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blog
&lt;/h3&gt;

&lt;p&gt;Meus planos para o blog são de mais consistência. Pretendo ter um post fixo por semana, feito sempre na quarta feira, que vai começar com minha série de fundamentos de engenharia de dados e ficar um bom tempo nisso. Posts mais subjetivos (como este aqui, resumos de eventos, comentários sobre ferramentas, opiniões), posts temáticos ou simplesmente o que me der vontade de publicar, poderão ser publicados em outros dias da semana. O primeiro post já vai ser amanhã, 19 de fevereiro, e está agendado. &lt;/p&gt;

&lt;p&gt;Por questões de &lt;em&gt;branding&lt;/em&gt;, também vou começar a traduzir meus posts para o inglês. Depois de ter publicado por um mês com consistência, pretendo começar as traduções e postar uma por semana também.&lt;/p&gt;

&lt;h3&gt;
  
  
  Newsletter
&lt;/h3&gt;

&lt;p&gt;Também pretendo lançar mais de uma newsletter. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A primeira, semanal, vai ser uma curadoria de conteúdos de Engenharia de Dados. &lt;/li&gt;
&lt;li&gt;A segunda, mensal, vai ser uma newsletter de eventos do próximo mês e eventos com call for papers aberto.
Se eu gostar desse formato, posso acabar fazendo outras. Consumo bastante conteúdo todos os dias, diversas newsletters, artigos e videos, de vários assuntos relacionados à tecnologia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comunidade
&lt;/h2&gt;

&lt;p&gt;Quem me conhece sabe que há anos eu digo que não temos uma comunidade de &lt;strong&gt;engenharia&lt;/strong&gt; de dados. Existem comunidades de data science, e várias comunidades de "dados" em geral mas que no fim acabam falando muito de ML.&lt;br&gt;
Só que hoje tenho uma função mais generalista, então tenho dúvida se eu gostaria de focar tanto assim em um único assunto. &lt;br&gt;
Faz bastante tempo que tenho vontade de "lançar" uma comunidade, organizar meetups e outros encontros que não envolvem falar de trabalho. Voltar aos "coding dojos", rodas de conversa e sair um pouco desse modelo de palestra.&lt;br&gt;
Então por enquanto, meu plano é criar uma "marca" para a comunidade, e ter "divisões" dentro dela para assuntos específicos. Engenharia de Dados, DevOps e SRE, Backend ou python. Tudo vai depender das pessoas. E claro, ter encontros pra jogar videogame, jogos de tabuleiro, tocar instrumentos, montar um clube de xadrez ou speedruns; fazer um espaço onde nos juntamos não só pra falar de tecnologia, mas pra de fato ser uma comunidade. Se tudo der certo, devo começar a montar as redes sociais no inicio de março. E claro, aceito ajuda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trabalho
&lt;/h2&gt;

&lt;p&gt;Bem, estou muito feliz participando de uma startup em early stage e construindo os produtos do 0. Devo dedicar mais esforço em conseguir freelances e projetos curtos, de preferência internacionais. E apesar de ter saudades das vantagens do CLT, não vou aceitar nada híbrido. Sem falar na quantidade de vagas "pj tipo CLT", que definitivamente não são pra mim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;Enfim, o motivo deste post é me lembrar algumas coisas: que gosto de escrever, independente se alguém vai ler; que minha vontade de produzir conteúdo e ajudar as pessoas não sumiu; que eu posso fazer esse compromisso comigo mesmo e tirar as ideias da minha cabeça.&lt;br&gt;
Me sigam no finado xwitter, bluesky e linkedin, pois são os lugares onde vou divulgar todas essas coisas. Caso queiram ver mais fotos de gatos, eventualmente uma paisagem ou algum video de cover, podem me seguir no instagram também.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Os eventos (de tech) morreram? Vida longa aos eventos</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Tue, 21 May 2024 17:08:30 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/os-eventos-de-tech-morreram-vida-longa-aos-eventos-3mj9</link>
      <guid>https://dev.to/1cadumagalhaes/os-eventos-de-tech-morreram-vida-longa-aos-eventos-3mj9</guid>
      <description>&lt;p&gt;Honestamente, os eventos mudaram muito de 5 anos pra cá. EU, Cadu, tenho achado o conteúdo majoritariamente raso. Essa é minha opinião completamente pessoal e não é nenhuma verdade absoluta. Para mim, as grandes conferências viraram isso. Conteúdos rasos, palavras chave pra chamar atenção do grande público. Crypto, metaverso, web3, GenAI, Chat GPT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Senta que lá vem história
&lt;/h2&gt;

&lt;p&gt;Eu estou na comunidade tech a relativamente bastante tempo. Meus primeiros eventos foram lá em 2013. Fui num arduino day, na BSides, alguns meetups de comunidade.&lt;/p&gt;

&lt;p&gt;E por ter entrado tão cedo, eu aprendi muita coisa. Desde o começo eu tive a vontade de devolver conhecimento pra comunidade, porque ali eu tive contato com muita gente incrível e muito conteúdo bom.&lt;/p&gt;

&lt;p&gt;Em 2014 eu conheci a Campus Party, e fiquei maravilhado. Um evento enorme, com praticamente 10 palcos diferentes, todos com palestras. Tinha algumas pessoas famosas no palco principal, mas tinha muito conteúdo técnico nos outros. E as comunidades, que improvisavam "palcos" nas suas bancadas na madrugada, onde tinha ainda mais conteúdo. Desde então eu fui campuseiro em praticamente todos os anos. E continuei indo em meetups aleatórios, e todos os eventos que eu pude. Até em hackathons eu fui!&lt;/p&gt;

&lt;p&gt;Em 2020 vocês sabem o que aconteceu, e esse ecossistema esfriou. Algumas comunidades continuaram fazendo meetups online, muita gente começou a fazer live. Mas a gente sentiu saudade dos eventos presenciais.&lt;/p&gt;

&lt;p&gt;Em 2021 a Campus Party Brasil voltou. Ainda vazia, com bastante distanciamento, mas eles tentaram. Desde então as coisas tem voltado aos poucos. Mas algo ficou diferente. Eu não estava mais achando nenhum conteúdo que me interessasse. Já estava começando a sentir isso em 2020, não da pra dizer que era por experiência.&lt;/p&gt;

&lt;p&gt;O conteúdo da grande maioria dos eventos passou a ser muito raso. Das grandes conferências então, ainda mais. O networking sempre foi uma parte importante dos eventos, mas a partir daí passou a ser só isso, pelo menos pra mim. Ver gente conhecida, ver gente "famosa".&lt;/p&gt;

&lt;p&gt;Por causa desse incômodo eu decidi que ia começar a palestrar. Ao invés de reclamar no twitter, eu sempre fiz o que achei que fizesse mais sentido: mando várias palestras pros eventos, e dou feedback pra organização quando pedem.&lt;/p&gt;

&lt;h2&gt;
  
  
  A ameaça fantasma
&lt;/h2&gt;

&lt;p&gt;Mas vamos voltar a raiz: os conteúdos passaram a ser rasos, repetitivos. Muita coisa sobre os mesmos assuntos, as palavras do momento. Em 2019, 2020 muita gente falava de React. "Como fazer seu primeiro site/app com react" era bem comum. Mas ainda tinha alguma variedade. Em 2022 era tudo crypto, metaverso, web3. De 2023 pra cá é GenAI, chatGPT. Eu sei que não fui em todos os eventos, que existem exceções. Mas as grandes conferências viraram isso. O evento mais legal que EU fui em 2023, por conteúdo, foi a CSS Conf, e eu nem sou frontend. Mas o conteúdo foi bom!&lt;/p&gt;

&lt;p&gt;E veja bem, não acho que a culpa seja das organizações. Organizar eventos é difícil. Você precisa fazer a conta fechar. Você tem que chamar atenção do máximo possível de pessoas, vender ingresso. Justificar os patrocínios.&lt;/p&gt;

&lt;p&gt;Parte da culpa, na minha opinião, é da comunidade. A comunidade que não engaja o suficiente. A comunidade que deixa de submeter assuntos mais complexos (ok, é difícil falar em 15, 30 minutos). Fomos nós que permitimos que os assuntos "do momento" tomassem os eventos; porque deixamos de ir pra assistir conteúdo, porque não incentivamos as pessoas novas a buscarem isso. Porque os eventos precisam fazer malabarismo pra conseguir encher de gente. Porque nós não damos espaço pra diversidade, e ainda permitimos que o mais diverso seja ter painéis "como é ser [insira grupo diverso] na área?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Uma nova esperança
&lt;/h2&gt;

&lt;p&gt;Mas existem eventos diferentes!&lt;/p&gt;

&lt;h3&gt;
  
  
  DevOps Days
&lt;/h3&gt;

&lt;p&gt;Conheci a pouquíssimo tempo o devopsdays.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Aqui preciso fazer um disclaimer: DevOps não é um cargo, não é uma área. É uma cultura. É juntar gente de Dev e de Infra (ou "Ops"). E o DevOps Days é pra falar sobre tudo que envolve dev, infra. A maioria dos assuntos acaba sendo relacionada ao que nós consideramos "DevOps", mas o objetivo não é esse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Enfim, esse é um evento diferente. Ele tem vários momentos dedicados ao networking, mas o mais diferente é que no final tem grupos de discussão sobre vários assuntos. Da comunidade pra comunidade, sem palco, sem destaque. Simplesmente gente trocando ideias sobre um assunto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security BSides
&lt;/h3&gt;

&lt;p&gt;E ainda mais recentemente, eu voltei pra Security BSides, que teve aqui em São Paulo. E esse evento é bem diferente da maioria. Primeiro porque é gratuito. É pago completamente pelos patrocinadores. Mas o mais diferente é o formato de conteúdo. Esse ano, tinha "palcos" grandes, salas maiores em que estavam os destaques da programação. Mas além disso, tinha 14 salas pequenas, chamadas de Villages. Nesses villages o conteúdo é muito parecido com aquele que me engajou 10 anos atrás: conteúdo submetido pela comunidade, pra comunidade. Sem se importar com seguidores, tempo de experiência, ou com temas que precisam chamar atenção usando marketing. Era o conteúdo que aquelas pessoas gostariam de ver! E eu vi muita coisa legal. Palestras que me fizeram prestar atenção, ficar interessado.&lt;/p&gt;

&lt;p&gt;E pelo que conversei, os eventos da comunidade de segurança são assim. Não tem ninguém muito preocupado com holofotes, é sobre conteúdo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outros
&lt;/h3&gt;

&lt;p&gt;Eu sei que alguns outros eventos seguem esse mesmo formato. O TDC por exemplo, tem várias trilhas. E os meetups de comunidade estão tentando voltar. O NodeBR tem trazido assuntos bem diferentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que pode ser diferente?
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Organizando
&lt;/h2&gt;

&lt;p&gt;Para as organizações, eu acho que precisamos repensar nos formatos. Um palco é muito pouco. Tem várias formas diferentes de dividir, e isso eu deixo pra virar uma discussão depois. Mas pra um evento grande, precisamos de espaço pra mais gente falar. As janelas de tempo também estão diminuindo, e eu pessoalmente não gosto disso. 15 minutos mal são tempo suficiente pra introduzir um assunto, então seria legal nas agendas dizer o "nível" da apresentação. E na minha opinião, precisamos de transmissão online sempre (eu sei, é difícil).&lt;/p&gt;

&lt;p&gt;E uma coisa que sinto muita falta, são os workshops e apresentações com mais engajamento. Fazer as pessoas participarem de fato. Claro que isso precisa de mais tempo, de equipamento e tem várias limitações. Mas eram minha parte preferida quando eu estava começando.&lt;/p&gt;

&lt;p&gt;E além disso, nós precisamos descobrir uma forma de centralizar os eventos! Temos o &lt;a href="http://eventosti.dev"&gt;eventosti.dev&lt;/a&gt;, do &lt;a href="https://twitter.com/pokemaobr"&gt;@pokemaobr&lt;/a&gt;. Só que esse projeto precisa que as pessoas mandem os eventos. E ainda assim: cada evento vende ingressos num lugar, recebe palestrar num outro lugar, mostra agenda de um jeito diferente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Participando
&lt;/h2&gt;

&lt;p&gt;Para a comunidade, nós precisamos melhorar muita coisa. Pros meetups voltarem a funcionar, as pessoas precisam aparecer. Nós estamos nos acostumando a esperar menos de 50% dos inscritos nos lugares, isso complica muito a organização. Nós precisamos engajar; não só compartilhar sobre os eventos e meetups, mas engajar com as pessoas. Incentivar as pessoas a participar. Nós estamos deixando o "ciclo" esfriar.&lt;/p&gt;

&lt;p&gt;As pessoas mais experientes (e que tem vontade de compartilhar) precisam mandar mais conteúdo. E conteúdos diferentes! Eu sempre penso em mandar assuntos que EU gostaria de assistir (e por isso você nunca vai me ver falando sobre usar GenAI pra fazer seu site etc). E as pessoas menos experientes não precisam ter medo de compartilhar conteúdo. Você pode aprender algo para palestrar. Inclusive é uma ótima forma de aprender um assunto. Você só precisa ter cuidado na pesquisa, e pedir validações de alguém experiente no assunto.&lt;/p&gt;

&lt;p&gt;Mas se você tem vontade de palestrar, independente do seu nível, manda pros eventos! E se não tiver ideia de assunto, me chama pra conversar que ajudo a encontrar algo legal.&lt;/p&gt;

&lt;p&gt;Já vi algumas páginas de eventos compartilhando pesquisas abertas sobre "quem você gostaria de ver palestrando" ou "que assunto você gostaria de ver". Acho isso legal, e se as pessoas colaborarem pode ajudar também.&lt;/p&gt;

&lt;h2&gt;
  
  
  O despertar da força
&lt;/h2&gt;

&lt;p&gt;Eu realmente acredito que os eventos podem voltar a dar super certo. E os meetups também. E eu vou continuar participando do máximo de eventos possível, e compartilhando meus conteúdos e experiências quando me derem espaço.&lt;/p&gt;

&lt;p&gt;Mas enfim, você concorda com isso ou eu falei um monte de bobagem?&lt;/p&gt;

</description>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Tudo que você precisa saber sobre Git</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Thu, 05 Oct 2023 22:51:04 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-sobre-git-3gbi</link>
      <guid>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-sobre-git-3gbi</guid>
      <description>&lt;p&gt;Se você estuda ou trabalha com desenvolvimento, provavelmente já ouviu falar de &lt;strong&gt;git&lt;/strong&gt;, que é uma ferramenta gratuita e open source de versionamento de código (não é só isso, mas vamos simplificar). Quando eu comecei a estudar programação, toda a minha organização e versionamento de códigos era baseada em criar várias pastas no meu computador e ficar replicando várias e várias vezes. Quando queria compartilhar com alguém nós criávamos um .zip da pasta toda e depois gastávamos algumas horas tentando bater alterações pra fazer a entrega no final (meu TCC do técnico está guardado até hoje como &lt;code&gt;tcc_final.zip&lt;/code&gt; no OneDrive).&lt;/p&gt;

&lt;p&gt;Git veio justamente pra resolver esses problemas: é mais fácil de gerenciar a evolução do seu código ou da sua aplicação; e principalmente, é muito mais fácil colaborar no desenvolvimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tudo que eu preciso saber sobre?
&lt;/h2&gt;

&lt;p&gt;Meu objetivo aqui é simples: prover toda informação disponível para você (desenvolvedor) começar e conseguir usar a ferramenta da vez. Não pretendo responder tudo que você &lt;strong&gt;pode&lt;/strong&gt; ou &lt;strong&gt;deveria&lt;/strong&gt; saber, apenas o necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
O que é git

&lt;ol&gt;
&lt;li&gt;Origens e Conceitos&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Quando eu deveria usar git&lt;/li&gt;

&lt;li&gt;

Por onde começar

&lt;ol&gt;
&lt;li&gt;Instalação no Ubuntu&lt;/li&gt;
&lt;li&gt;Configuração do git&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

Como funciona

&lt;ol&gt;
&lt;li&gt;Snapshots&lt;/li&gt;
&lt;li&gt;Checksums&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

Conceitos fundamentais

&lt;ol&gt;
&lt;li&gt;Commit&lt;/li&gt;
&lt;li&gt;Branch&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

Comandos básicos

&lt;ol&gt;
&lt;li&gt;init&lt;/li&gt;
&lt;li&gt;clone&lt;/li&gt;
&lt;li&gt;pull&lt;/li&gt;
&lt;li&gt;branch&lt;/li&gt;
&lt;li&gt;checkout&lt;/li&gt;
&lt;li&gt;add&lt;/li&gt;
&lt;li&gt;commit&lt;/li&gt;
&lt;li&gt;push&lt;/li&gt;
&lt;li&gt;status&lt;/li&gt;
&lt;li&gt;fetch&lt;/li&gt;
&lt;li&gt;stash&lt;/li&gt;
&lt;li&gt;merge&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

Comandos adicionais

&lt;ol&gt;
&lt;li&gt;rebase&lt;/li&gt;
&lt;li&gt;log&lt;/li&gt;
&lt;li&gt;revert&lt;/li&gt;
&lt;li&gt;remote&lt;/li&gt;
&lt;li&gt;cherry-pick&lt;/li&gt;
&lt;li&gt;blame&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Na prática&lt;/li&gt;

&lt;li&gt;Onde encontrar mais informações&lt;/li&gt;

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

&lt;/ol&gt;

&lt;p&gt;You can use this table of contents to help readers navigate your blog post more easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é git
&lt;/h2&gt;

&lt;p&gt;Numa tradução livre da documentação oficial, git&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;é um &lt;em&gt;sistema de controle de versão distribuído&lt;/em&gt; gratuito e de código aberto, projetado para lidar com projetos de pequenos a muito grandes, com velocidade e eficiência.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ele foi criado pelo Linus Torvalds (criador do Linux) em 2005, para ajudar a gerenciar o desenvolvimento do kernel Linux.&lt;/p&gt;

&lt;p&gt;A ideia de ser um sistema &lt;strong&gt;distribuído&lt;/strong&gt; é que isso possibilita que várias pessoas ou times possam colaborar num projeto de software enquanto cada um mantém suas próprias cópias locais do projeto todo, incluindo seu histórico. Isso é o oposto do que seria se fosse um sistema centralizado, o que significaria que todos usuários precisariam se conectar a um único e mesmo repositório central.&lt;/p&gt;

&lt;p&gt;E um sistema de controle de versão é feito para gravar mudanças em arquivos (ou grupos de arquivos) ao longo do tempo, de forma que você possa recorrer a versões específicas mais tarde. A verdade é que vamos falar aqui de usar no contexto de software, mas isso pode ser usado para basicamente qualquer tipo de arquivo num computador. Então seria muito interessante usar isso mesmo para trabalhos como edição de video, por exemplo.&lt;/p&gt;

&lt;p&gt;Ou seja, git existe para te ajudar a acompanhar as mudanças na sua base de código, a colaborar com múltiplas pessoas desenvolvedoras e a garantir que você tem uma forma de backup e recuperação de como era o seu código a qualquer momento; tudo isso além de ter um sistema de &lt;strong&gt;branch&lt;/strong&gt; que permite que possamos trabalhar no código sem afetar o código “principal”.&lt;/p&gt;

&lt;p&gt;Um ponto importante, é que &lt;strong&gt;git&lt;/strong&gt; é o sistema, e não está diretamente relacionado com as empresas e softwares &lt;strong&gt;Github&lt;/strong&gt; e &lt;strong&gt;Gitlab&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando eu deveria usar git
&lt;/h2&gt;

&lt;p&gt;Sempre. Sério, o único motivo que pode justificar a não utilização de git em um projeto, é falta de conhecimento. E pra isso que estou escrevendo isso aqui, então no geral, use sempre.&lt;/p&gt;

&lt;p&gt;Mas falando de forma geral, os principais casos de uso são justamente o de trabalhos colaborativos, além do poder de controlar o versionamento em si. Sabe quando você faz um projeto, que está funcionando, ai começa a mexer pra “melhorar” e ele para de funcionar? Com git você consegue voltar no histórico sem depender do seu ctrl+Z.&lt;/p&gt;

&lt;p&gt;E apesar de poder usar localmente, é difícil encontrar motivos pra não usar algum &lt;strong&gt;host&lt;/strong&gt; de git (mesmo para os seus projetos pessoais) como o &lt;strong&gt;Github&lt;/strong&gt;, &lt;strong&gt;Gitlab&lt;/strong&gt; ou &lt;strong&gt;Bitbucket&lt;/strong&gt;, já que todos têm planos gratuitos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por onde começar
&lt;/h2&gt;

&lt;p&gt;Já que eu espero que você tenha lido sobre &lt;a href="https://blog.cadumagalhaes.dev/configuracao-do-windows-para-desenvolvimento" rel="noopener noreferrer"&gt;como configurar o windows para desenvolvimento&lt;/a&gt;, vou dizer como se instala no Ubuntu. Caso precise instalar em outro sistema, a &lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt; tem exemplos para várias opções.&lt;/p&gt;

&lt;p&gt;No nosso caso, basta executar&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  git config
&lt;/h3&gt;

&lt;p&gt;Depois de instalar, idealmente você precisa fazer algumas configurações padrões para garantir o melhor funcionamento. Parte das informações armazenadas pelo git envolvem seu nome e email, por exemplo, para que sejam anexadas ao histórico de alterações. Para configurar essas informações de forma global, você pode usar os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"[seu nome ou nome de usuário]"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"[seu email]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos configurar essas informações em nível de repositório, mas para começar a configuração global é mais do que suficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona
&lt;/h2&gt;

&lt;h3&gt;
  
  
  (não que você precise saber)
&lt;/h3&gt;

&lt;p&gt;Ao invés de tentar armazenar quais alterações são feitas em quais arquivos, Git pensa nos seus dados como uma série de &lt;strong&gt;&lt;em&gt;snapshots&lt;/em&gt;&lt;/strong&gt; de um sistema de arquivos. Ou seja, toda vez que você faz um &lt;strong&gt;commit&lt;/strong&gt; (que é a ação de salvar o estado do seu projeto), Git vai basicamente tirar uma foto de como todos os seus arquivos estão naquele momento, e armazenar uma referência a isso. E pra ser eficiente, se não houve nenhuma alteração em algum arquivo, ele não vai ser armazenado novamente. Ao invés disso, o Git vai simplesmente fazer uma referência ao arquivo que já foi armazenado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1696266793473%2F083d646e-e7e6-474a-9c03-394d14796b3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1696266793473%2F083d646e-e7e6-474a-9c03-394d14796b3c.png" alt="Ilustração do sistema de arquivos do git"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Além disso, quase toda operação feita com Git depende somente dos seus recursos e arquivos locais, sem depender muito de informações vindas de outro computador ou de um servidor. Isso faz com que ele seja extremamente rápido e eficiente, além de garantir que mesmo que você esteja offline, vai conseguir trabalhar.&lt;/p&gt;

&lt;p&gt;E a forma como Git “mede” as alterações em arquivos, é que eles fazem o processo chamado de &lt;em&gt;checksum&lt;/em&gt;. A ideia é que você gera um valor com base no &lt;strong&gt;conteúdo&lt;/strong&gt; do arquivo, e caso o conteúdo se altere, esse valor também é alterado. Isso é uma forma de garantir que Git tenha integridade, já que é impossível que o conteúdo de qualquer arquivo ou diretório seja mudado sem que Git note. (Esses &lt;em&gt;checksums&lt;/em&gt; são gerados a partir de um hash SHA-1 , que é uma string de 40 caracteres hexadecimais, tipo assim: &lt;code&gt;24b9da6552252987aa493b52f8696cd6d3b00373&lt;/code&gt;. Quando usar git, vai ver que esses códigos estão presentes em todo lugar, porque é assim que as informações são armazenadas).&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos fundamentais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Commit
&lt;/h3&gt;

&lt;p&gt;Como mencionado brevemente acima, o commit é a ação de salvar o estado atual do seu projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Branch
&lt;/h3&gt;

&lt;p&gt;Apesar do poder do versionamento, as vezes precisamos trabalhar em múltiplas coisas de uma vez. É nesse contexto que as &lt;strong&gt;branches&lt;/strong&gt; (ou ramificações) aparecem. Git consegue armazenar múltiplos estados diferentes do seu projeto através dessas ramificações, que posteriormente podem ser juntadas de acordo com a necessidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1696266836390%2F71829e43-7609-43de-a3dd-da695b35edbf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1696266836390%2F71829e43-7609-43de-a3dd-da695b35edbf.png" alt="Ilustração de uma representação de ramificação (branch) em git"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos básicos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  init
&lt;/h3&gt;

&lt;p&gt;Esse é o comando que você executa num diretório para iniciar um novo projeto de git. Ele vai fazer a inicialização básica do sistema.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  clone
&lt;/h3&gt;

&lt;p&gt;Caso queira fazer uma cópia de um projeto já existente, você usa esse comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="o"&gt;[&lt;/span&gt;URL &lt;span class="k"&gt;do &lt;/span&gt;projeto remoto]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  pull
&lt;/h3&gt;

&lt;p&gt;É o jeito mais comum de baixar o conteúdo mais recente do repositório remoto, mas é preciso ter cuidado com ele. Quando você executa um &lt;code&gt;pull&lt;/code&gt;, além de baixar tudo ele também atualiza o seu conteúdo local para o mais recente, o que pode gerar conflitos.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  branch
&lt;/h3&gt;

&lt;p&gt;É o comando usado para listar, criar ou apagar uma branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Listar todas as ramificações&lt;/span&gt;
git branch

&lt;span class="c"&gt;# Criar uma nova branch&lt;/span&gt;
git branch &lt;span class="o"&gt;[&lt;/span&gt;nome da branch nova]

&lt;span class="c"&gt;# Apagar uma branch&lt;/span&gt;
git branch &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;nome da branch]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  checkout
&lt;/h3&gt;

&lt;p&gt;Continuando na ideia de branches, esse comando é usado para definir qual é a branch ativa do seu repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="o"&gt;[&lt;/span&gt;nome da branch]

&lt;span class="c"&gt;# bonus: criar e trocar para uma branch&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;nome da branch nova]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  add
&lt;/h3&gt;

&lt;p&gt;Conforme você vai fazendo alterações, você precisa adicionar elas para que sejam armazenadas posteriormente. Você vai usar esse comando quando cria novos arquivos, quando muda o nome deles ou quando altera o conteúdo. É importante entender que isso não vai armazenar o estado, vai apenas colocar os arquivos na “fila”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## para adicionar um arquivo ou diretório específicos&lt;/span&gt;
git add &lt;span class="o"&gt;[&lt;/span&gt;arquivo ou diretório]
&lt;span class="c"&gt;## para adicionar N arquivos ou diretórios especificos&lt;/span&gt;
git add &lt;span class="o"&gt;[&lt;/span&gt;arquivo1] &lt;span class="o"&gt;[&lt;/span&gt;arquivo2] &lt;span class="o"&gt;[&lt;/span&gt;diretorio]
&lt;span class="c"&gt;## ou para adicionar todos os arquivos alterados&lt;/span&gt;
git add &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;span class="c"&gt;## ou&lt;/span&gt;
git add &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  commit
&lt;/h3&gt;

&lt;p&gt;Para salvar o estado atual do projeto, após ter adicionado os arquivos, fazemos um &lt;strong&gt;commit&lt;/strong&gt;. Ele vai criar uma nova revisão do seu repositório, gerar um novo código e guardar todas as alterações que foram feitas, junto com a informação de quando e por quem foram feitas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Para uso interativo, dessa forma você vai ser &lt;/span&gt;
&lt;span class="c"&gt;## direcionado para um editor de texto antes de finalizar o commit&lt;/span&gt;
&lt;span class="c"&gt;## Aqui você deve escrever sua mensagem de commit, com os detalhes que achar necessários.&lt;/span&gt;
git commit 

&lt;span class="c"&gt;## Caso a mensagem seja curta, ou simplesmente não queira passar pelo editor&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"[sua mensagem de commit]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui também fica a recomendação da utilização dos &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;Commits Convencionais&lt;/a&gt;, que são uma sugestão de padrão do início da mensagem de commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  push
&lt;/h3&gt;

&lt;p&gt;É basicamente o contrário do &lt;code&gt;pull&lt;/code&gt;, serve para enviar suas alterações locais para o repositório remoto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enviar alterações para uma branch que já existe no remoto&lt;/span&gt;
git push

&lt;span class="c"&gt;# Enviar alterações para uma branch que foi criada local&lt;/span&gt;
git push &lt;span class="nt"&gt;--set-upstream&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;nome &lt;span class="k"&gt;do &lt;/span&gt;remoto] &lt;span class="o"&gt;[&lt;/span&gt;nome da branch]
&lt;span class="c"&gt;# geralmente é usado como git push --set-upstream origin [branch]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  status
&lt;/h3&gt;

&lt;p&gt;É usado para comparar o estado atual do seu repositório local com o último estado armazenado, e com o repositório remoto (caso haja).&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  fetch
&lt;/h3&gt;

&lt;p&gt;De forma semelhante ao pull, serve para baixar mudanças feitas no projeto remoto. A diferença é que dessa forma elas não serão aplicadas automaticamente para o seu repositório local, você vai precisar definir o que fazer com as alterações na sequência.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  stash
&lt;/h3&gt;

&lt;p&gt;As vezes precisamos mudar de branch depois de já ter trabalhado em uma, mas antes que as coisas estejam prontas o suficiente para virar um commit. Nesse contexto podemos usar o stash, que vai armazenar temporariamente as modificações na área de &lt;strong&gt;&lt;em&gt;stash&lt;/em&gt;&lt;/strong&gt;, que é essencialmente é uma pilha (uma lista onde os elementos são empilhados).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Para "guardar" os arquivos no stash&lt;/span&gt;
git stash

&lt;span class="c"&gt;# Para listar todos os existentes&lt;/span&gt;
git stash list

&lt;span class="c"&gt;# Para apagar um stash da pilha&lt;/span&gt;
git stash drop

&lt;span class="c"&gt;# Para recuperar um stash&lt;/span&gt;
git stash apply

&lt;span class="c"&gt;# Para aplicar/recuperar e remover da pilha (eu costumo usar esse)&lt;/span&gt;
git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  merge
&lt;/h3&gt;

&lt;p&gt;Depois de trabalhar em múltiplas branches, provavelmente você vai precisar unificar as coisas em algum momento. É ai que entra o merge, que vai ser responsável por juntar 2 branches em uma única.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge &lt;span class="o"&gt;[&lt;/span&gt;branch de destino] &lt;span class="o"&gt;[&lt;/span&gt;branch de origem]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso vai criar um commit de merge na branch de destino, e vai atualizar comparar apenas as últimas versões de cada um. Esse é um método interessante porque ele não vai mexer no histórico de nada, vai apenas criar um novo commit para garantir que as coisas estejam atualizadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos adicionais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  rebase
&lt;/h3&gt;

&lt;p&gt;O objetivo é parecido com o do merge, mas o rebase reescreve o histórico de commits do projeto, de forma que ele move a sua branch para o final do histórico, &lt;strong&gt;criando novos commits para cada commit da branch de origem&lt;/strong&gt;, de forma que o histórico do seu projeto vai ficar muito mais “limpo”. Isso porque ele não tem os commits de merge (que são feitos quando você usa &lt;code&gt;git merge&lt;/code&gt; , e no final o histórico do seu projeto fica perfeitamente linear (enquanto com merge as coisas podem ficar difíceis de acompanhar, dependendo da complexidade do projeto). É importante deixar claro que com isso você perde um pouco da rastreabilidade (pois está sempre reescrevendo o histórico) e você perde o contexto de quando as alterações foram “aceitas” na sua branch principal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="o"&gt;[&lt;/span&gt;branch de destino]
git rebase &lt;span class="o"&gt;[&lt;/span&gt;branch de origem]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é um comando que pode impactar bastante o trabalho colaborativo, então antes de pensar em usar é importante saber se tem mais alguém trabalhando na branch em que você vai mexer. Isso porque vão acontecer vários conflitos entre a sua versão (a com rebase) e a versão que a pessoa pode estar trabalhando. Algumas pessoas chamam isso de “&lt;strong&gt;Golden Rule do rebase”.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  log
&lt;/h3&gt;

&lt;p&gt;Esse é o comando que você pode usar para ver o histórico de commits do repositório.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  revert
&lt;/h3&gt;

&lt;p&gt;Esse é um comando para desfazer mudanças, mas que ao invés de modificar os commits já feitos no histórico, ele vai criar um novo commit desfazendo as mudanças. Podemos considerar que é uma alternativa segura ao &lt;code&gt;git reset&lt;/code&gt;, que tem uma chance de te fazer perder o histórico.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert &lt;span class="o"&gt;[&lt;/span&gt;commit &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Também podemos dizer quantos commits a partir do último serão revertidos&lt;/span&gt;
git revert HEAD~[numero de commits]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  remote
&lt;/h3&gt;

&lt;p&gt;Esse é o comando que você usa pra criar a conexão entre o seu repositório local e um repositório remoto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add &lt;span class="o"&gt;[&lt;/span&gt;apelido &lt;span class="k"&gt;do &lt;/span&gt;repo remoto] &lt;span class="o"&gt;[&lt;/span&gt;url &lt;span class="k"&gt;do &lt;/span&gt;repositório]

&lt;span class="c"&gt;# Geralmente vai ser algo como&lt;/span&gt;
git remote add origin &amp;lt;https://github.com/&amp;gt;[nome de usuario]/[nome &lt;span class="k"&gt;do &lt;/span&gt;repo] 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  cherry-pick
&lt;/h3&gt;

&lt;p&gt;Imagina que você e uma outra pessoa estão trabalhando em duas branches diferentes, mas que a outra fez um commit com uma alteração que você também pode usar, e você não quer reescrever algo que já foi feito. O cherry-pick permite que você selecione qualquer commit de uma branch, e aplicá-lo a uma outra branch, sem ter que se preocupar com o histórico todo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git cherry-pick &lt;span class="o"&gt;[&lt;/span&gt;commit &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  blame
&lt;/h3&gt;

&lt;p&gt;É o comando utilizado para dizer qual usuário fez quais alterações num determinado arquivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git blame &lt;span class="o"&gt;[&lt;/span&gt;nome &lt;span class="k"&gt;do &lt;/span&gt;arquivo]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Apesar de achar importante você conhecer, entender e saber usar a linha de comando, a verdade é que você provavelmente não precisa. A maioria das IDE’s ou editores de código tem extensões para lidar com git e te prover uma interface que facilita bastante a utilização. Também existe o &lt;a href="https://desktop.github.com/" rel="noopener noreferrer"&gt;Github Desktop&lt;/a&gt; mas eu pessoalmente não gosto muito dele.&lt;/p&gt;

&lt;p&gt;Uso a maior parte das coisas direto na extensão de git padrão do VS Code, que te da um resumo das alterações atuais do repositório, uma lista de commits, de branches e de stashes e honestamente tudo que você pode precisar. Isso facilita muito, principalmente na hora de resolver conflitos.&lt;/p&gt;

&lt;p&gt;Ele também acrescenta o &lt;code&gt;git blame&lt;/code&gt; no próprio editor, fazendo ficar bem fácil entender o histórico do projeto.&lt;/p&gt;

&lt;p&gt;Eu só uso a extensão padrão, mas se você tiver recomendações de extensões, fique a vontade pra acrescentar nos comentários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde encontrar mais informações
&lt;/h2&gt;

&lt;p&gt;A melhor fonte é provavelmente a oficial, que é onde eu costumo buscar referências (e o que serviu de inspiração pra boa parte do que está aqui):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Git Book (em PT-BR): &lt;a href="https://git-scm.com/book/pt-br/v2" rel="noopener noreferrer"&gt;https://git-scm.com/book/pt-br/v2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git Book: &lt;a href="https://git-scm.com/book/en/v2" rel="noopener noreferrer"&gt;https://git-scm.com/book/en/v2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também gostei bastante do conteúdo da Atlassian, que é a empresa criadora do BitBucket&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/git/tutorials" rel="noopener noreferrer"&gt;https://www.atlassian.com/git/tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E como não pode faltar, também tem conteúdo da LINUX Tips sobre git:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Descomplicando o Git: &lt;a href="https://www.youtube.com/watch?v=_aj3hsEh9iw" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=_aj3hsEh9iw&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aulão de certificação do gitlab: &lt;a href="https://www.youtube.com/watch?v=SMzaAP09BD4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=SMzaAP09BD4&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A verdade é que eu fiquei anos usando git e só sabendo &lt;code&gt;git add&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, &lt;code&gt;git pull&lt;/code&gt; e &lt;code&gt;git push&lt;/code&gt;. Isso é tudo que você precisa pra um projeto simples, e usando alguma extensão com interface gráfica você só precisa entender as ações e como executá-las na interface que estiver usando.&lt;/p&gt;

&lt;p&gt;Mas conforme vamos trabalhando, passando por projetos de maior complexidade ou simplesmente precisando fazer coisas em grupo, os conflitos e erros começam a acontecer e aí precisamos entender melhor o poder dessa ferramenta.&lt;/p&gt;

&lt;p&gt;Não espero que ninguém saia desse post sabendo usar tudo isso, mas aqui tem uma introdução de tudo que eu gostaria de saber quando comecei. Saber quando usar qual comando vem da utilização na prática, então minha recomendação é sempre que você comece. E novamente, não consigo pensar em um motivo pra não usar git em qualquer projeto de desenvolvimento, seja pessoal, de estudos, de faculdade ou de trabalho.&lt;/p&gt;

&lt;p&gt;Me diz o que você achou desse tipo de post, e se você gostaria que isso virasse um vídeo no Youtube! Independente do resultado, semana que vem vou falar sobre RegEx.&lt;/p&gt;

&lt;p&gt;Espero que isso tenha sido útil para alguém, até a próxima!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>git</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to setup a PostgreSQL database with Docker Compose</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Fri, 22 Sep 2023 14:07:59 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/how-to-setup-a-postgresql-database-with-docker-compose-1j57</link>
      <guid>https://dev.to/1cadumagalhaes/how-to-setup-a-postgresql-database-with-docker-compose-1j57</guid>
      <description>&lt;p&gt;When I started learning about databases, Docker didn't even exist yet. So I spent hours trying to make both the database engine and the workspace interface to work, and there are so many little details in the setup that I'm sure you'll find thousands of articles and videos teaching how to do it in your operating system.&lt;/p&gt;

&lt;p&gt;But it's 2023 and containers are a common thing to developers, and honestly you don't even need to understand them to use them. All you need to know is how to install it (and for this, you can check the &lt;a href="https://docs.docker.com/engine/install/"&gt;Install Docker Engine tutorial from docker&lt;/a&gt; themselves) and how to run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Docker CLI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker Compose&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a browser&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's supposed to be easy so that's all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up
&lt;/h2&gt;

&lt;p&gt;You'll need two files to make this work.&lt;/p&gt;

&lt;h3&gt;
  
  
  docker-compose.yml
&lt;/h3&gt;

&lt;p&gt;Docker Compose is a tool made to define and run multi-container applications. All you need to do is define your &lt;code&gt;services&lt;/code&gt;, do some setups and run it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
        &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=postgres&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres-db-volume:/var/lib/postgresql/data&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;
        &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres-db-network&lt;/span&gt;
    &lt;span class="na"&gt;pgadmin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpage/pgadmin4&lt;/span&gt;
        &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;PGADMIN_DEFAULT_EMAIL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;teste@teste.com'&lt;/span&gt;
            &lt;span class="na"&gt;PGADMIN_DEFAULT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;teste'&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;16543:80&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./servers.json:/pgadmin4/servers.json&lt;/span&gt;
        &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres-db-network&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;postgres-db-volume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
        &lt;span class="na"&gt;driver_opts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;
            &lt;span class="na"&gt;o&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bind&lt;/span&gt;
            &lt;span class="na"&gt;device&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./data&lt;/span&gt;
&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;postgres-db-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we are using two containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;one for the database itself, which is based on the Postgres 15 image. We also define the port for the database, a &lt;em&gt;volume&lt;/em&gt; and some environment variables to set the default user and password for our connection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the other is for pgAdmin, which is a Postgresql database administration tool. It is also open source, and this way we can manage and interact with our databases using the browser. You can see that we set the port to 16543. This means you'll access it by typing localhost:16543 in your browser. You can change this port, but I like to use a number that probably won't be used for anything else.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  servers.json
&lt;/h3&gt;

&lt;p&gt;We don't actually need this file, because in pgAdmin you can use the interface to configure your connection (and set the host, port, user and password). But since I want to make this easier, we use this file to pass these options that will be loaded when our container starts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Servers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"MaintenanceDB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"PassFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/pgpass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"SSLMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prefer"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running it
&lt;/h2&gt;

&lt;p&gt;With both of these files created, all you need to do is go to their directory and run&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will download the images and start both containers with everything as described in our docker-compose.yml, while logging everything in your terminal. If you don't want that, you can just run it detached with the &lt;code&gt;-d&lt;/code&gt; flag&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way your containers will be running in background.&lt;/p&gt;

&lt;p&gt;To stop the containers, you can use &lt;code&gt;Ctrl+C&lt;/code&gt; in case it's running attached to your terminal session, or you can run&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;

&lt;p&gt;While your containers are running, you'll go to &lt;code&gt;localhost:16543&lt;/code&gt; in your browser and access the pgAdmin dashboard. The first time you open it you'll need to log in with the credentials we set up in our docker-compose file. If you didn't change it, it's &lt;code&gt;teste@teste.com&lt;/code&gt; and the password is &lt;code&gt;teste&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once you're logged in, you can access the connections by clicking &lt;code&gt;Servers&lt;/code&gt; at the menu on the right. The first time you open it, it will ask you for the password of the connection. This is also in the docker-compose, and in our example it is &lt;code&gt;password&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Once you are connected, you can right-click on Databases and create your own. In case you're not used to Postgresql, it has the concept of "schemas", and that's where you'll find your tables.&lt;/p&gt;

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

&lt;p&gt;After this point, you can just use it as you want. You can right-click your database and click on &lt;code&gt;Query Tool&lt;/code&gt; to write and run your SQL scripts&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fani0bsws61xwmaiqxv99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fani0bsws61xwmaiqxv99.png" alt="Context menu of the database, showing the " width="440" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;That's all, hope this helps someone and follow me for more content. If you like it, share it with someone you think might need this.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>postgres</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tudo que você precisa saber sobre SQL</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Fri, 22 Sep 2023 12:39:57 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-sobre-sql-4oh2</link>
      <guid>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-sobre-sql-4oh2</guid>
      <description>&lt;p&gt;SQL é uma linguagem de manipulação e consulta de dados, que é usada em diversas ferramentas diferentes e que nos permite interagir com os bancos de dados sem a necessidade de muitos conhecimentos em linguagem de programação. Hoje a linguagem é um requisito chave em todas as carreiras da área de dados, mas também é um conhecimento muito importante para pessoas desenvolvedoras de backend.&lt;/p&gt;

&lt;p&gt;Pra ser sincero, esse assunto é super relativo e as suas necessidades podem variar de acordo com o tipo de trabalho que vai fazer. Vou descrever algumas coisas intermediárias e focar em boas práticas de escrita de consultas, que acredito ser o mais importante. A partir do entendimento básico, a habilidade mais importante passa a ser conseguir usar as documentações da linguagem e das ferramentas para conseguir fazer o que você precisar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tudo que eu preciso saber sobre?
&lt;/h2&gt;

&lt;p&gt;Meu objetivo aqui é simples: prover toda informação disponível para você (desenvolvedor) começar e conseguir usar a ferramenta da vez. Não pretendo responder tudo que você &lt;strong&gt;pode&lt;/strong&gt; ou &lt;strong&gt;deveria&lt;/strong&gt; saber, apenas o necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Tudo que eu preciso saber sobre?&lt;/li&gt;
&lt;li&gt;Table of contents&lt;/li&gt;
&lt;li&gt;
O que é SQL

&lt;ol&gt;
&lt;li&gt;Variantes de SQL&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Quando eu deveria usar SQL&lt;/li&gt;

&lt;li&gt;

Por onde começar

&lt;ol&gt;
&lt;li&gt;SQL Bolt&lt;/li&gt;
&lt;li&gt;DB Fiddle&lt;/li&gt;
&lt;li&gt;BigQuery&lt;/li&gt;
&lt;li&gt;PostgreSQL + pgAdmin + Docker&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;A linguagem&lt;/li&gt;

&lt;li&gt;

DDL

&lt;ol&gt;
&lt;li&gt;CREATE&lt;/li&gt;
&lt;li&gt;DROP&lt;/li&gt;
&lt;li&gt;ALTER&lt;/li&gt;
&lt;li&gt;TRUNCATE&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

DML

&lt;ol&gt;
&lt;li&gt;INSERT&lt;/li&gt;
&lt;li&gt;UPDATE&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;DQL&lt;/li&gt;

&lt;li&gt;

Sintaxe básica

&lt;ol&gt;
&lt;li&gt;SELECT&lt;/li&gt;
&lt;li&gt;FROM&lt;/li&gt;
&lt;li&gt;WHERE&lt;/li&gt;
&lt;li&gt;LIKE&lt;/li&gt;
&lt;li&gt;ORDER BY&lt;/li&gt;
&lt;li&gt;LIMIT&lt;/li&gt;
&lt;li&gt;OFFSET&lt;/li&gt;
&lt;li&gt;UNION&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

Joins

&lt;ol&gt;
&lt;li&gt;INNER JOIN&lt;/li&gt;
&lt;li&gt;LEFT JOIN&lt;/li&gt;
&lt;li&gt;RIGHT JOIN&lt;/li&gt;
&lt;li&gt;FULL OUTER JOIN&lt;/li&gt;
&lt;li&gt;CROSS JOIN&lt;/li&gt;
&lt;li&gt;Funções de agregação&lt;/li&gt;
&lt;li&gt;COUNT&lt;/li&gt;
&lt;li&gt;SUM&lt;/li&gt;
&lt;li&gt;AVG&lt;/li&gt;
&lt;li&gt;MAX&lt;/li&gt;
&lt;li&gt;MIN&lt;/li&gt;
&lt;li&gt;GROUP BY&lt;/li&gt;
&lt;li&gt;HAVING&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

Funções condicionais

&lt;ol&gt;
&lt;li&gt;IF&lt;/li&gt;
&lt;li&gt;CASE&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

Funções de texto

&lt;ol&gt;
&lt;li&gt;LOWER&lt;/li&gt;
&lt;li&gt;UPPER&lt;/li&gt;
&lt;li&gt;CONCAT&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Subconsultas&lt;/li&gt;

&lt;li&gt;CTE’s&lt;/li&gt;

&lt;li&gt;Ordem de operações do SELECT&lt;/li&gt;

&lt;li&gt;Outras coisas&lt;/li&gt;

&lt;li&gt;Onde encontrar mais informações&lt;/li&gt;

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

&lt;/ol&gt;

&lt;h2&gt;
  
  
  O que é SQL
&lt;/h2&gt;

&lt;p&gt;SQL é a sigla para &lt;strong&gt;Structured Query Language&lt;/strong&gt;, ou em tradução livre, &lt;strong&gt;Linguagem de consulta estruturada&lt;/strong&gt;. Isso ajuda a entender o principal objetivo, que é consultar dados. Apesar disso, é possível fazer muito mais coisas utilizando SQL. &lt;/p&gt;

&lt;p&gt;De forma mais geral, SQL é usada para consultar e manipular dados em &lt;strong&gt;bancos de dados relacionais&lt;/strong&gt;, além de gerenciar e manter as estruturas de dados (como tabelas, por exemplo). &lt;/p&gt;

&lt;p&gt;É uma &lt;strong&gt;linguagem declarativa&lt;/strong&gt;, o que significa que você descreve quais são os resultados que você espera, e não exatamente como o computador deve calcular ou retornar eles. &lt;/p&gt;

&lt;h3&gt;
  
  
  Variantes de SQL
&lt;/h3&gt;

&lt;p&gt;Existem vários “dialetos” diferentes de SQL, que aproveitaram o padrão e estenderam suas funcionalidades de acordo com o ponto de vista de algumas empresas específicas. A maior parte da sintaxe é compartilhada, e a não ser que você queira trabalhar como pessoa administradora de banco de dados de uma empresa que usa várias ferramentas distintas, você provavelmente não precisa aprender todas. Mas é importante entender que se pegarmos os principais bancos de dados do mercado (Microsoft SQL Server, PostgreSQL, MySQL, Oracle), cada um vai ter funções e pedaços de sintaxe levemente diferente dos outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando eu deveria usar SQL
&lt;/h2&gt;

&lt;p&gt;Bom, se você estiver usando um banco de dados relacional, provavelmente vai &lt;strong&gt;precisar&lt;/strong&gt; usar SQL. Mesmo que você esteja usando uma biblioteca intermediária na sua linguagem (geralmente são chamadas de &lt;strong&gt;ORM&lt;/strong&gt;, e permitem a utilização do banco de dados quase sem depender de SQL. &lt;em&gt;Sequelize&lt;/em&gt; em NodeJS e &lt;em&gt;SQLAlchemy&lt;/em&gt; em python são alguns exemplos), nem toda manipulação é traduzida para a biblioteca.&lt;/p&gt;

&lt;p&gt;Nós poderíamos ir um passo atrás e questionar &lt;strong&gt;quando deveria usar um banco de dados relacional&lt;/strong&gt;, visto que existem diversos tipos diferentes de bancos de dados, mas é um assunto extenso e pretendo falar sobre todos eles no futuro.&lt;/p&gt;

&lt;p&gt;Ou seja, a utilização de SQL provavelmente vem da definição da ferramenta que está sendo utilizada no seu time.&lt;/p&gt;

&lt;p&gt;E apenas para encerrar esse tópico, queria ressaltar que é possível usar SQL (ou algo muito parecido) em ferramentas que não foram feitas para isso. Dentro do framework Spark, de processamento de dados, você pode escolher usar SQL ao invés da API de dataframes na linguagem usada (geralmente python, por ex). E o meu exemplo preferido, é possível usar um “pseudo-SQL” em planilhas do Google para consultar seus dados. Também vou escrever sobre isso em breve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por onde começar
&lt;/h2&gt;

&lt;p&gt;Por ser uma linguagem declarativa, a melhor forma de aprender é na prática. Por isso, &lt;strong&gt;na minha opinião&lt;/strong&gt;, para começar é importante conseguir um local para executar suas consultas. Então vou trazer 4 opções:&lt;/p&gt;

&lt;h3&gt;
  
  
  SQL Bolt
&lt;/h3&gt;

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

&lt;p&gt;O &lt;a href="https://sqlbolt.com/" rel="noopener noreferrer"&gt;SQL Bolt&lt;/a&gt; é um bom começo, apesar de limitado. Além de ter conteúdo sobre a sintaxe, ele oferece alguns problemas simples para ser resolvidos, de forma que você não precisa se preocupar em configurar um banco de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  DB Fiddle
&lt;/h3&gt;

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

&lt;p&gt;O &lt;a href="https://www.db-fiddle.com/" rel="noopener noreferrer"&gt;db fiddle&lt;/a&gt; é um ótimo jeito de praticar SQL em geral, mas ele não tem tabelas prontas para você utilizar. Testei usar o Chat GPT e pedir para ele descrever tabelas e exercícios, e ele conseguiu atender bem a necessidade. Você pode descrever quais tabelas quer, quais campos cada uma deve ter e pedir que ele gere o SQL para criar as tabelas e preenchê-las com dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  BigQuery
&lt;/h3&gt;

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

&lt;p&gt;Quem me conhece sabe que é uma das minhas ferramentas preferidas, porque é possível fazer muita coisa com ele. O BigQuery é a ferramenta de Data Warehouse da Google Cloud, e além de oferecer uma cota gratuita (1 tb de dados processados, 10 gb de dados armazenados), ele também conta com uma série de &lt;a href="https://cloud.google.com/bigquery/public-data" rel="noopener noreferrer"&gt;datasets públicos&lt;/a&gt; que podem ser utilizados para estudos. Lá encontramos dados de github, da wikipedia, dados de tráfego aéreo e taxis dos EUA e mais uma dezena de coisas diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL + pgAdmin + Docker
&lt;/h3&gt;

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

&lt;p&gt;Um dos motivos de ter feito o post sobre Docker tão cedo, é que ele passa a ser requisito para facilitar nossa vida e nossos estudos. &lt;/p&gt;

&lt;p&gt;Nesse &lt;a href="https://github.com/1cadumagalhaes/postgresql_docker_compose" rel="noopener noreferrer"&gt;repositório do github&lt;/a&gt; deixei os arquivos e uma explicação de como utilizar.&lt;/p&gt;

&lt;p&gt;Para usar, você só precisa de um docker-compose.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
        &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=postgres&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres-db-volume:/var/lib/postgresql/data&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;
        &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres-db-network&lt;/span&gt;
    &lt;span class="na"&gt;pgadmin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dpage/pgadmin4&lt;/span&gt;
        &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;PGADMIN_DEFAULT_EMAIL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;teste@teste.com'&lt;/span&gt;
            &lt;span class="na"&gt;PGADMIN_DEFAULT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;teste'&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;16543:80&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./servers.json:/pgadmin4/servers.json&lt;/span&gt;
        &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres-db-network&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;postgres-db-volume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
        &lt;span class="na"&gt;driver_opts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;
            &lt;span class="na"&gt;o&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bind&lt;/span&gt;
            &lt;span class="na"&gt;device&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./data&lt;/span&gt;
&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;postgres-db-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E nesse exemplo, criei o arquivo servers.json para que você não precise fazer a configuração na interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Servers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"MaintenanceDB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"PassFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/pgpass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"SSLMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prefer"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, basta executar o comando &lt;code&gt;docker compose up&lt;/code&gt; no diretório. Isso vai criar 2 contêineres: um responsável pelo banco de dados, e que está disponível na porta 5432  (Ele também tem um volume montado na pasta &lt;code&gt;data&lt;/code&gt; . Isso é um bônus caso você queira que os seus dados persistam no disco, e não só no volume do docker). E um container com o pgdamin, que é uma ferramenta open source de utilização do postgres. &lt;/p&gt;

&lt;p&gt;Então basta acessar o endereço localhost:16543 no seu navegador, fazer login no pgadmin, e abrir a opção Servers no menu da esquerda. Um popup pedindo a senha do banco de dados deve aparecer, basta preencher e confirmar.&lt;/p&gt;

&lt;p&gt;Com esse setup, você deve conseguir fazer qualquer curso de bancos de dados sem grandes problemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  A linguagem
&lt;/h2&gt;

&lt;p&gt;Antes de continuar, precisamos esclarecer uma coisa. SQL pode ser dividido em 5 pedaços:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DDL&lt;/strong&gt; - Data Definition Language, ou Linguagem de Definição de Dados. São os comandos para gerenciar os objetos do banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DML&lt;/strong&gt; - Data Manipulation Language, ou Linguagem de Manipulação de Dados. São os comandos que gerenciam os dados dentro das tabelas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DQL&lt;/strong&gt; - Data Query Language, ou Linguagem de Consulta de Dados. São os comandos para consultar os dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DTL&lt;/strong&gt; - Data Transaction Language, ou Linguagem de Transação de Dados. São comandos específicos para controlar transações, que não é um assunto que vou tratar hoje.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DCL&lt;/strong&gt; - Data Control Language - Linguagem de Controle de Dados. São os comandos que controlam os acessos ao banco de dados e seus recursos. Também não vamos falar sobre isso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas divisões podem ser diferentes em alguns materiais (alguns livros consideram o SELECT como DML e não como uma etapa completamente separada, o DQL). E algumas ferramentas não tem todas essas etapas. Então daqui pra frente, vamos falar brevemente de DDL e DML dando um resumo e exemplo dos principais comandos de cada um. No final vamos detalhar DQL, que vai ser a parte mais extensa.&lt;/p&gt;

&lt;p&gt;E outra coisa importante: normalmente escrevemos as palavras chave de SQL em maiúsculo. Isso não é obrigatório, mas ajuda a separar o que é palavra reservada do que não é. Então daqui pra frente, toda palavra em maiúsculo você pode considerar como palavra especial ou função&lt;/p&gt;

&lt;h2&gt;
  
  
  DDL
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CREATE
&lt;/h3&gt;

&lt;p&gt;O comando CREATE é usado para &lt;strong&gt;criar&lt;/strong&gt; objetos de banco de dados, como tabelas ou views, por exemplo.&lt;/p&gt;

&lt;p&gt;Para criar uma tabela, precisamos descrever todas as suas colunas, os seus tipos e mais algumas regras (por ex, se aquele campo pode ser vazio ou não). No exemplo abaixo criamos uma tabela “clientes”, com os campos id, nome e email. Lembrando que como estou usando o postgresql, temos algumas coisas especificas, como o tipo SERIAL no id abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos criar views, que são uma forma de armazenar consultas prontas no nosso banco de dados. Para isso, a sintaxe é como abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;consulta_clientes&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; 
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DROP
&lt;/h3&gt;

&lt;p&gt;O comando DROP é usado para &lt;strong&gt;excluir&lt;/strong&gt; objetos de banco de dados, como as tabelas. Veja que não estamos falando de apagar os dados, mas a tabela em si.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ALTER
&lt;/h3&gt;

&lt;p&gt;O comando ALTER é usado para modificar a estrutura de objetos de banco de dados já existentes, como adicionar ou remover colunas de uma tabela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;telefone&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  TRUNCATE
&lt;/h3&gt;

&lt;p&gt;O comando TRUNCATE é usado para remover todos os dados de uma tabela, mas mantendo a estrutura da tabela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;
&lt;span class="k"&gt;TRUNCATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  DML
&lt;/h2&gt;

&lt;h3&gt;
  
  
  INSERT
&lt;/h3&gt;

&lt;p&gt;O comando INSERT é usado para adicionar novos registros a uma tabela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'João'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'joao@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É interessante notar que podemos inserir mais de uma linha de uma vez:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Joana'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'joana@example.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'James'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'james@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E também podemos inserir numa tabela o resultado de uma consulta. Por exemplo, se tivermos uma tabela &lt;code&gt;clientes_backup&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes_backup&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  UPDATE
&lt;/h3&gt;

&lt;p&gt;O comando UPDATE é usado para modificar os registros existentes em uma tabela. Tanto para o UPDATE quanto para o DELETE, é muito importante filtrar em quais dados estaremos mexendo, pois esses comandos podem alterar todos os dados da tabela se usados sem cuidado. A sintaxe do update é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'James Suco de Fruta'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'james_suco@example.com'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'james@example.com'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veja que agora temos a palavra chave SET, que é usada para escolher quais colunas iremos alterar e quais serão os novos valores. Aproveitei para deixar no exemplo a alteração de duas colunas, para mostrar como fica a sintaxe.&lt;/p&gt;

&lt;p&gt;Além disso, aqui vemos pela primeira vez a utilização do &lt;strong&gt;WHERE&lt;/strong&gt;, que é a forma de filtrar dados no SQL. O legal do SQL é que tendo um conhecimento básico de inglês, conseguimos entender exatamente o que está sendo feito. Vou detalhar melhor as condições de WHERE quando falarmos de SELECT, então por hora isso é tudo. &lt;/p&gt;

&lt;h3&gt;
  
  
  DELETE
&lt;/h3&gt;

&lt;p&gt;O comando DELETE é usado para remover registros de uma tabela. E ressaltando mais uma vez, é &lt;strong&gt;extremamente importante filtrar os dados&lt;/strong&gt; quando for utilizar esse comando. Um delete sem WHERE é equivalente a apagar todos os dados da tabela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  DQL
&lt;/h2&gt;

&lt;p&gt;A princípio, o DQL  tem somente um comando: SELECT. Mas vamos aproveitar esse pedaço para falar sobre a estrutura de uma consulta e das funções disponíveis. &lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe básica
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
  &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;nome_cliente&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
  &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
  &lt;span class="n"&gt;sexo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;"m"&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SELECT
&lt;/h3&gt;

&lt;p&gt;É usado para selecionar os dados (é). Os dados são retornados num formato tabelar. Aqui você pode descrever quais são as colunas que quer selecionar, pode acrescentar colunas novas no resultado, utilizar condicionais e agregações (descritos mais abaixo), dar novos nomes às colunas. A sintaxe é simples e a melhor forma de entender é testando, então recomendo novamente dar uma olhada no SQL bolt.&lt;/p&gt;

&lt;p&gt;De forma geral:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; vai retornar &lt;strong&gt;todas&lt;/strong&gt; as colunas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;coluna&lt;/code&gt; vai retornar uma coluna com o mesmo nome.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;coluna AS apelido_coluna&lt;/code&gt; vai mudar o nome da coluna somente no resultado&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DISTINCT&lt;/code&gt; pode ser usado para trazer uma combinação de valores distintos das suas colunas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;* EXCEPT(coluna_2, coluna_3)&lt;/code&gt; pode ser utilizado para retornar &lt;strong&gt;todas as colunas&lt;/strong&gt; menos algumas específicas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  FROM
&lt;/h3&gt;

&lt;p&gt;Aqui definimos de onde vamos consultar. A forma como o endereço é passado depende da ferramenta de banco de dados, no caso do postgres você pode passar somente o nome da tabela (caso esteja usando o schema public, que é o padrão), ou o formato &lt;code&gt;schema.tabela&lt;/code&gt; . Os JOIN (que estão descritos mais abaixo) também fazem parte do FROM, pois são uma forma de acrescentar mais tabelas no resultado.&lt;/p&gt;

&lt;h3&gt;
  
  
  WHERE
&lt;/h3&gt;

&lt;p&gt;Usamos o WHERE para filtrar os resultados com base numa condição pré-definida. Para isso precisamos saber os operadores condicionais básicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&lt;/code&gt; (maior): &lt;code&gt;altura&amp;gt;150&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;&lt;/code&gt; (menor): &lt;code&gt;idade&amp;lt;25&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;=&lt;/code&gt; (igual): &lt;code&gt;email='cadu@cadumagalhaes.dev'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!=&lt;/code&gt; ou &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; (diferente): &lt;code&gt;nome!='Cadu'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;=&lt;/code&gt;(maior ou igual): &lt;code&gt;idade&amp;gt;=18&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;=&lt;/code&gt; (menor ou igual): &lt;code&gt;sapato&amp;lt;=40&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BETWEEN&lt;/code&gt; (entre): &lt;code&gt;idade BETWEEN 18 AND 25&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IN ()&lt;/code&gt; (valor pertence a lista): &lt;code&gt;cidade IN ('SP','RJ')&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LIKE&lt;/code&gt; detalhes abaixo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E os operadores lógicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AND&lt;/code&gt; : &lt;code&gt;idade&amp;gt;12 AND cidade='Sao Paulo'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OR&lt;/code&gt; : &lt;code&gt;cidade='Sao Paulo' OR cidade='Rio de Janeiro'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  LIKE
&lt;/h3&gt;

&lt;p&gt;O LIKE tem uma estrutura diferente e por isso achei melhor deixar separado. A principio, ele pode ser usado como o &lt;code&gt;=&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'Carlos'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E nesse caso, vai trazer somente caso o resultado seja exatamente igual. Mas o like tem 2 operadores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;%&lt;/code&gt; : pode ser substituido por qualquer coisa em qualquer quantidade&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_&lt;/code&gt; : pode ser substituido por &lt;strong&gt;uma ocorrência&lt;/strong&gt; de qualquer coisa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, caso queiramos saber todos os nomes que &lt;strong&gt;começam com Carlos&lt;/strong&gt;, fazemos assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'Carlos%'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso, eu leio como “Carlos qualquer coisa”, porque é o que ele vai retornar. Se for somente Carlos, retorna. Se tiver outras coisas, como “Carlos Eduardo”, também retorna. O valor “Roberto Carlos” não seria retornado nesse caso, pois não começa com nossa condição.&lt;/p&gt;

&lt;p&gt;Se quisermos saber todos os nomes que &lt;strong&gt;terminam com Silva&lt;/strong&gt;, fazemos assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%Silva'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De forma semelhante, não importa o que há antes, desde que termine com Silva.&lt;/p&gt;

&lt;p&gt;Se quisermos saber todos os nomes que &lt;strong&gt;contém Carlos,&lt;/strong&gt; fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%Carlos%'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que agora colocamos o símbolo de porcentagem antes e depois do texto que estamos buscando.&lt;/p&gt;

&lt;p&gt;Para entender o outro operador, vamos imaginar que temos uma coluna que tem as &lt;strong&gt;iniciais dos nomes das pessoas&lt;/strong&gt;. Temos o Cadu Magalhães (CM), o Cristiano Ronaldo (CR7), o Ronaldo Fenômeno (R9), o Roberto Carlos (RC) e o Neymar (NJR)&lt;/p&gt;

&lt;p&gt;Se por algum motivo nós quisermos somente os resultados em que o R seja a &lt;strong&gt;segunda letra,&lt;/strong&gt; a nossa consulta ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;iniciais&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'_R%'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, estamos limitando que só pode haver um caractere antes do que estamos procurando. Honestamente nunca precisei usar esse operador, mas pouca gente fala sobre isso então achei legal trazer.&lt;/p&gt;

&lt;h3&gt;
  
  
  ORDER BY
&lt;/h3&gt;

&lt;p&gt;Usado para definir a ordenação dos resultados em ordem ascendente ou descendente, com base em uma ou mais colunas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;ou&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;genero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cidade&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão, vai ordenar de forma ascendente. Mas podemos especificar passando &lt;code&gt;ASC&lt;/code&gt; ou &lt;code&gt;DESC&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  LIMIT
&lt;/h3&gt;

&lt;p&gt;Usado para definir a quantidade de resultados que deve ser retornada. Por ex, para saber o top 3 de uma competição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;resultados&lt;/span&gt; 
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;nota&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OFFSET
&lt;/h3&gt;

&lt;p&gt;Geralmente é usado junto com o LIMIT quando precisamos retornar algum número que não esta exatamente no topo. Serve para dizer quantas linhas do inicio devem ser puladas antes de retornar. Por exemplo, se eu quiser uma consulta que retorne somente &lt;strong&gt;o segundo colocado&lt;/strong&gt; da competição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;resultados&lt;/span&gt; 
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;nota&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  UNION
&lt;/h3&gt;

&lt;p&gt;UNION é usado para juntar tabelas de forma &lt;strong&gt;vertical&lt;/strong&gt;, ou seja, empilhar uma em cima da outra. É uma forma de aumentar o número de linhas, e não de colunas.&lt;/p&gt;

&lt;p&gt;Por exemplo, se temos 2 tabelas de clientes e queremos juntar o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes_1&lt;/span&gt;
&lt;span class="k"&gt;UNION&lt;/span&gt; 
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes_2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando tem uma variação, que é o &lt;code&gt;UNION ALL&lt;/code&gt;. A diferença é que por padrão, o UNION vai juntar somente resultados únicos. Então se uma mesma linha está nas duas tabelas, vai aparecer uma única vez. Quando usamos &lt;code&gt;UNION ALL&lt;/code&gt;, todas as linhas são retornadas, incluindo duplicidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Joins
&lt;/h2&gt;

&lt;p&gt;A partir daqui as coisas começam a ficar confusas de novo. Temos 5 tipos de join, e é bem difícil explicar as diferenças em texto. Join é uma forma de &lt;strong&gt;juntar duas tabelas horizontalmente&lt;/strong&gt;. Ou seja, vamos colocar uma tabela do lado da outra, de acordo com uma condição pré definida. Para isso, vamos considerar sempre que a tabela que colocamos no nosso FROM está na esquerda, e a tabela que estamos dando JOIN está na direita. Isso vai facilitar o entendimento de algumas coisas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/..." class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/..." alt="Uploading image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  INNER JOIN
&lt;/h3&gt;

&lt;p&gt;Retorna somente as linhas em que a condição de join deu resultado nas tabelas &lt;strong&gt;dos dois lados.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  LEFT JOIN
&lt;/h3&gt;

&lt;p&gt;Retorna todas as linhas da tabela da esquerda, e preenche na direita somente o que deu resultado. Quando não houver match, vai preencher com &lt;strong&gt;null&lt;/strong&gt;. É um bom jeito de &lt;strong&gt;acrescentar informações&lt;/strong&gt; nas tabelas.&lt;/p&gt;

&lt;h3&gt;
  
  
  RIGHT JOIN
&lt;/h3&gt;

&lt;p&gt;O contrário do LEFT JOIN, é só uma questão de referencial.&lt;/p&gt;

&lt;h3&gt;
  
  
  FULL OUTER JOIN
&lt;/h3&gt;

&lt;p&gt;Retorna &lt;strong&gt;todas as linhas&lt;/strong&gt;, não só as que deram match mas as que não deram também, dos dois lados.&lt;/p&gt;

&lt;h3&gt;
  
  
  CROSS JOIN
&lt;/h3&gt;

&lt;p&gt;Vai juntar cada uma das linhas da primeira tabela com &lt;strong&gt;todas as linhas&lt;/strong&gt; da segunda tabela. Ou seja, vai retornar um “&lt;strong&gt;produto cartesiano&lt;/strong&gt;”* das duas tabelas.&lt;/p&gt;

&lt;p&gt;A melhor forma de entender joins é com exemplos, e acho que esse é o tipo de coisa que fica muito mais confusa se for somente por texto. Se acharem necessário, posso revisar esse post e acrescentar exemplos para cada um deles, mas por enquanto vou economizar esses minutos de leitura (e possivelmente horas de escrita). Então comenta aqui no post se quiser que eu tente explicar melhor os joins :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Funções de agregação
&lt;/h3&gt;

&lt;h3&gt;
  
  
  COUNT
&lt;/h3&gt;

&lt;p&gt;Serve para contar a quantidade de resultados com base na agregação definida. Por exemplo, se eu quiser saber quantas pessoas de cada gênero tem na minha tabela de clientes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;genero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;genero&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veja que no exemplo eu acrescentei o &lt;code&gt;GROUP BY&lt;/code&gt;. Quando começamos a agregar os dados, precisamos garantir que as nossas &lt;code&gt;dimensões&lt;/code&gt; também estejam agregadas. Se não agruparmos, o banco de dados retornará um erro por não saber o que fazer com a coluna de gênero.&lt;/p&gt;

&lt;p&gt;Também podemos removê-la e contar o total de clientes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E nesse caso não precisamos agrupar por outras colunas.&lt;/p&gt;

&lt;h3&gt;
  
  
  SUM
&lt;/h3&gt;

&lt;p&gt;Serve para somar o valor de uma determinada coluna e retornar o total.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;receita_total&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
  &lt;span class="n"&gt;compras&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Importante ressaltar que só pode somar valores numéricos.&lt;/p&gt;

&lt;h3&gt;
  
  
  AVG
&lt;/h3&gt;

&lt;p&gt;Calcula o valor médio de uma coluna.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;receita_media&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
  &lt;span class="n"&gt;compras&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  MAX
&lt;/h3&gt;

&lt;p&gt;Retorna o maior valor de uma coluna.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;maior_receita&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
  &lt;span class="n"&gt;compras&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  MIN
&lt;/h3&gt;

&lt;p&gt;Retorna o menor valor de uma coluna.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;MIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;menor_receita&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; 
  &lt;span class="n"&gt;compras&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GROUP BY
&lt;/h3&gt;

&lt;p&gt;Bom, já falei ali atrás, mas o principal uso do GROUP BY é ajudar a retornar as funções de agregação junto de uma dimensão. Você também pode usar o GROUP BY pra deduplicar (literalmente agrupar) linhas nas colunas.&lt;/p&gt;

&lt;h3&gt;
  
  
  HAVING
&lt;/h3&gt;

&lt;p&gt;Um detalhe importante aqui, é que nós não conseguimos usar &lt;code&gt;WHERE&lt;/code&gt; para filtrar o resultado de agregações. Por exemplo, se eu quiser trazer somente os clientes cuja receita média é maior que 100, isso não pode ser feito no WHERE.&lt;/p&gt;

&lt;p&gt;Para isso existe o HAVING, que permite que façamos filtros nos resultados com base nas agregações. E vou aproveitar para mostrar como usar tudo isso de uma vez:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_receita&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;media_receita&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;numero_pedidos&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;
  &lt;span class="n"&gt;pedidos&lt;/span&gt;
  &lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Sao Paulo'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="n"&gt;numero_pedidos&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;total_receita&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa consulta traz o top 3 clientes que mais gastaram em São Paulo e que fizeram menos de 10 pedidos, com o detalhe de que a informação da cidade não está disponível na tabela de pedidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções condicionais
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tecnicamente&lt;/strong&gt; as condicionais também são funções de agregação&lt;/p&gt;

&lt;h3&gt;
  
  
  IF
&lt;/h3&gt;

&lt;p&gt;Serve para definir o valor de uma coluna com base numa condição simples, com apenas 2 possíveis resultados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condicao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pais&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'BR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'pessoa brasileira'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'pessoa estrangeira'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;nacionalidade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CASE
&lt;/h3&gt;

&lt;p&gt;Serve para definir o valor de uma coluna com base em qualquer condição, com N possíveis resultados, além de um valor padrão caso nenhuma condição seja verdadeira.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;condicao_1&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;condicao_2&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;pais&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'BR'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'pessoa brasileira'&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;pais&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'EUA'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'pessoa americana'&lt;/span&gt;
  &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="s1"&gt;'outros'&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;nacionalidade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções de texto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  LOWER
&lt;/h3&gt;

&lt;p&gt;Transforma o valor de uma coluna em minúsculas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  UPPER
&lt;/h3&gt;

&lt;p&gt;Transforma o valor de uma coluna em maiúsculas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPPER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CONCAT
&lt;/h3&gt;

&lt;p&gt;Concatena (junta) valores de texto em uma única coluna.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor_1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'string'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor_2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Provavelmente existem outras centenas de funções, essas são as mais comuns para tratamentos simples de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subconsultas
&lt;/h2&gt;

&lt;p&gt;Honestamente eu tenho muito receio com o conceito de subconsultas porque a leitura pode ficar bem ruim. Para quem conhece Javascript, isso me lembra um pouco o &lt;strong&gt;callback hell&lt;/strong&gt; de quando não tinhamos async await. A ideia é que podemos executar pequenos SELECT’s em qualquer parte da nossa consulta. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Consulta principal para encontrar pedidos que contenham um item específico&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
  &lt;span class="n"&gt;numero_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="n"&gt;data_pedido&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pedidos&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;numero_pedido&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;-- Subconsulta para encontrar os números de pedido que contêm o item específico&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;numero_pedido&lt;/span&gt; 
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;itens_pedidos&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nome_item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Produto X'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primeiramente obrigado Chat GPT por me dar um exemplo. Segundamente, estamos fazendo uma consulta que retorna todos os pedidos que tiveram um determinado produto. Mas essa consulta poderia ser mais complexa. Imagine que não queremos somente os pedidos, queremos pegar nosso exemplo anterior e juntar também a cidade de onde cliente é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Consulta principal para encontrar pedidos que contenham um item específico&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
  &lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;data_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero_pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;total_pedidos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita_pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_receita&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="c1"&gt;--Subconsulta para juntar a tabela de pedidos com a de clientes&lt;/span&gt;
      &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="n"&gt;numero_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;data_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;receita_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;cidade_cliente&lt;/span&gt;
      &lt;span class="k"&gt;FROM&lt;/span&gt;
        &lt;span class="n"&gt;pedidos&lt;/span&gt;
        &lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;numero_pedido&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;-- Subconsulta para encontrar os números de pedido que contêm o item específico&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;numero_pedido&lt;/span&gt; 
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;itens_pedidos&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nome_item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Produto X'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_pedido&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E acho que podemos ver como a dificuldade de leitura da consulta aumenta junto com a complexidade. Já precisei trabalhar com consultas legadas que tinham mais de 10 níveis de subconsulta atrás de subconsulta, num pesadelo de &lt;code&gt;SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM...&lt;/code&gt; . Fora as limitações: as subconsultas só podem ser referenciadas uma vez. Se por algum motivo um outro pedaço da sua query precisar de uma subconsulta, você vai precisar repetir.&lt;/p&gt;

&lt;h2&gt;
  
  
  CTE’s
&lt;/h2&gt;

&lt;p&gt;E é aí que entram as CTE’s, do inglês &lt;strong&gt;Common Table Expression&lt;/strong&gt;,* ou &lt;strong&gt;Expressão de Tabela Comum&lt;/strong&gt;. A CTE é uma construção que permite definir uma &lt;strong&gt;tabela temporária&lt;/strong&gt; dentro da sua consulta. Tem exatamente a mesma ideia que a subconsulta, com a diferença de que a sintaxe fica um pouco mais clara, e de que ela pode ser referenciada várias vezes na sua consulta.&lt;/p&gt;

&lt;p&gt;Minha recomendação é usar CTE &lt;strong&gt;sempre que possível&lt;/strong&gt; no lugar de uma subconsulta.&lt;/p&gt;

&lt;p&gt;Acho que o jeito mais fácil de explicar é refatorar o exemplo acima, então aqui vai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;pedidos_com_produto&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="c1"&gt;-- Subconsulta para encontrar os números de pedido que contêm o item específico&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;numero_pedido&lt;/span&gt; 
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;itens_pedidos&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;nome_item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Produto X'&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;pedidos_e_cidades&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="c1"&gt;--Subconsulta para juntar a tabela de pedidos com a de clientes&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;numero_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;receita_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cidade_cliente&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt;
    &lt;span class="n"&gt;pedidos&lt;/span&gt;
    &lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;-- Consulta principal para encontrar pedidos que contenham um item específico&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; 
  &lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;data_pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero_pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;total_pedidos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receita_pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_receita&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pedidos_e_cidades&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;numero_pedido&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;pedidos_com_produto&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data_pedido&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pode ser um grande preconceito meu, mas para mim, essa segunda consulta é muito mais legível. Caso a sintaxe não tenha ficado clara, definimos uma CTE usando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;nome_tabela_tempor&lt;/span&gt;&lt;span class="err"&gt;á&lt;/span&gt;&lt;span class="n"&gt;ria&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;subconsulta&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, separamos múltiplas CTE’s por vírgula. E no final, a nossa consulta &lt;strong&gt;precisa&lt;/strong&gt; terminar com um SELECT.&lt;/p&gt;

&lt;p&gt;Absolutamente toda consulta com mais de uma etapa que eu escrevo é feita com CTE’s, porque além de separar de forma declarativa as etapas, também ajuda a separar os passos durante a construção da consulta. Se puder deixar &lt;strong&gt;uma&lt;/strong&gt; lição com esse post, é que você tente usar CTE’s caso vá fazer grandes consultas. &lt;/p&gt;

&lt;h2&gt;
  
  
  Ordem de operações do SELECT
&lt;/h2&gt;

&lt;p&gt;Por padrão, o SQL executa cada cláusula da consulta em uma ordem bem determinada. É interessante entender essa ordem para saber como otimizar consultas, mas isso também nos ajuda a entender como as ferramentas interpretam nosso código.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;FROM&lt;/strong&gt;, incluindo &lt;strong&gt;JOINs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WHERE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GROUP BY&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HAVING&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WINDOW&lt;/strong&gt; functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SELECT&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DISTINCT&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNION&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ORDER BY&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LIMIT&lt;/strong&gt; e &lt;strong&gt;OFFSET&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note que o LIMIT é avaliado no final da consulta. Em alguns bancos de dados, isso significa que ele não vai limitar o custo de processamento da sua consulta, apenas o resultado mostrado. Então por via de regra, se você quer economizar em processamento, use o WHERE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outras coisas
&lt;/h2&gt;

&lt;p&gt;Além disso tudo ainda existem outros milhares tipos de funções que não trouxe aqui. Podemos lidar com dados geográficos, funções estatísticas, matemáticas, de definição de data, de timestamp e mais um monte de coisas. &lt;/p&gt;

&lt;p&gt;Além disso, não mencionei alguns outros assuntos um pouco mais avançados, como funções analíticas e de janelamento, subconsultas correlatas ou até a otimização de queries. &lt;strong&gt;Talvez&lt;/strong&gt; eu faça um outro post sobre SQL avançado, mas não está no cronograma dos próximos meses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde encontrar mais informações
&lt;/h2&gt;

&lt;p&gt;Sinceramente, aprendi SQL na prática muitos anos atrás, fazendo sistemas de CRUD como todo desenvolvedor. Como já mencionei, as próprias documentações das ferramentas tem bons exemplos e explicações da sintaxe das funções, então quando preciso de algo, vou atrás delas.&lt;/p&gt;

&lt;p&gt;Também gostei desse material aqui da Data Engineering Wiki, que é um resuminho simples de metade do que falei aqui e mais algumas coisas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dataengineering.wiki/Guides/SQL+Guide#DML%20vs%20DDL" rel="noopener noreferrer"&gt;https://dataengineering.wiki/Guides/SQL+Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sei que a Linux Tips fez algumas lives de “SQL Essentials”, que acompanhei brevemente e também recomendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=_6K_JRLD57E" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=_6K_JRLD57E&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E caso você queira usar o BigQuery, o Google tem uma documentação muito boa sobre o “GoogleSQL” que define toda a sintaxe, as expressões e as funções. Toda vez que quero fazer algo que não sei fazer no BigQuery, entro na documentação oficial e os exemplos sempre ajudam.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax" rel="noopener noreferrer"&gt;https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vi por cima os materiais da W3Schools e acho que tem bons exemplos e explicações também.&lt;/p&gt;

&lt;p&gt;Sobre &lt;strong&gt;bancos de dados&lt;/strong&gt;, o &lt;a class="mentioned-user" href="https://dev.to/danielhe4rt"&gt;@danielhe4rt&lt;/a&gt; tem uma série de 4 partes com alguns conceitos bem interessantes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/danielhe4rt/series/22802"&gt;Database 101&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De forma geral eu aprendi SQL faz muito tempo e não sei boas referências atuais. Se você souber algum bom curso, vídeo, post ou qualquer material manda aí!&lt;/p&gt;

&lt;p&gt;E como spoiler, estou há algum tempo planejando um curso completo de SQL, mas com foco em BigQuery. Não tenho nenhuma estimativa, mas com certeza vai sair.&lt;/p&gt;

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

&lt;p&gt;Para mim, o mais importante para saber SQL é entender qual o resultado que você quer, e com base nisso se virar para pesquisar (ou perguntar ao Chat GPT) como você pode fazer. &lt;/p&gt;

&lt;p&gt;Uma coisa que faço e que acho boa prática, é que quando vou explicar para alguém como fazer uma determinada tabela, eu construo um exemplo do resultado esperado numa planilha. Como trabalho com modelagem e tratamento de dados, isso também ajuda os analistas a entender como vai ser a tabela que eles vão receber para construir um dashboard ou fazer uma análise, e isso evita retrabalhos caso a nossa consulta não retorne o que precisam. &lt;/p&gt;

&lt;p&gt;Também precisa ficar claro que SQL é o tipo de habilidade que você só vai desenvolver praticando. Por mais que você entenda uma consulta feita por alguém, isso não significa que você seria capaz de escrevê-la. &lt;/p&gt;

&lt;p&gt;No início a prática consiste em nos acostumarmos com a sintaxe, mas conforme as necessidades vão se tornando mais complexas, ter praticado problemas semelhantes vai te ajudar muito. É difícil falar para uma pessoa iniciante que ela deve pensar por partes e ir desenvolvendo aos poucos, mas essa é a minha principal habilidade na resolução de problemas em geral. &lt;/p&gt;

&lt;p&gt;Então minhas dicas são: tente desenhar qual é o resultado final que você quer, escreva de onde vai vir cada dado, e na hora de executar faça uma parte de cada vez, sempre tentando executar partes menores para garantir que está funcionando. Quem sabe a frustração de escrever uma consulta gigante que da erro ou retorna nada vai concordar comigo aqui.&lt;/p&gt;

&lt;p&gt;E no geral, entenda bem o custo de executar as coisas na ferramenta que escolher. Mostrei aqui 3 opções gratuitas, mas no contexto de trabalho dificilmente algo será grátis. Por isso fica a recomendação geral de evitar fazer &lt;code&gt;SELECT *&lt;/code&gt; por aí.&lt;/p&gt;

&lt;p&gt;Me diz o que você achou desse tipo de post, e se você gostaria que isso virasse um vídeo no Youtube! Independente do resultado, pra ajudar a decidir sobre o que será o próximo post me acompanha lá no twitter!&lt;/p&gt;

&lt;p&gt;Espero que isso tenha sido útil para alguém, até a próxima!&lt;/p&gt;

&lt;p&gt;(Esse foi o primeiro post que publiquei no meu perfil do hashnode! Você pode me acompanhar por lá no &lt;a href="//blog.cadumagalhaes.dev"&gt;blog.cadumagalhaes.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>sql</category>
    </item>
    <item>
      <title>Tudo que você precisa saber sobre Terraform</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Tue, 11 Jul 2023 21:06:03 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-sobre-terraform-3bp4</link>
      <guid>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-sobre-terraform-3bp4</guid>
      <description>&lt;p&gt;Terraform é uma ferramenta open source desenvolvida para facilitar a criação, gerenciamento e a automatização da &lt;strong&gt;infraestrutura como código&lt;/strong&gt; (que vamos chamar de IAC, da sigla &lt;em&gt;infra as code)&lt;/em&gt;. Sua principal vantagem é que você escreve a sua infraestrutura de forma declarativa, e a ferramenta fica responsável por implementar seus recursos de maneira consistente.&lt;/p&gt;

&lt;p&gt;A grande maioria de exemplos de utilização de terraform pela internet é com AWS. Como trabalho com Google Cloud, vou fazer os exemplos baseados nisso. &lt;/p&gt;

&lt;h2&gt;
  
  
  Tudo que eu preciso saber sobre?
&lt;/h2&gt;

&lt;p&gt;Meu objetivo aqui é simples: prover toda informação disponível para você (pessoa desenvolvedora) começar e conseguir usar a ferramenta da vez. Não pretendo responder tudo que você &lt;strong&gt;pode&lt;/strong&gt; ou &lt;strong&gt;deveria&lt;/strong&gt; saber, apenas o necessário. &lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O que é IAC&lt;/li&gt;
&lt;li&gt;O que é Terraform&lt;/li&gt;
&lt;li&gt;Quando eu deveria usar Terraform&lt;/li&gt;
&lt;li&gt;
Por onde começar

&lt;ul&gt;
&lt;li&gt;Instalação&lt;/li&gt;
&lt;li&gt;A linguagem do terraform&lt;/li&gt;
&lt;li&gt;Estrutura do repositório&lt;/li&gt;
&lt;li&gt;Terraform settings&lt;/li&gt;
&lt;li&gt;Providers&lt;/li&gt;
&lt;li&gt;Backends&lt;/li&gt;
&lt;li&gt;Terraform state&lt;/li&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Declarando valores fixos para as variáveis&lt;/li&gt;
&lt;li&gt;Locals&lt;/li&gt;
&lt;li&gt;Resources&lt;/li&gt;
&lt;li&gt;Modules&lt;/li&gt;
&lt;li&gt;Outputs&lt;/li&gt;
&lt;li&gt;Outras coisas avançadas&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Repositório de exemplo&lt;/li&gt;

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

&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é IAC
&lt;/h2&gt;

&lt;p&gt;Antes de seguir e falar especificamente do Terraform, vamos entender um pouco sobre sua base.&lt;/p&gt;

&lt;p&gt;Se você que está lendo já formatou um computador pessoal, sabe como pode dar trabalho instalar todos os softwares necessários para fazer alguma tarefa. Agora imagine se o seu trabalho for provisionar computadores para um servidor ou uma aplicação, e que você precisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar máquinas virtuais&lt;/li&gt;
&lt;li&gt;Instalar programas nelas&lt;/li&gt;
&lt;li&gt;Criar um banco de dados pra aplicação&lt;/li&gt;
&lt;li&gt;Fazer as configurações de rede e firewall&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse caso, dependendo da quantidade de vezes que você for fazer isso, faz sentido pensar em automatizar, certo?&lt;/p&gt;

&lt;p&gt;Por causa disso, ao longo dos anos surgiram várias ferramentas de automação para facilitar esse tipo de provisionamento. A primeira que eu ouvi falar foi o &lt;a href="[https://www.ansible.com/](https://www.ansible.com/)"&gt;Ansible&lt;/a&gt;, da Red Hat. A ideia é que você escreva arquivos de configuração definindo &lt;strong&gt;o que&lt;/strong&gt; precisa ser criado, e de forma simplificada, &lt;strong&gt;qual a ordem&lt;/strong&gt; das dependências. Isso ajuda a subir infraestruturas de forma consistente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Terraform
&lt;/h2&gt;

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

&lt;p&gt;Nas palavras (traduzidas livremente por mim) da Hashicorp, empresa responsável pelo Terraform:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Terraform é uma ferramenta de infaestrutura como código que permite que você construa, mude e versione infraestrutura de forma segura e eficiente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A ideia é simples: você descreve sua configuração em arquivos, onde você escreve todos os recursos da sua infra (máquinas virtuais, configurações de rede, bancos de dados - virtualmente, qualquer coisa). &lt;/p&gt;

&lt;p&gt;O terraform usa a linguagem HCL (Hashicorp Configuration Language) nos seus arquivos, e nele você declara os &lt;strong&gt;recursos&lt;/strong&gt;, que representam os objetos de infraestrutura. Nós chamamos essa linguagem de &lt;strong&gt;declarativa&lt;/strong&gt;, o que significa que vamos escrever &lt;strong&gt;o que&lt;/strong&gt; queremos que seja criado, ao invés de escrever um “passo-a-passo” (um algoritmo) de como as coisas devem ser executadas. &lt;/p&gt;

&lt;h2&gt;
  
  
  Quando eu deveria usar Terraform
&lt;/h2&gt;

&lt;p&gt;Bom, depende. Minha recomendação é a seguinte:&lt;/p&gt;

&lt;p&gt;Toda vez que você for desenvolver um projeto que vai (ou que pode) ser implementado em mais de um lugar, use Terraform. Por exemplo, se você está desenvolvendo uma API ou um serviço, e quer manter separados os ambientes de desenvolvimento e de produção, usar o terraform vai deixar sua vida mais simples.&lt;/p&gt;

&lt;p&gt;Se estiver trabalhando num projeto completo que vai ser implantado em nuvem, também recomendo utilizar a ferramenta. Você pode criar funções (cloud functions do GCP ou lambda na AWS), buckets de armazenamento (do GCS ou do S3), automatizar a criação de arquivos de configuração. Ou ainda deixar pré definidas regras de rede, de permissionamento. &lt;/p&gt;

&lt;h2&gt;
  
  
  Por onde começar
&lt;/h2&gt;

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

&lt;p&gt;Considerando o meu post sobre a &lt;a href="[https://dev.to/1cadumagalhaes/configuracao-do-windows-para-desenvolvimento-blk](https://dev.to/1cadumagalhaes/configuracao-do-windows-para-desenvolvimento-blk)"&gt;configuração do windows para desenvolvimento&lt;/a&gt;, vou explicar como instalar apenas em Linux.&lt;/p&gt;

&lt;p&gt;Nesse caso, basta acessar a &lt;a href="[https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)"&gt;documentação oficial&lt;/a&gt; e copiar e colar os comandos. Assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; gnupg software-properties-common &lt;span class="nt"&gt;-y&lt;/span&gt;
wget &lt;span class="nt"&gt;-O-&lt;/span&gt; https://apt.releases.hashicorp.com/gpg | &lt;span class="se"&gt;\&lt;/span&gt;
    gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /usr/share/keyrings/hashicorp-archive-keyring.gpg
gpg &lt;span class="nt"&gt;--no-default-keyring&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--keyring&lt;/span&gt; /usr/share/keyrings/hashicorp-archive-keyring.gpg &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fingerprint&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    https://apt.releases.hashicorp.com &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; main"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/hashicorp.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;terraform &lt;span class="nt"&gt;-y&lt;/span&gt;
terraform &lt;span class="nt"&gt;-install-autocomplete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para verificar a instalação, basta executar o comando &lt;code&gt;terraform -v&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A linguagem do terraform
&lt;/h3&gt;

&lt;p&gt;A configuração do Terraform é um documento (ou conjunto de documentos) que diz ao Terraform como gerenciar a coleção da infraestrutura.&lt;/p&gt;

&lt;p&gt;A sintaxe da linguagem consiste em alguns elementos básicos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;TIPO DE BLOCO&amp;gt; &lt;span class="s2"&gt;"&amp;lt;TIPO/RÓTULO DO RECURSO&amp;gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;RÓTULO DO RECURSO&amp;gt;"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;# Block body&lt;/span&gt;
  &amp;lt;IDENTIFICADOR&amp;gt; &lt;span class="o"&gt;=&lt;/span&gt; &amp;lt;EXPRESSÃO&amp;gt; &lt;span class="c"&gt;# Argument&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;## Exemplo retirado da documentação oficial&lt;/span&gt;
&lt;span class="c"&gt;## https://developer.hashicorp.com/terraform/language&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eu sei que isso parece um pouco confuso, então a partir de aqui vamos trabalhar com exemplos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estrutura do repositório
&lt;/h3&gt;

&lt;p&gt;Antes de realmente falar sobre o terraform, vamos apresentar o repositório que estou trabalhando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;assets/
    code.zip
src/
    index.js
    package.json
terraform/
    dev/
        versions.tf
        provider.tf
        backend.tf
        variables.tf
        main.tf
        terraform.tfvars
.gitignore
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;: Um ponto MUITO importante que esqueci de comentar. Para o terraform, não importa o nome dos seus arquivos, então essa estrutura é apenas uma sugestão de organização. Muita gente esscreve tudo num único arquivo, eu particularmente prefiro separar em vários. Além disso, normalmente tento fazer nomes que façam sentido com o conteúdo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terraform settings
&lt;/h3&gt;

&lt;p&gt;O primeiro passo é definirmos as “dependências” da nossa configuração. Isso porque os recursos, módulos e provedores podem ter versões diferentes.&lt;/p&gt;

&lt;p&gt;Eu costumo criar o arquivo &lt;code&gt;versions.tf&lt;/code&gt; com esse pedaço de código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.5.2"&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;google&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hashicorp/google"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 4.73.0"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse bloco nós podemos definir&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a versão do próprio terraform com a qual nossa configuração funciona (nesse caso, uma versão maior que a 1.5.2)&lt;/li&gt;
&lt;li&gt;os provedores que nossa configuração vai usar. No exemplo de hoje, apenas o de google cloud. Mas aqui poderia entrar o provedor de AWS, ou ainda de Kubernetes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Providers
&lt;/h3&gt;

&lt;p&gt;O passo seguinte - após definirmos as versões que vamos utilizar como base para nossa configuração - é configurar os providers que estamos usando. Esse tipo de configuração vai variar para cada provedor, mas no caso do de Google Cloud, podemos fazer assim: no arquivo &lt;code&gt;provider.tf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"google"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;project&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;project_id&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;
  &lt;span class="nx"&gt;zone&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zone&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui definimos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qual o projeto do GCP onde as coisas serão criadas&lt;/li&gt;
&lt;li&gt;Qual a região padrão dos recursos&lt;/li&gt;
&lt;li&gt;Qual a zona padrão dos recursos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como peguei o exemplo de um projeto real, ao invés dos valores literais nós temos configurações com a palavra &lt;code&gt;var&lt;/code&gt;. A ideia é que esse tipo de configuração seja gerenciada em um outro lugar, então vamos deixar assim por hora.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backends
&lt;/h3&gt;

&lt;p&gt;Honestamente, essa é a configuração mais importante para mim. O objetivo do terraform pode ser automatizar o gerenciamento da infraestrutura, mas por padrão, ele armazena o resultado da configuração no seu computador.&lt;/p&gt;

&lt;h4&gt;
  
  
  Terraform state
&lt;/h4&gt;

&lt;p&gt;Não mencionei antes porque raramente precisamos nos preocupar com esse arquivo. Como expliquei brevemente acima, o terraform armazena o resultado da sua execução num arquivo, que normalmente fica no seu computador (no mesmo diretório onde está a configuração). Esse arquivo é o &lt;code&gt;state&lt;/code&gt;, ou &lt;strong&gt;estado&lt;/strong&gt;. Ele vai ser um registro de toda a infraestrutura atual feita pela sua configuração, contendo todos os recursos que você tem.&lt;/p&gt;

&lt;p&gt;Quando você fizer uma alteração na configuração e aplicar novamente, o terraform vai comparar a configuração com o estado para procurar por alterações. E nesse caso, vai mexer somente no que mudou. &lt;/p&gt;

&lt;p&gt;Isso é importante porque a configuração do terraform não tem acesso a sua &lt;strong&gt;infraestrutura em si&lt;/strong&gt;, apenas ao que ele gerencia através do estado. Então por exemplo, se eu aplicar uma determinada configuração no meu projeto, e uma outra pessoa do mesmo time tentar aplicar a mesma configuração, com certeza vão acontecer vários erros de “recurso já existente”.&lt;/p&gt;

&lt;p&gt;Para mitigar esse tipo de problema, recomendo a utilização dos &lt;strong&gt;backends&lt;/strong&gt;. Com essa função, o estado do terraform é armazenado em um local remoto, e vai ser acessado por todos que tiverem a configuração. Isso também é importante caso sua infra esteja configurada em alguma pipeline de CI/CD.&lt;/p&gt;

&lt;p&gt;Agora voltando ao backend, como estamos fazendo um projeto de Google Cloud, vamos usar o Google Cloud Storage (gcs) para armazenar nossos estados. É importante ressaltar que o bucket do storage que vai armazenar o estado &lt;strong&gt;já precisa existir&lt;/strong&gt;, pois o terraform não vai criar por você.&lt;/p&gt;

&lt;p&gt;No meu exemplo, vamos criar o arquivo &lt;code&gt;backend.tf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;backend&lt;/span&gt; &lt;span class="s2"&gt;"gcs"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"py-project-terraform-states"&lt;/span&gt;
    &lt;span class="nx"&gt;prefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"example/dev"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse bloco de backend poderia estar junto das outras configurações de terraform, mas eu costumo manter separado por questão de organização.&lt;/p&gt;

&lt;p&gt;Aqui nós definimos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O id do bucket onde nossos arquivos serão armazenados&lt;/li&gt;
&lt;li&gt;O prefixo (na prática a “pasta”) onde os arquivos serão criados. Esse parâmetro é opcional, mas considerando que um projeto pode ter múltiplas configurações de terraform, considero uma boa prática definir o prefixo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;p&gt;Todas as etapas anteriores são configurações nas quais você raramente precisará mexer, e por isso gosto de mantê-las em arquivos separados. A partir daqui, vamos lidar com as configurações que vamos escrever enquanto desenvolvemos nosso código.&lt;/p&gt;

&lt;p&gt;Começo falando das variáveis justamente porque usamos algumas lá na configuração do *&lt;strong&gt;&lt;em&gt;provider&lt;/em&gt;&lt;/strong&gt;*, então geralmente começo com um arquivo &lt;code&gt;[variables.tf](http://variables.tf)&lt;/code&gt; com as seguintes configurações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"project_id"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Insira o ID do projeto do Google Cloud Platform"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"region"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Insira a região padrão para os recursos do projeto"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-central1"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"zone"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Insira a zona padrão para os recursos do projeto"&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-central1-a"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A declaração de variáveis é simples.&lt;/p&gt;

&lt;p&gt;Nós usamos o bloco &lt;code&gt;variable&lt;/code&gt; e definimos o rótulo como sendo o nome da variável. Dentro desse bloco nós podemos passar as configurações&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;type&lt;/strong&gt;, que define o tipo da variável. O terraform vai validar se o valor passado bate com esse tipo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;description&lt;/strong&gt;, que vai aparecer num prompt para o usuário na hora da aplicação da configuração&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;default&lt;/strong&gt;, o valor padrão da variável, caso o usuário não passe um.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Declarando valores fixos para as variáveis
&lt;/h4&gt;

&lt;p&gt;Quando você tentar aplicar uma configuração de terraform com variáveis, o primeiro passo (após a validação de erros na configuração) é a verificação de variáveis. Por padrão, vai aparecer um prompt interativo para que o usuário preencha as variáveis uma por uma. Como eu tento deixar o máximo possível de configurações dentro das variáveis, esse processo pode ficar trabalhoso. Fora que, caso queiramos automatizar a execução do terraform, esse prompt pode atrapalhar.&lt;/p&gt;

&lt;p&gt;Para resolver isso, podemos criar um arquivo &lt;code&gt;terraform.tfvars&lt;/code&gt;. O terraform vai buscar no arquivo de extensão &lt;code&gt;.tfvars&lt;/code&gt; os valores para as variáveis declaradas. Então para as variáveis de exemplo acima, podemos ter um arquivo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;project_id &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cadumagalhaes-terraform-example"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E dessa forma, ao executar a nossa configuração, o id do projeto já será conhecido. &lt;/p&gt;

&lt;h3&gt;
  
  
  Locals
&lt;/h3&gt;

&lt;p&gt;Além das variáveis declaradas como &lt;code&gt;variables&lt;/code&gt;, podemos criar variáveis temporárias usando o bloco &lt;code&gt;locals&lt;/code&gt;. Esse tipo de configuração é interessante para os casos em que você não quer que o usuário que vai executar a configuração possa alterar seus valores (pelo menos sem alterar a configuração em si). Eu costumo usar para valores estáticos que posso usar múltiplas vezes, como o nome de uma imagem docker. Para o exemplo de hoje, vamos armazenar o caminho da raiz do nosso repositório (isso vai ser utilizado mais tarde).&lt;/p&gt;

&lt;p&gt;Para o caso desse tipo de configuração, não costumo colocar em arquivos separados. Hoje vamos criar todas as próximas configurações dentro do arquivo &lt;code&gt;main.tf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="nx"&gt;locals&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;root_dir&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"../../"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui podemos declarar quaisquer variáveis com valores fixos para usar dentro da nossa configuração.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;Agora a parte mais importante, que é descobrir como vamos realmente criar os recursos que precisamos no nosso projeto. Aqui a receita é simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decidir o que precisa ser criado&lt;/li&gt;
&lt;li&gt;Pesquisar no google &lt;code&gt;terraform [recurso que você quer]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Entrar na documentação oficial do terraform.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por exemplo, para criar uma google cloud function:&lt;/p&gt;

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

&lt;p&gt;Nesse caso, o primeiro link é a página do módulo completo de Cloud Functions, com uma documentação mais “bonitinha” e formatada. Eu costumo entrar no segundo link, que é o do recurso, porque ele já vem com vários exemplos de implementação e links das documentações do google.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9c4e98xe3xq22eg92ip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9c4e98xe3xq22eg92ip.png" alt="Captura de tela da documentação oficial com um exemplo de google cloud function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui nós podemos ver que a sugestão da documentação é que nós criemos mais um bucket do cloud storage, em seguida nós fazemos upload do nosso código fonte para esse bucket, e por último criamos a cloud function.&lt;/p&gt;

&lt;p&gt;No nosso caso, o arquivo &lt;code&gt;[main.tf](http://main.tf)&lt;/code&gt; ficou assim&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;locals &lt;span class="o"&gt;{&lt;/span&gt;
  root_dir &lt;span class="o"&gt;=&lt;/span&gt; abspath&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"../../"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

resource &lt;span class="s2"&gt;"google_storage_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"bucket"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  name     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"test-bucket"&lt;/span&gt;
  location &lt;span class="o"&gt;=&lt;/span&gt; var.region
&lt;span class="o"&gt;}&lt;/span&gt;

resource &lt;span class="s2"&gt;"google_storage_bucket_object"&lt;/span&gt; &lt;span class="s2"&gt;"archive"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  name   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"code.zip"&lt;/span&gt;
  bucket &lt;span class="o"&gt;=&lt;/span&gt; google_storage_bucket.bucket.name
  &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.root_dir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/assets/code.zip"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

resource &lt;span class="s2"&gt;"google_cloudfunctions_function"&lt;/span&gt; &lt;span class="s2"&gt;"function"&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  name        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"function-test"&lt;/span&gt;
  description &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"My function"&lt;/span&gt;
  runtime     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nodejs18"&lt;/span&gt;

  available_memory_mb   &lt;span class="o"&gt;=&lt;/span&gt; 128
  source_archive_bucket &lt;span class="o"&gt;=&lt;/span&gt; google_storage_bucket.bucket.name
  source_archive_object &lt;span class="o"&gt;=&lt;/span&gt; google_storage_bucket_object.archive.name
  trigger_http          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
  &lt;/span&gt;entry_point           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"helloGET"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modules
&lt;/h3&gt;

&lt;p&gt;Isso é um assunto pra outro dia, pois não acho que sejam necessários para começar a usar Terraform. Um módulo é quando você encapsula um conjunto de recursos e configurações que podem ser reutilizados apenas trocando suas variáveis. Por exemplo, no caso acima nós poderiamos ter criado um módulo que cria uma Cloud Function, e ao invés de declarar os 3 recursos (bucket, arquivo e function) declarar somente o módulo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outputs
&lt;/h3&gt;

&lt;p&gt;Os outputs são como variáveis que são criadas pela nossa configuração, e que queremos expor de alguma forma. Num módulo o output poderia ser o nome do recurso, por exemplo. Aqui no nosso exemplo, como temos uma Cloud Function que é acionada por HTTP, podemos definir como output o endereço dela. No final do &lt;code&gt;main.tf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"function_url"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_cloudfunctions_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;https_trigger_url&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, quando a configuração terminar de ser executada, teremos o link da Cloud Function no nosso terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outras coisas avançadas
&lt;/h3&gt;

&lt;p&gt;O Terraform tem várias &lt;a href="[https://developer.hashicorp.com/terraform/language/functions](https://developer.hashicorp.com/terraform/language/functions)"&gt;funções prontas&lt;/a&gt; (para gerar um valor aleatório, por exemplo), &lt;a href="https://developer.hashicorp.com/terraform/language/expressions/conditionals" rel="noopener noreferrer"&gt;expressões condicionais&lt;/a&gt;, &lt;a href="https://developer.hashicorp.com/terraform/language/expressions/for" rel="noopener noreferrer"&gt;de repetição&lt;/a&gt;, &lt;a href="https://developer.hashicorp.com/terraform/language/expressions/strings" rel="noopener noreferrer"&gt;criação de templates de string&lt;/a&gt;. Apesar de ser uma linguagem declarativa, podemos criar configurações bem poderosas e resilientes usando esse tipo de feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repositório de exemplo
&lt;/h2&gt;

&lt;p&gt;O código completo com o exemplo está no meu github:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/1cadumagalhaes/terraform-gcf-nodejs-example" rel="noopener noreferrer"&gt;1cadumagalhaes/terraform-gcf-nodejs-example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vale ressaltar que essa Cloud Function precisa de autenticação para ser executada. Para testar, você pode executar o comando abaixo no seu terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: bearer &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;gcloud auth print-identity-token&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt;FUNCTION_URL]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso vai gerar o token necessário para autenticação e fazer a chamada HTTP usando o curl.&lt;/p&gt;

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

&lt;p&gt;Comecei a trabalhar com Terraform no inicio do ano passado, não sabia absolutamente nada e sinceramente nós apanhamos um pouco pra deixar a configuração pronta. O conteúdo que coloquei aqui é basicamente o que eu precisei para conseguir usar de forma confortável em projetos novos e ter 0 dor de cabeça. Confesso que não usei muitos conteúdos não oficiais sobre o assunto, então se tiver alguma recomendação, deixa aqui em baixo!&lt;br&gt;
Como sempre, tem um video muito bom disso lá no canal da LINUXtips&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=4FellihAcV8" rel="noopener noreferrer"&gt;Descomplicando o Terraform | HashiWeek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Me diz o que você achou desse tipo de post, e se você gostaria que isso virasse um vídeo no Youtube! Independente do resultado, pra ajudar a decidir sobre o que será o próximo post me acompanha lá no twitter!&lt;/p&gt;

&lt;p&gt;Espero que isso tenha sido útil para alguém, até a próxima!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>terraform</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tudo que você precisa saber pra usar Docker</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Tue, 13 Jun 2023 14:48:53 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-pra-usar-docker-1ehk</link>
      <guid>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-pra-usar-docker-1ehk</guid>
      <description>&lt;p&gt;De forma muito simplificada, Docker (a plataforma*) é um software open source que foi feito com o objetivo de facilitar o processo de desenvolver, implantar e executar aplicações. Em resumo, é uma plataforma de &lt;em&gt;virtualização&lt;/em&gt; através de &lt;strong&gt;contêineres&lt;/strong&gt;.&lt;br&gt;
Outra forma de resumir é dizer que é um dos softwares que tem o objetivo de evitar o clichê do&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na minha máquina funciona.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;* Docker pode ser o projeto, a ferramenta/plataforma, a empresa. Aqui vamos falar sobre a ferramenta&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vou deixar alguns exemplos específicos de Node e Python, mas no geral esse post é feito para quem já sabe desenvolver ou já tem uma aplicação pronta, e quer colocar ela para rodar em contêineres.&lt;/p&gt;

&lt;p&gt;Se você for iniciante, talvez alguns pedaços não façam muito sentido. Nesse caso pode deixar um comentário que eu tento explicar da melhor forma possível.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tudo que eu preciso saber sobre?
&lt;/h2&gt;

&lt;p&gt;Meu objetivo aqui é simples: prover toda informação disponível para você (desenvolvedor) começar e conseguir usar a ferramenta da vez. Não pretendo responder tudo que você &lt;strong&gt;pode&lt;/strong&gt; ou &lt;strong&gt;deveria&lt;/strong&gt; saber, apenas o necessário.&lt;/p&gt;
&lt;h2&gt;
  
  
  O que é Docker
&lt;/h2&gt;

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

&lt;p&gt;Docker é uma plataforma de virtualização por &lt;strong&gt;contêiner&lt;/strong&gt;, que permite empacotar e executar aplicativos de forma &lt;strong&gt;isolada&lt;/strong&gt; do sistema operacional.&lt;/p&gt;

&lt;p&gt;Pra complementar, vou deixar um subtópico aqui:&lt;/p&gt;
&lt;h3&gt;
  
  
  O que são contêineres
&lt;/h3&gt;

&lt;p&gt;Contêineres (ou &lt;em&gt;containers)&lt;/em&gt; são uma forma de virtualização de computadores que usa recursos do sistema operacional (SO) hospedeiro, ao invés de precisar fornecer um SO inteiro - como seria uma máquina virtual (VM) - para executar o que precisar. O contêiner compartilha o kernel do SO, e por isso é muito rápido para iniciar e interromper, e altamente portátil. Sua principal vantagem é permitir a execução de aplicações em um ambiente isolado, o que garante que a sua execução em qualquer máquina será a mesma.&lt;/p&gt;
&lt;h2&gt;
  
  
  Quando eu deveria usar Docker
&lt;/h2&gt;

&lt;p&gt;Desde que eu aprendi a usar, a minha resposta é &lt;strong&gt;sempre&lt;/strong&gt;. Existem alguns aspectos que podem fazer a sua utilização parecer um empecilho, principalmente durante o desenvolvimento, mas vou tentar desmistificar tudo isso e te ajudar a usar da forma mais simples que conheço.&lt;/p&gt;

&lt;p&gt;Mas respondendo de forma mais completa, os principais motivos para usar contêineres (na minha opinião) são:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Fazer uma aplicação com objetivo de publicar
&lt;/h3&gt;

&lt;p&gt;Para resolver uma lista de exercícios de lógica de programação da faculdade usando contêineres, seria um pouco de exagero (mas é possível).&lt;/p&gt;

&lt;p&gt;Mas toda vez que você estiver trabalhando em uma aplicação - um site, ou uma api por exemplo - que eventualmente vai ser publicada de alguma forma, encapsular em contêineres vai facilitar muito a sua vida na hora de fazer a implantação (ou &lt;em&gt;deploy&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Isso porque o isolamento garante que todas as dependências utilizadas - e aqui podemos considerar pacotes (do npm ou do pip, por exemplo), programas disponíveis no sistema operacional ou até arquivos - estarão disponíveis quando chegar a hora da implantação.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Padronizar o ambiente de desenvolvimento
&lt;/h3&gt;

&lt;p&gt;O motivo é o mesmo acima, basicamente. Caso você trabalhe em mais de um computador (eu uso o meu notebook pessoal com linux e o notebook da empresa com windows, por exemplo), ou simplesmente esteja desenvolvendo algo em equipe, conteinerizar a sua aplicação vai facilitar muito a configuração inicial do ambiente para começar a desenvolver sem gastar horas instalando programas e pacotes específicos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Por onde começar
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;No meu post sobre a &lt;a href="https://dev.to/1cadumagalhaes/configuracao-do-windows-para-desenvolvimento-blk#6a-docker"&gt;configuração do windows para desenvolvimento&lt;/a&gt; eu já expliquei como se instala no Windows, por isso não vou repetir aqui (o link já está com a âncora do pedaço sobre Docker).&lt;/p&gt;

&lt;p&gt;No caso de Linux, para instalar basta executar os comandos abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://get.docker.com &lt;span class="nt"&gt;-o&lt;/span&gt; get-docker.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh get-docker.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso vai baixar o script de instalação oficial do docker e em seguida executar. Esse script não funciona para instalação no WSL, pois o script identifica que estamos no Windows e recomenda que você instale usando o Docker Desktop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;: caso queira instalar em algum servidor de forma automática (com terraform, por exemplo), você pode executar o segundo comando como mostrado abaixo. Isso vai garantir que não fique parado no prompt de confirmação&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;yes&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;sh get-docker.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Dockerfile
&lt;/h2&gt;

&lt;p&gt;A base de conteinerizar aplicações está na construção do &lt;code&gt;Dockerfile&lt;/code&gt;. Esse arquivo pode ser bem complexo, mas o que você precisa saber é:&lt;/p&gt;

&lt;h3&gt;
  
  
  FROM
&lt;/h3&gt;

&lt;p&gt;Logo no inicio do seu arquivo, o primeiro comando precisa ser o FROM. Ele é o ponto de partida da sua imagem, e define qual é a base do seu container.&lt;/p&gt;

&lt;p&gt;Uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FROM &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FROM &amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, se eu usar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vou ter uma imagem que já vai vir com python instalado, além de uma série de dependências comuns de aplicações em python.&lt;/p&gt;

&lt;p&gt;De forma semelhante, poderia usar &lt;code&gt;FROM node:20.3-slim&lt;/code&gt; para inicializar uma aplicação em Node JS.&lt;/p&gt;

&lt;p&gt;O seu Dockerfile pode ter vários comandos FROM, juntando pedaços de imagens diferentes para montar a sua aplicação.&lt;/p&gt;

&lt;p&gt;Uma coisa que você precisa se atentar, é que as &lt;strong&gt;imagens&lt;/strong&gt;* utilizadas vão ter tamanhos diferentes, dependendo da quantidade de coisas que tem instaladas. Imagens mais completas são mais pesadas, e a maioria das imagens comuns tem uma versão &lt;code&gt;-slim&lt;/code&gt;  , que geralmente vai ter menos dependências.&lt;/p&gt;

&lt;p&gt;De forma geral, se você estiver preocupado com o tamanho da imagem do seu container, o ideal seria começar com uma imagem mais “limpa” e instalar manualmente todas as ferramentas que vai utilizar. Mas normalmente não precisamos nos preocupar com isso, então usar a imagem &lt;code&gt;-slim&lt;/code&gt; já é um bom começo.&lt;/p&gt;

&lt;h3&gt;
  
  
  COPY
&lt;/h3&gt;

&lt;p&gt;O próximo passo - considerando que a imagem que escolhemos já tem os programas que precisamos - é passar os arquivos com o seu código para ela, para que possam ser executados. Podemos fazer isso usando o comando &lt;code&gt;ADD&lt;/code&gt;, ou o comando &lt;code&gt;COPY&lt;/code&gt;. O primeiro é basicamente o segundo com esteróides, pois além de permitir a cópia, também permite o download de arquivos remotos (através de uma URL) e a descompressão de arquivos comprimidos.&lt;/p&gt;

&lt;p&gt;Uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;COPY arquivo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COPY [arquivo_fonte.py](http://arquivo.py) arquivo_destino.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COPY pasta_fonte/ pasta_destino/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso vai definir onde os seus arquivos vão ser copiados dentro da imagem do contêiner, e é necessário para que possamos executar. Um exemplo comum, no caso de uma aplicação em python por exemplo, é copiar o &lt;code&gt;requirements.txt&lt;/code&gt; além da pasta com o seu código (no meu exemplo, &lt;code&gt;app/&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voltando para o Node, vou aproveitar e apresentar o &lt;code&gt;.dockerignore&lt;/code&gt;. Semelhante ao &lt;code&gt;.gitignore&lt;/code&gt;, a função dele é definir no seu projeto (ou pasta) quais arquivos ou diretórios não devem ser acrescentados na imagem. Node é um bom exemplo porque quando instalamos as dependências do nosso projeto (de um &lt;code&gt;package.json&lt;/code&gt;, por exemplo), elas são salvas na pasta &lt;code&gt;node_modules/&lt;/code&gt;, dentro do diretório em que estivermos. Essa pasta pode ser muito grande, por isso podemos criar o arquivo &lt;code&gt;.dockerignore&lt;/code&gt; contendo ela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;node_modules/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E depois, quando fizermos a cópia, saberemos que essa pasta não estará na nossa imagem&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; meu_projeto_node&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RUN
&lt;/h3&gt;

&lt;p&gt;Em seguida, dependendo da sua aplicação vai ser necessário instalar as dependências do seu projeto para conseguir executar (por isso copiamos o &lt;code&gt;requirements.txt&lt;/code&gt;, por exemplo). Para isso usamos o comando RUN, que serve para executar qualquer comando de script dentro da sua imagem. Você pode ter múltiplos comandos RUN, e eles vão ser executados &lt;strong&gt;no momento da criação da sua imagem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RUN comando&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUN comando complemento&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUN ["comando", "complemento"]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para instalar as dependências de um projeto de python por exemplo, podemos colocar o seguinte após o nosso COPY&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando também pode ser utilizado para instalar pacotes no seu sistema (com &lt;code&gt;apt install&lt;/code&gt; por exemplo) ou executar qualquer comando de shell.&lt;/p&gt;

&lt;h3&gt;
  
  
  CMD
&lt;/h3&gt;

&lt;p&gt;Por fim, também podemos configurar comandos que devem ser executados quando o &lt;strong&gt;container&lt;/strong&gt; for executado. É aqui que dizemos como a nossa aplicação deve ser executada, por exemplo.&lt;/p&gt;

&lt;p&gt;Uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CMD comando&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CMD comando complemento&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CMD ["comando", "complemento"]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Numa aplicação python simples por exemplo, podemos executar algo como&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; python app.py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou numa aplicação em Node, podemos executar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; npm start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um ponto importante sobre o CMD, é que somente o último comando inserido no seu Dockerfile vai ser executado. Por exemplo, se tivermos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; python main.py&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; python app.py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Somente o segundo será executado.&lt;/p&gt;

&lt;p&gt;Caso sua aplicação precise executar mais de um comando para ser inicializada, podemos usar o comando &lt;code&gt;ENTRYPOINT&lt;/code&gt;, que funciona de forma semelhante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  build
&lt;/h3&gt;

&lt;p&gt;Dentro da pasta da sua aplicação onde você criar o seu arquivo Dockerfile (normalmente são colocados na raiz do projeto, mas vai depender da sua organização), você deve executar o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="o"&gt;[&lt;/span&gt;PATH]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso não passe nenhum &lt;code&gt;PATH&lt;/code&gt;, ele procurará o Dockerfile no diretório atual. Se estiver em outra pasta, basta passar o seu caminho (algo como &lt;code&gt;docker build container/&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  run
&lt;/h3&gt;

&lt;p&gt;Esse é o comando principal para utilização de docker, e não vou entrar em muitos detalhes, mas a sintaxe básica é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS] IMAGE &lt;span class="o"&gt;[&lt;/span&gt;COMMAND] &lt;span class="o"&gt;[&lt;/span&gt;ARG...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As opções mais comuns que eu costumo utilizar são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;—name&lt;/code&gt;: vai definir o nome do seu container. Se não for passado, vai criar com um nome aleatório&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--volume&lt;/code&gt;, ou &lt;code&gt;-v&lt;/code&gt;: permite conectar um diretório local com um diretório do container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--expose&lt;/code&gt;, ou &lt;code&gt;-p&lt;/code&gt;: permite expor e mapear portas do seu container para o seu sistema local. Isso é muito importante caso esteja desenvolvendo serviços web&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: permite passar variáveis de ambiente para o contexto do seu container&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Acessando o seu container
&lt;/h2&gt;

&lt;p&gt;Apesar de ser mais um comando, gosto de separar este pois permite que tenhamos acesso ao exato contexto do nosso container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;container] bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando esse comando, entraremos num shell interativo do nosso container e que nos permite acessar como qualquer terminal Linux. Dentro deles podemos navegar entre os arquivos, editar e executar comandos. Isso pode ser muito útil caso precise debugar algum problema, mas o caso de uso mais comum para mim foi fazer a manutenção de containeres baseados em imagens prontas, para criar um usuário de uma aplicação por exemplo (dentro do container de Airflow).&lt;/p&gt;

&lt;h2&gt;
  
  
  Publicando a sua imagem
&lt;/h2&gt;

&lt;p&gt;Esse tópico sozinho poderia ser um post a parte, por isso vou tentar resumir.&lt;/p&gt;

&lt;p&gt;Depois de construir a nossa imagem, nós podemos disponibilizar ela em algum &lt;strong&gt;repositório de imagens&lt;/strong&gt;. Isso facilita a implantação, pois a partir do momento em que a imagem está construida, você não precisa mais dos arquivos do código fonte para executar. Existem vários repositórios, mas minhas recomendações são:&lt;/p&gt;

&lt;h3&gt;
  
  
  Registros públicos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker Registry: o repositório oficial permite  que você poste suas imagens e deixe acessíveis para qualquer pessoa&lt;/li&gt;
&lt;li&gt;
&lt;a href="[https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry)"&gt;Github Container registry&lt;/a&gt;: também é possível armazenar suas imagens no Github&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Registros privados
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker hub: A Docker Inc (a empresa, não o produto) também oferece um serviço de hospedagem privado para salvar suas imagens&lt;/li&gt;
&lt;li&gt;Qualquer nuvem, mas como exemplo vou destacar o Artifact Registry do Google Cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dessa forma, quando for executar o seu serviço, basta referenciar o endereço remoto da imagem na hora da execução. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run ghcr.io/1cadumagalhaes/TESTE_DOCKER:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que, caso eu queira fazer o deploy da minha aplicação numa VM hospedada em alguma nuvem por exemplo, tudo que eu preciso fazer é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instalar o Docker&lt;/li&gt;
&lt;li&gt;Executar esse comando referenciando a minha imagem já existente&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sem se preocupar em clonar o código e sem nenhum setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker Compose
&lt;/h2&gt;

&lt;p&gt;O Compose é uma ferramenta desenvolvida pra definir e executar aplicações que dependem de &lt;strong&gt;múltiplos contêineres docker&lt;/strong&gt;. Com ele, você usa um arquivo de configuração YAML para definir os serviços da sua aplicação, e depois executa tudo com um único comando.&lt;/p&gt;

&lt;p&gt;Apesar de ser focado em aplicações com múltiplos contêineres, eu considero muito prático usar para definir aplicações de um único contêiner também. Isso porque ele permite que nós façamos as definições do nosso serviço de forma declarativa. Por exemplo, digamos que eu esteja trabalhando no desenvolvimento de uma API feita em Python e que vai criar arquivos dentro do sistema, e que usa algumas configurações passadas via variável de ambiente. Para executar o meu container, eu precisaria fazer o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; ./output:/app/output &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;NAMESPACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'staging'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'debug'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'abc123'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--name&lt;/span&gt; meu_python &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claro que podemos salvar tudo isso num shell script (ou simplesmente decorar o comando), mas eu considero inconveniente. Ao invés disso, podemos definir um &lt;code&gt;docker-compose.yaml&lt;/code&gt; assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;meu_app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;buid&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;NAMESPACE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;staging'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;debug'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;abc123'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./output:/app/output&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E depois de configurar esse arquivo, podemos executar nossa configuração com&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Também podemos usar os comandos &lt;code&gt;down&lt;/code&gt; e &lt;code&gt;restart&lt;/code&gt; além do &lt;code&gt;up&lt;/code&gt;, e podemos passar várias opções, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-f&lt;/code&gt; : Caso o nome do seu arquivo seja diferente de &lt;code&gt;docker-compose.yaml&lt;/code&gt; , podemos passar através dessa opção&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt; : para executar os contêineres “desacoplados”, ou seja sem depender da sua sessão do terminal e ficar em background.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usando Hot Reload com Docker
&lt;/h2&gt;

&lt;p&gt;Muitas vezes, quando estamos desenvolvendo precisamos da agilidade de reiniciar o serviço assim que salvamos nossas alterações.&lt;/p&gt;

&lt;p&gt;No ambiente local existem ferramentas próprias para isso, como o &lt;code&gt;nodemon&lt;/code&gt; de Node JS, e elas podem auxiliar muito para que vejamos os resultados das nossas alterações.&lt;/p&gt;

&lt;p&gt;Por padrão, para alterar códigos dentro do seu contêiner, você precisa alterar a sua imagem. E para isso, é necessário compilar a imagem (&lt;code&gt;docker build&lt;/code&gt;) e executar novamente (&lt;code&gt;docker run&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Caso você queira usar uma ferramenta de hot/live reload, você pode definir um volume conectando o seu diretório local com o diretório do contêiner, e dessa forma as alterações estarão conectadas. Por exemplo, caso esteja construindo uma API em Python (com FastAPI por ex) e executando com Gunicorn, podemos fazer o seguinte:&lt;/p&gt;

&lt;p&gt;No &lt;code&gt;Dockerfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; tiangolo/uvicorn-gunicorn-fastapi:python3.11&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt /usr/src/requirements.txt&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /usr/src/requirements.txt
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; ./app /app/app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;docker-compose.yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
           &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;8080:80'&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
           &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./app/:/app/app&lt;/span&gt;
        &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
           &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/start-reload.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, quando fizermos qualquer alteração no nosso código, o serviço será reiniciado dentro do contêiner. Caso queira fazer o mesmo com Node, &lt;a href="[https://www.freecodecamp.org/portuguese/news/como-habilitar-o-live-reload-em-aplicacoes-do-docker-utilizando-volumes/](https://www.freecodecamp.org/portuguese/news/como-habilitar-o-live-reload-em-aplicacoes-do-docker-utilizando-volumes/)"&gt;esse post do Erick Wendel no freeCodeCamp&lt;/a&gt; explica como fazer essa configuração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde encontrar mais informações
&lt;/h2&gt;

&lt;p&gt;Além das documentações oficiais, a principal referência que eu tenho é o treinamento da LINUXtips, feito pelo &lt;a href="[https://twitter.com/badtux_](https://twitter.com/badtux_)"&gt;Jeferson Fernando&lt;/a&gt;. Ele disponibilizou &lt;strong&gt;completamente de graça&lt;/strong&gt; o livro Descomplicando o Docker depois de dar o treinamento de graça pra 5 mil pessoas (incluindo eu, na época um jovem padawan estagiário):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://livro.descomplicandodocker.com.br/" rel="noopener noreferrer"&gt;https://livro.descomplicandodocker.com.br/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E depois ele resolveu liberar o treinamento &lt;strong&gt;todo&lt;/strong&gt; &lt;strong&gt;completamente de graça&lt;/strong&gt; &lt;strong&gt;no youtube.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="[https://www.youtube.com/watch?v=Wm99C_f7Kxw&amp;amp;list=PLf-O3X2-mxDn1VpyU2q3fuI6YYeIWp5rR](https://www.youtube.com/watch?v=Wm99C_f7Kxw&amp;amp;list=PLf-O3X2-mxDn1VpyU2q3fuI6YYeIWp5rR)"&gt;Playlist Descomplicando o Docker no LINUXtips&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse treinamento é MUITO completo e tem toda informação que você vai querer saber, então vamos combinar de ir lá no canal dele e deixar a Inscrição e deixar o like nos videos?&lt;/p&gt;

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

&lt;p&gt;Coloquei aqui tudo que eu precisei pra conseguir trabalhar com docker nos últimos meses, do desenvolvimento do 0 até o deploy do serviço em produção. Essa é uma ferramenta muito poderosa e que tem muitos detalhes que eu não cobri aqui, por isso reforço que de uma moral para os materiais da LINUXtips.&lt;/p&gt;

&lt;p&gt;Se você não sabia nada sobre docker e &lt;strong&gt;não conseguiu&lt;/strong&gt; usar depois desse guia, me procura no twitter pra gente tentar deixar esse post mais completo.&lt;/p&gt;

&lt;p&gt;E caso esse post tenha te ajudado de alguma forma, compartilha com alguém que você acha que também pode aproveitar.&lt;/p&gt;

&lt;p&gt;Me diz o que você achou desse tipo de post, e se você gostaria que isso virasse um vídeo no Youtube! Independente do resultado, o post &lt;del&gt;da semana que vem&lt;/del&gt; dessa semana será sobre Terraform. Me acompanha no twitter pra saber mais!&lt;/p&gt;

&lt;p&gt;Espero que isso tenha sido útil para alguém, até a próxima!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>containers</category>
    </item>
    <item>
      <title>Tudo que você precisa saber pra usar Linux</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Sat, 03 Jun 2023 00:07:26 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-pra-usar-linux-4e50</link>
      <guid>https://dev.to/1cadumagalhaes/tudo-que-voce-precisa-saber-pra-usar-linux-4e50</guid>
      <description>&lt;p&gt;Linux é meu sistema operacional principal desde 2019. Complementando o &lt;a href="https://dev.to/1cadumagalhaes/configuracao-do-windows-para-desenvolvimento-blk"&gt;post da semana passada sobre WSL&lt;/a&gt;, decidi começar essa série de posts ensinando tudo que você precisa saber para conseguir usar Linux, mesmo que dentro do WSL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tudo que eu preciso saber sobre?
&lt;/h2&gt;

&lt;p&gt;Meu objetivo aqui é simples: prover toda informação disponível para você (desenvolvedor) começar e conseguir usar a ferramenta da vez. Não pretendo responder tudo que você &lt;strong&gt;pode&lt;/strong&gt; ou &lt;strong&gt;deveria&lt;/strong&gt; saber, apenas o necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Linux
&lt;/h2&gt;

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

&lt;p&gt;De forma geral, Linux é usado pra descrever os sistemas operacionais que são baseados no Kernel Linux, mas não vamos entrar em detalhe aqui. Podemos considerar como um &lt;strong&gt;tipo&lt;/strong&gt; ou &lt;strong&gt;conjunto&lt;/strong&gt; de sistemas operacionais, cujo princípio está no kernel que é de código aberto. Por isso, toda distribuição Linux também é de código aberto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando eu deveria usar Linux?
&lt;/h2&gt;

&lt;p&gt;Minha resposta pessoal é que todos deveriam testar sistemas operacionais diferentes, mas isso fica pra um post a parte. Quando pergunto para usuários de Linux o motivo de escolherem esses sistemas, as respostas são:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. O sistema é Open Source
&lt;/h3&gt;

&lt;p&gt;O fato de ser de código aberto significa que a comunidade pode contribuir ativamente com o desenvolvimento, resolver bugs, encontrar falhas, e principalmente estender o sistema para as próprias necessidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Personalização
&lt;/h3&gt;

&lt;p&gt;Vou mencionar brevemente mais tarde, mas existem milhares de sistemas diferentes baseados em Linux. Os sistemas podem ter diferenças na arquitetura, no sistema de arquivos, no gerenciamento de pacotes, no tipo de interface gráfica, na disposição dos elementos da UI, nos softwares que já vem instalados.&lt;/p&gt;

&lt;p&gt;O ecossistema Linux é tão rico porque os usuários (e desenvolvedores) não satisfeitos com a forma como usam seus computadores resolvem fazer as alterações que melhoram suas experiências.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A comunidade (e seus softwares e suporte)
&lt;/h3&gt;

&lt;p&gt;A comunidade Linux é incrivelmente ativa. Acho que muito por necessidade, visto que por muito tempo a utilização do sistema era somente para usuários avançados (seja para personalização, por compatibilidade de software, para resolver bugs). Você pode procurar como resolver algum problema, como instalar algum programa, como fazer escrever um script, resolver algo usando a linha de comando e na maioria das vezes vai encontrar não só uma resposta, mas uma discussão e uma explicação de como funciona e onde você pode achar mais detalhes.&lt;/p&gt;

&lt;p&gt;E graças a comunidade, muitos dos problemas comuns acabam virando um pacote (basicamente um programa), que na maioria das vezes é distribuido gratuitamente, e tem seu código aberto. Mesmo quando as marcas (logitech por exemplo, mas a lista é imensa) escolhem não oferecer suporte dos seus dispositivos - ou dos softwares que vem com eles -  para Linux, existem grandes chances de você encontrar uma opção (para dispositivos sem fio da logitech por exemplo, deixo a recomendação do &lt;a href="https://pwr-solaar.github.io/Solaar/devices.html"&gt;Solaar&lt;/a&gt;, que não só é um software mais leve que o oficial, mas que oferece a maioria das opções disponíveis e ainda tem um ícone na barra de tarefas com a carga da bateria, e manda notificações quando está acabando)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jvemacgq0lg1v0iezze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jvemacgq0lg1v0iezze.png" alt="Notificação do programa Solaar" width="405" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Segurança
&lt;/h3&gt;

&lt;p&gt;Devido ao design, e (novamente) pela comunidade, Linux é considerado simplesmente mais seguro que Windows. A quantidade de usuários monitorando, identificando e resolvendo vulnerabilidades faz com que os problemas sejam resolvidos muito rapidamente, além de ter um sistema de controle de acesso muito robusto. O fato de ter uma base de usuários menor que windows também significa que vai ser um alvo menos procurado para ataques como vírus ou malwares, que normalmente vão ser desenvolvidos para funcionar em Windows (apesar disso, não significa que você estará livre de preocupações de segurança).&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Performance
&lt;/h3&gt;

&lt;p&gt;Linux precisa de pouquíssimos recursos para funcionar, de forma que existem distribuições focadas em economizar recursos. O Ubuntu Mate por exemplo, roda em computadores com 1GB de memória RAM, 10GB de espaço em disco e um processador de 1GHz, isso contando com uma interface completa e sem nenhum “corte” de funcionalidade. Pesquisando na internet você vai encontrar vários exemplos de como pessoas “revitalizaram” seus computadores antigos instalando algum Linux neles.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Utilização em servidores
&lt;/h3&gt;

&lt;p&gt;Linux é o sistema mais utilizado para servidores, basicamente pelos motivos citados acima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por onde começar?
&lt;/h2&gt;

&lt;p&gt;Bom, se você é desenvolvedor, um bom começo é o WSL, que já expliquei como configurar na semana passada. Dentro do WSL você vai ter um terminal (que é basicamente o que teria acesso num servidor), e apesar de usuários comuns não precisarem abrir a linha de comando para nada (dependendo do sistema que estiverem usando), conhecer as ferramentas de linha de comando pode ser bem importante.&lt;/p&gt;

&lt;p&gt;Se você quer somente testar, você pode escolher qualquer distribuição Linux, criar um USB bootável com uma instalação do sistema e começar a usar. Isso não vai mexer com a instalação do seu windows e não vai alterar nenhum arquivo no seu sistema, de forma que você pode fazer isso em praticamente qualquer computador.&lt;/p&gt;

&lt;p&gt;Minha recomendação é começar com qualquer variação de Ubuntu, que por ser o sistema mais utilizado é o que tem a maior comunidade e suporte. Eu particularmente uso o PopOS, mas você pode pesquisar por “ubuntu flavours” e escolher o que achar mais bonito. Se quiser uma experiência mais próxima do que se tem com o Windows, o Zorin OS pode ser uma boa escolha.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linha de comando
&lt;/h2&gt;

&lt;p&gt;Bom, eu aprendi os comandos conforme a necessidade, então é complicado levantar exatamente o que você vai precisar usar. Vou copiar o conteúdo de uma palestra que dei uma vez sobre dicas de Terminal, e que serviu de inspiração para o post &lt;a href="https://blog.dp6.com.br/3-dicas-de-terminal-para-engenheiros-de-dados-11587d54802b"&gt;3 dicas de terminal para Engenheiros de Dados no blog da DP6&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Comandos que você precisa saber
&lt;/h3&gt;

&lt;p&gt;Abaixo estão os comandos mais essenciais para utilização do sistema. Com eles você aprende a navegar entre pastas e a fazer todo o gerenciamento básico de arquivos. Como bônus, a maioria desses comandos são bem semânticos, então coloquei a explicação em inglês do seus significados para os que sei.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Comandos que você precisa saber:&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;path] &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="c"&gt;# listing, lista os arquivos e diretórios. -a ou –all lista inclusive ocultos, -l informações extras e -h formata de forma legível (human readable)&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;path] &lt;span class="c"&gt;# change directory, serve para navegar entre as pastas. Para voltar uma pasta, use ..&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;path ou file] &lt;span class="o"&gt;[&lt;/span&gt;dest] &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="c"&gt;# copy, copia o arquivo ou pasta para o destino. -r significa recursivo&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;path ou file] &lt;span class="o"&gt;[&lt;/span&gt;dest] &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="c"&gt;# move, move o arquivo ou pasta para o destino. Pode ser usado para renomear&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;path ou file] &lt;span class="o"&gt;[&lt;/span&gt;dest] &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="c"&gt;# remove, apaga arquivos ou diretórios&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;path] &lt;span class="c"&gt;# make directory, cria pastas&lt;/span&gt;
&lt;span class="nb"&gt;rmdir&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;path] &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="c"&gt;# remove directory, apaga pastas&lt;/span&gt;
&lt;span class="nb"&gt;touch&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;file] &lt;span class="c"&gt;# cria um arquivo vazio com nome informado no parâmetro [file]&lt;/span&gt;
nano &lt;span class="o"&gt;[&lt;/span&gt;file] &lt;span class="c"&gt;# editor de texto, sabia mais em https://www.vivaolinux.com.br/artigo/Introducao-ao-Linux-O-editor-de-texto-Nano&lt;/span&gt;
vi &lt;span class="o"&gt;[&lt;/span&gt;file] &lt;span class="c"&gt;# editor de texto, https://www.vivaolinux.com.br/artigo/Guia-rapido-VI&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;comando] &lt;span class="c"&gt;# super user do, usado para executar o comando com permissão elevada&lt;/span&gt;
clear &lt;span class="c"&gt;# limpa a interface do terminal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comandos úteis
&lt;/h3&gt;

&lt;p&gt;Aqui alguns comandos para aplicações mais específicas, como ver parte do conteúdo de um arquivo, pesquisar um arquivo dentro de uma pasta, alterar o conteúdo em batch, verificar o que está rodando no seu computador, baixar arquivos, gerenciar permissões e etc&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;file] &lt;span class="nt"&gt;-n&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;num] &lt;span class="c"&gt;# imprime as 10 primeiras linhas do arquivo, ou as [num] linhas&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;file] &lt;span class="nt"&gt;-n&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;num] &lt;span class="c"&gt;# imprime as 10 últimas linhas do arquivo, ou as [num] linhas'&lt;/span&gt;
find &lt;span class="c"&gt;# procurar por arquivos e diretórios&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="c"&gt;# procura um padrão (de texto ou regex) no arquivo ou na string&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="c"&gt;# stream editor, pode fazer transformações de texto no arquivo ou string&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="c"&gt;# procura um padrão (de texto ou regex) no arquivo ou na string, mas usa uma linguagem de processamento&lt;/span&gt;
top &lt;span class="c"&gt;# lista os processos sendo executados no pc&lt;/span&gt;
&lt;span class="nb"&gt;env&lt;/span&gt; &lt;span class="c"&gt;# lista ou cria variáveis de ambiente na seção do terminal&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="c"&gt;# muda o acesso ou permissão do arquivo, ou diretório&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="c"&gt;# muda o proprietário do arquivo ou diretório&lt;/span&gt;
wget &lt;span class="o"&gt;[&lt;/span&gt;options] &lt;span class="o"&gt;[&lt;/span&gt;url] &lt;span class="c"&gt;# Realiza requisições HTTP para a URL informada, para uma requisição simples não é necessário passar nenhum parâmetro adicional a URL, o comando possui vários parâmetros complementares&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O mais importante
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nunca&lt;/strong&gt; - sério, nunca - &lt;strong&gt;saia copiando comandos de fontes não oficiais sem entender exatamente o que está fazendo.&lt;/strong&gt; Mesmo em tutoriais oficiais de instalação de ferramentas, leia os comandos antes de copiar e executar no seu computador. A linha de comando é uma ferramenta muito poderosa, e a partir do momento em que você da permissão (ao executar algo com sudo, por ex), qualquer alteração pode ser feita.&lt;/p&gt;

&lt;p&gt;Se não souber o que um comando faz, você pode usar o site &lt;a href="https://explainshell.com/"&gt;https://explainshell.com/&lt;/a&gt;, que explica todos os pedaços de um comando.&lt;/p&gt;

&lt;p&gt;Além disso, sempre leia o que está escrito no terminal antes de confirmar qualquer coisa. Eu sempre gosto de dar o exemplo do vídeo &lt;a href="https://www.youtube.com/watch?v=0506yDSgU7M"&gt;Linux HATES ME do canal Linus Tech Tips&lt;/a&gt;, onde ele tentou fazer um desafio de usar Linux por 30 dias. Nos primeiros minutos de utilização ele tentou instalar a Steam, e quando não conseguiu recorreu a linha de comando. O terminal explicou que ele estava fazendo algo que iria danificar o sistema e pediu para ele digitar uma frase inteira como confirmação, e ainda assim ele confirmou. Depois disso o sistema não abriu mais. (basicamente ele tentou a instalação num dia em que a Valve subiu um pacote corrompido de instalação da steam, e o sistema tentou fazer de tudo pra que ele não instalasse)&lt;br&gt;
Se estivesse usando windows e não conseguisse instalar a steam, ele provavelmente não abriria o powershell pra tentar resolver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Linux ou Windows?
&lt;/h3&gt;

&lt;p&gt;Depende. Sistema Operacional é uma escolha pessoal, então você deve usar o que atende as suas necessidades. Mas eu defendo que as pessoas usam Windows porque é a opção que foram apresentadas, e não porque ele atende as necessidades. É bizarro esperar que todas as pessoas do mundo vão usar o computador da mesma forma, então realmente acho que todos deveriam testar vários sistemas diferentes. Da mesma forma, a maioria das interfaces de Linux são feitas para utilizar de formas bem diferentes do windows. Além disso, Android é Linux e serve de exemplo disso. O Android de cada marca é diferente. Sejam detalhes na interface, a forma de utilizar, o menu de notificações. E hoje já é natural as pessoas preferirem uns a outros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual a melhor distro Linux?
&lt;/h3&gt;

&lt;p&gt;Depende. Novamente, é uma escolha pessoal. Como mencionei antes, recomendo Ubuntu pela comunidade e suporte, e uso o PopOS porque me adaptei bem a interface e sou muito mais produtivo do que com Windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eu consigo fazer no Linux tudo que faço no Windows?
&lt;/h3&gt;

&lt;p&gt;Resposta curta: não. Resposta certa: sim, se você (ou alguém) desenvolver algo. Como já falei, a maioria das marcas não oferece software com suporte a Linux, por exemplo. Alguns jogos como Valorant tem seu anticheat baseado no kernel de Windows, então é impossível executar no Linux. Alguns outros, como o Fortnite simplesmente escolhem não dar suporte.  Caso você se interesse por jogar no Linux, o &lt;a href="https://www.protondb.com/"&gt;Proton DB&lt;/a&gt; tem o status de todos os jogos na steam, se as pessoas conseguiram jogar e como.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde encontrar mais informações
&lt;/h2&gt;

&lt;p&gt;Eu aprendi principalmente com 2 canais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://guiafoca.org"&gt;Guia Foca&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@LinuxTips"&gt;LinuxTIPS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@Diolinux"&gt;Diolinux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos brasileiros e com muito conteúdo de qualidade. O guia foca deve ser responsável pelo conhecimento de linux de pelo menos metade dos usuários brasileiros das últimas decadas (fonte: vozes da minha cabeça). O diolinux também tem vários cursos disponíveis para membros do canal, e o LinuxTIPS tem o &lt;a href="https://www.linuxtips.io/course/linux-essentials"&gt;Treinamento Linux Essentials&lt;/a&gt; (além de alguns mais avançados), que é sensacional. Fora isso aprendi em issues do github, perguntas do stackoverflow e posts de comunidade por ai.&lt;/p&gt;

&lt;p&gt;Se você tiver alguma recomendação de criador de conteúdo que fale sobre Linux, deixa o comentário aqui!&lt;/p&gt;

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

&lt;p&gt;A verdade é que você não precisa saber muito para conseguir usar Linux. Eu comecei basicamente escolhendo uma distro, instalando e usando. Conforme encontrei barreiras, fui aprendendo mais coisas, mas na maioria das vezes você  vai ter uma experiência bem satisfatória sem ter que se preocupar muito.&lt;/p&gt;

&lt;p&gt;Me diz o que você achou desse tipo de post, e se você gostaria que isso virasse um vídeo no Youtube! Independente do resultado, o post da semana que vem será sobre Docker. Me acompanha no twitter pra saber mais.&lt;/p&gt;

&lt;p&gt;Espero que isso tenha sido útil para alguém, até a próxima!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Configuração do Windows para desenvolvimento</title>
      <dc:creator>Cadu Magalhães</dc:creator>
      <pubDate>Fri, 26 May 2023 19:01:15 +0000</pubDate>
      <link>https://dev.to/1cadumagalhaes/configuracao-do-windows-para-desenvolvimento-blk</link>
      <guid>https://dev.to/1cadumagalhaes/configuracao-do-windows-para-desenvolvimento-blk</guid>
      <description>&lt;h2&gt;
  
  
  Atualizando um post de alguns anos atrás
&lt;/h2&gt;

&lt;p&gt;No ano passado eu convenci as pessoas do trabalho de que o WSL deveria ser padrão para os Engenheiros de Dados da empresa, para conseguir agilizar o desenvolvimento de soluções (muito porque os computadores vem com windows e da trabalho fazer o setup de linux), mas também porque acredito que é a melhor forma de desenvolver &lt;del&gt;para quem não quer usar linux&lt;/del&gt;.&lt;/p&gt;

&lt;p&gt;Então resolvi atualizar esse post para servir de referencia para os meus colegas, mas também pra qualquer pessoa que queira fazer esse setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é WSL e por que eu deveria usar isso?
&lt;/h2&gt;

&lt;p&gt;Se você pesquisar essa sigla no google, vai descobrir que é assim que chamam a Liga Mundial de Surf (&lt;em&gt;World Surf League&lt;/em&gt;, em inglês).&lt;/p&gt;

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

&lt;p&gt;Mas, no nosso contexto, WSL significa &lt;em&gt;Windows Subsystem for Linux&lt;/em&gt; , e foi a forma que a Microsoft encontrou de permitir que os usuários - principalmente desenvolvedores - pudessem executar um ambiente Linux (incluindo ferramentas de linha de comando, principalmente) diretamente no windows, sem modificar o sistema e sem a necessidade de criar uma máquina virtual.&lt;/p&gt;

&lt;p&gt;O WSL foi lançado oficialmente em 2016, mas era apenas uma &lt;del&gt;gambiarra&lt;/del&gt; camada de compatibilidade. Em 2019, a Microsoft anunciou o &lt;strong&gt;WSL 2&lt;/strong&gt;, introduzindo algumas mudanças importantes como a utilização de um kernel de Linux, o que faz com que ele seja compatível com mais programas de linux.&lt;/p&gt;

&lt;p&gt;Curiosamente, comecei a usar Linux em 2016, e testo o WSL desde o lançamento dentro do Windows Insider.&lt;/p&gt;

&lt;p&gt;Existem alguns motivos pelos quais você deveria dar uma chance ao Linux para desenvolver, mas eu vou destacar somente alguns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Disponibilidade de ferramentas: a maioria das bibliotecas de desenvolvimento são construídas para rodar em GNU. Um bom exemplo é o Docker, que para funcionar em windows usa o WSL como backend&lt;/li&gt;
&lt;li&gt;Facilidade de instalação/manutenção de ferramentas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E considerando apenas o WSL, podemos acrescentar&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A instalação e execução das coisas fica separada do seu sistema&lt;/li&gt;
&lt;li&gt;Você não precisa de permissão de administrador para instalar ferramentas de desenvolvimento ou configurar variáveis de ambiente&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;p&gt;Estou utilizando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows 11 Pro versão 22H2 (necessário Windows 10 versão 2004 ou maior)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; como editor&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl" rel="noopener noreferrer"&gt;Extensão do WSL&lt;/a&gt; para o VS Code&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701" rel="noopener noreferrer"&gt;Windows Terminal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuração do WSL 2
&lt;/h2&gt;

&lt;p&gt;A partir daqui, estarei seguindo o &lt;a href="https://learn.microsoft.com/en-us/windows/wsl/install" rel="noopener noreferrer"&gt;tutorial da microsoft&lt;/a&gt;, e anotar como resolvo qualquer problema que encontrar.&lt;/p&gt;

&lt;p&gt;A última vez que escrevi esse tutorial, eram necessários uns 3 ou 4 comandos. Para as versões mais recentes do Windows, isso é feito com um comando.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Abrir o PowerShell ou o Prompt de Comando como &lt;strong&gt;administrador.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;: você pode apertar Win + X para abrir o menu de contexto do Iniciar, e nele deve ter uma opção de executar o PowerShell como administrador.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Executar o comando
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Reinicie o computador
&lt;/h3&gt;

&lt;h3&gt;
  
  
  4. Escolher uma distro Linux (opcional)
&lt;/h3&gt;

&lt;p&gt;Por padrão, ele vai instalar o Ubuntu, que vem na versão 22.04 LTS. Quando iniciar o computador, ele vai finalizar a instalação, e vai te pedir algumas configurações.&lt;/p&gt;

&lt;p&gt;Para escolher outra distro, você pode ver as disponíveis com o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-o&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para instalar o Ubuntu 22.04, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Ubuntu-22.04&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Configurar seu usuário e senha
&lt;/h3&gt;

&lt;p&gt;Quando finalizar a instalação, ele vai pedir que você configure o seu UNIX username e a sua senha. Esse usuário será o padrão da instalação, e a senha será a que você precisa utilizar quando rodar comandos com &lt;code&gt;sudo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ez0r2vzj32y3mcc9jnd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ez0r2vzj32y3mcc9jnd.png" alt="Configuração de usuário e senha no WSL"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Atualização de programas
&lt;/h3&gt;

&lt;p&gt;Como estamos instalando uma versão com pouco mais de 1 ano de lançamento, é importante atualizar todos os pacotes. Dentre as atualizações, estão algumas atualizações de segurança do kernel Linux.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, uma vez por dia o WSL mostra a seguinte mensagem:&lt;/p&gt;

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

&lt;p&gt;Para desabilitar, basta criar o arquivo .hushlogin na home do usuário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; ~/.hushlogin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuração do Windows Terminal
&lt;/h2&gt;

&lt;p&gt;O Windows Terminal é um aplicativo de terminal bem satisfatório. Ele permite abrir várias abas, mesmo de tipos diferentes (como cmd, powershell, e qualquer distro de wsl), além de ser bem rápido e customizável. &lt;/p&gt;

&lt;p&gt;Vamos começar abrindo as configurações (&lt;code&gt;Ctrl + ,&lt;/code&gt; ).&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configurar perfil padrão
&lt;/h3&gt;

&lt;p&gt;O primeiro passo é configurar o terminal para abrir automaticamente no WSL. Basta selecionar a sua distro no menu da primeira opção. No meu caso, Ubuntu 22.04 LTS&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhkhmc80xas9wsgas37v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhkhmc80xas9wsgas37v.png" alt="Seleção do perfil padrão do Windows Terminal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressione o botão de Salvar&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Habilitar cópia de texto ao selecionar
&lt;/h3&gt;

&lt;p&gt;No menu &lt;strong&gt;Interaction,&lt;/strong&gt; basta marcar a primeira opção.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3z9iz1bx8lgnt3e6sl4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3z9iz1bx8lgnt3e6sl4w.png" alt="Demonstração de onde habilitar a configuração de cópia ao selecionar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressione o botão de Salvar&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Personalização de cores
&lt;/h3&gt;

&lt;p&gt;No menu &lt;strong&gt;Color schemes&lt;/strong&gt; podemos utilizar um esquema de cores já existente, ou criar um novo. No meu caso, vou configurar o &lt;a href="https://draculatheme.com/windows-terminal" rel="noopener noreferrer"&gt;Dracula Theme&lt;/a&gt;. O jeito mais fácil de instalar o Dracula é usar o botão &lt;strong&gt;Open JSON file&lt;/strong&gt; no canto inferior direito, e inserir o JSON do site na lista &lt;strong&gt;schemes&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Personalização de fontes
&lt;/h3&gt;

&lt;p&gt;Mais abaixo vou mostrar como faço a configuração do &lt;a href="https://github.com/romkatv/powerlevel10k" rel="noopener noreferrer"&gt;powerlevel10k&lt;/a&gt;. Para utilizar ele (e qualquer tema mais complexo de terminal), você vai precisar instalar uma &lt;a href="https://github.com/ryanoasis/nerd-fonts" rel="noopener noreferrer"&gt;Nerd Font&lt;/a&gt;, pois elas vem com vários ícones. No caso do powerlevel10k, eles recomendam a fonte MesloLGS. Os links para download podem ser encontrados no &lt;a href="https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf" rel="noopener noreferrer"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para configurar a fonte, você pode ir na parte de &lt;strong&gt;Profiles&lt;/strong&gt;, selecionar o &lt;strong&gt;Defaults&lt;/strong&gt; e ir no menu &lt;strong&gt;Appearence&lt;/strong&gt;, nas configurações adicionais.&lt;/p&gt;

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

&lt;p&gt;Nesse mesmo menu você encontra opções gerais de aparência, como habilitar a transparência da janela, ou aplicar alguns efeitos. Eu uso a opacidade em 99%, e não uso nenhum dos efeitos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração do ZSH
&lt;/h2&gt;

&lt;p&gt;Não vou entrar em detalhes, mas o ZSH (Z shell) é uma versão estendida do shell padrão de Linux, que traz uma boa performance, boas features de autocomplete e correção, além do suporte a plugins e temas, que é o principal foco aqui.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Instalar o zsh
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing ZSH"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;zsh &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Instalar o ohmyzsh
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing ohmyzsh"&lt;/span&gt;
sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após executar o comando, ele vai pedir sua confirmação para trocar o shell padrão para zsh&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhe80i2i1k4bl7vfz1554.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhe80i2i1k4bl7vfz1554.png" alt="Configuração do ohmyzsh para trocar o shell padrão"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a confirmação, o seu terminal estará assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvmgide9odqc6by9nayb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvmgide9odqc6by9nayb.png" alt="Terminal após a configuração do ohmyzsh"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Instalação de plugins
&lt;/h3&gt;

&lt;p&gt;O oh myzsh tem uma &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins" rel="noopener noreferrer"&gt;lista enorme de plugins&lt;/a&gt;. No dia a dia os que mais me impactam são o zsh-autosuggestions, que usa o seu histórico para recomendar comandos inteiros; e o zsh-syntax-highlighting. Hoje também vou aproveitar para instalar o &lt;a href="https://github.com/asdf-vm/asdf" rel="noopener noreferrer"&gt;asdf&lt;/a&gt;, que é um gerenciador de versões de várias linguagens; o &lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt;, que permite a exportação de variáveis de ambiente de um arquivo &lt;code&gt;.env&lt;/code&gt; automaticamente; e os plugins de autocomplete de algumas ferramentas como node, gcloud, docker, docker-compose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing zsh-autosuggestions"&lt;/span&gt;
git clone https://github.com/zsh-users/zsh-autosuggestions &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/plugins/zsh-autosuggestions
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing zsh-syntax-highlighting"&lt;/span&gt;
git clone https://github.com/zsh-users/zsh-syntax-highlighting &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/plugins/zsh-syntax-highlighting
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing asdf"&lt;/span&gt;
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O jeito mais fácil de habilitar os plugins é abrir o arquivo de configuração do terminal no VS Code, e inserir os valores manualmente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basta procurar a variável &lt;strong&gt;plugins&lt;/strong&gt; (no meu está na linha 73) e inserir todos os plugins que quer ativar. No meu caso, ficou assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
  git 
  zsh-autosuggestions 
  zsh-syntax-highlighting 
  asdf 
  dotenv &lt;span class="nb"&gt;sudo
  &lt;/span&gt;gcloud 
  node npm 
  docker docker-compose 
  &lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode fazer essa substituição por linha de comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;".zshrc"&lt;/span&gt;
&lt;span class="nv"&gt;old_line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"plugins=(git)"&lt;/span&gt;
&lt;span class="nv"&gt;new_line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"plugins=(git zsh-autosuggestions zsh-syntax-highlighting asdf dotenv sudo gcloud node npm docker docker-compose)"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting plugins on .zshrc"&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s|&lt;/span&gt;&lt;span class="nv"&gt;$old_line&lt;/span&gt;&lt;span class="s2"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;$new_line&lt;/span&gt;&lt;span class="s2"&gt;|"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuração do powerlevel10k
&lt;/h2&gt;

&lt;p&gt;O powerlevel10k é um tema de zsh que foca na flexibilidade do ambiente, mas com uma configuração bem simples.&lt;/p&gt;

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

&lt;p&gt;Para instalar, basta fazer o download&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 https://github.com/romkatv/powerlevel10k.git &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ZSH_CUSTOM&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="p"&gt;/.oh-my-zsh/custom&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/themes/powerlevel10k
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E colocar o &lt;code&gt;ZSH_THEME="powerlevel10k/powerlevel10k"&lt;/code&gt; no &lt;code&gt;.zshrc&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;old_line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ZSH_THEME="[^"]*"'&lt;/span&gt;
&lt;span class="nv"&gt;new_theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ZSH_THEME="powerlevel10k/powerlevel10k"'&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting the zsh theme to powerlevel10k"&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s|&lt;/span&gt;&lt;span class="nv"&gt;$old_line&lt;/span&gt;&lt;span class="s2"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;$new_theme&lt;/span&gt;&lt;span class="s2"&gt;|"&lt;/span&gt; &lt;span class="s2"&gt;".zshrc"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora basta reiniciar o terminal, e seguir a configuração interativa.&lt;/p&gt;

&lt;p&gt;No final o meu terminal ficou assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbn2lfldxfh2qh9u9wchd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbn2lfldxfh2qh9u9wchd.png" alt="Meu terminal após a configuração do powerlevel10k"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu também faço algumas personalizações no &lt;code&gt;.p10k.zsh&lt;/code&gt;, como para mostrar a configuração do gcloud o tempo todo (alterar nas linhas 1514 e 1515 para customizar o formato, e comentar as linha 1486 e 1529 para mostrar sempre o projeto)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficdugbdeenbep5bjk5fh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficdugbdeenbep5bjk5fh.png" alt="Meu terminal após customizações na configuração"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode navegar por esse arquivo e ler algumas das configurações, é possível personalizar completamente o comportamento do tema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação de ferramentas
&lt;/h2&gt;

&lt;p&gt;Agora que o terminal está pronto, vamos instalar as ferramentas necessárias.&lt;/p&gt;

&lt;p&gt;Vou usar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terraform&lt;/li&gt;
&lt;li&gt;gcloud cli&lt;/li&gt;
&lt;li&gt;gh cli&lt;/li&gt;
&lt;li&gt;python, pip e venv&lt;/li&gt;
&lt;li&gt;node&lt;/li&gt;
&lt;li&gt;docker (ou podman)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também vou criar um arquivo para colocar alias e funções customizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Terraform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing terraform"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; gnupg software-properties-common &lt;span class="nt"&gt;-y&lt;/span&gt;
wget &lt;span class="nt"&gt;-O-&lt;/span&gt; https://apt.releases.hashicorp.com/gpg | &lt;span class="se"&gt;\&lt;/span&gt;
    gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /usr/share/keyrings/hashicorp-archive-keyring.gpg
gpg &lt;span class="nt"&gt;--no-default-keyring&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--keyring&lt;/span&gt; /usr/share/keyrings/hashicorp-archive-keyring.gpg &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fingerprint&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    https://apt.releases.hashicorp.com &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; main"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/hashicorp.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;terraform &lt;span class="nt"&gt;-y&lt;/span&gt;
terraform &lt;span class="nt"&gt;-install-autocomplete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Google Cloud CLI
&lt;/h3&gt;

&lt;p&gt;Tive alguns problemas para instalar o gcloud, mas esses são os comandos que uso no Linux&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing gcloud cli"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;apt-transport-https ca-certificates gnupg &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /usr/share/keyrings/cloud.google.gpg
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;google-cloud-cli &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para conseguir baixar, executei o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Removing duplicates"&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /etc/apt/sources.list.d/google-cloud-sdk.list
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
| &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg &lt;span class="se"&gt;\&lt;/span&gt;
| &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/cloud.google.gpg

&lt;span class="c"&gt;#Esse comando ficou parado esperando que eu digitasse o nome do arquivo. Eu copiei exatamente o que já tem nele&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;google-cloud-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configurando o gcloud:&lt;/p&gt;

&lt;p&gt;Basta executar o comando:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Ele vai gerar uma URL, que você pode clicar para ir para o navegador, onde vai precisar liberar permissão para o SDK&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxft2c25ryb3r099lnvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxft2c25ryb3r099lnvt.png" alt="Permissões solicitadas pelo gcloud sdk ao fazer login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao final, basta copiar o código e colocar no seu terminal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmesx294sxrqvjayf557.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmesx294sxrqvjayf557.png" alt="Tela final de login do gcloud sdk, contendo o código para finalizar a configuração no terminal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Github CLI
&lt;/h3&gt;

&lt;p&gt;Basta executar os comandos&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Em seguida, para configurar basta executar o comando e seguir a configuração interativa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Python, pip e venv
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing python, pip and venv"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install  &lt;/span&gt;python3-venv python3-pip &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Node
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing nodejs with asdf"&lt;/span&gt;
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf &lt;span class="nb"&gt;install &lt;/span&gt;nodejs latest
asdf global nodejs latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.a Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing docker"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove docker-desktop
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.docker/desktop
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /usr/local/bin/com.docker.cli
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt purge docker-desktop
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    ca-certificates &lt;span class="se"&gt;\&lt;/span&gt;
    curl &lt;span class="se"&gt;\&lt;/span&gt;
    gnupg &lt;span class="se"&gt;\&lt;/span&gt;
    lsb-release &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/apt/keyrings
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.gpg
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-compose-plugin &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configurar para conseguir usar sem &lt;code&gt;sudo&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configurar para que o serviço inicie sempre que abrir o terminal. Para isso colocamos o comando no arquivo &lt;code&gt;/etc/wsl.conf&lt;/code&gt;. Para aplicar a alteração, é necessário reiniciar o wsl&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting docker service to start on boot"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'[boot]\ncommand="service docker start"'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/wsl.conf
wsl.exe &lt;span class="nt"&gt;--shutdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.b Podman
&lt;/h3&gt;

&lt;p&gt;Podman é um outro gerenciador de contêineres, parecido com o docker. Sua instalação é mais simples, basta executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;podman &lt;span class="nt"&gt;-y&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;podman-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando &lt;code&gt;podman&lt;/code&gt; pode ser usado em quase todos os casos em que o comando &lt;code&gt;docker&lt;/code&gt; funciona. A exceção que encontrei é que ele ainda não tem o &lt;code&gt;compose&lt;/code&gt;, como o docker. Para isso, basta instalar o podman-compose e executar &lt;code&gt;podman-compose [comando]&lt;/code&gt;. É comum alguns tutoriais sugerirem que você crie um &lt;code&gt;alias docker=podman&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;O motivo para usar o Podman ao invés do Docker é que a instalação do docker sugerida para windows requer o Docker Desktop, que vai usar o WSL como backend (o que fizemos aqui é uma gambiarra, cortesia que ganhamos ao usar Linux). O problema é que a licença do Docker Desktop foi atualizada esse ano, definindo que a utilização gratuita não pode ser feita por empresas que tenham mais de 250 funcionários ou mais de 10 milhões de dólares de receita anual (fonte: &lt;a href="https://www.notion.so/Who-Will-Teach-Silicon-Valley-to-Be-Ethical-3b3294ef186846b2afff8df30c872222" rel="noopener noreferrer"&gt;Who’s required to pay for Docker Desktop?&lt;/a&gt;). Claro que isso não é um problema caso seu uso seja para estudos, uso pessoal ou para projetos open source não comerciais. Além disso, usuários de Windows estão acostumados a ter ferramentas de interface gráfica, que é o maior apelo do Docker Desktop. O &lt;a href="https://podman-desktop.io/" rel="noopener noreferrer"&gt;Podman Desktop&lt;/a&gt; continua sendo 100% gratuito, mas sua instalação em Windows requer alguns ajustes que não vou comentar hoje.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Configurações de alias e ambiente em geral
&lt;/h3&gt;

&lt;p&gt;Geralmente eu crio um arquivo &lt;code&gt;~/.profile&lt;/code&gt; , que deixo salvo como backup no meu github.&lt;/p&gt;

&lt;p&gt;Basta criar o arquivo com suas funções, variáveis e apelidos. E depois acrescentar o comando &lt;code&gt;source ~/.profile&lt;/code&gt; no fim do seu &lt;code&gt;.zshrc&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Eu costumo criar pastas para centralizar minhas service accounts e meus virtual environments de python, por isso tenho alguns comandos que fiz para facilitar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;function &lt;/span&gt;set_google_credentials&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/home/&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;/.service_accounts/&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gcloud config configurations"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para gerenciar virtual environments, criei o pacote &lt;code&gt;pyenvs&lt;/code&gt;, que está disponível no &lt;a href="https://gist.github.com/1cadumagalhaes/beface90e882be4dc140d169228346db" rel="noopener noreferrer"&gt;gist do github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Gerenciamento de pastas e ambientes
&lt;/h3&gt;

&lt;p&gt;Para usar o WSL, é recomendado que todos os arquivos que você vai utilizar estejam dentro do ambiente virtualizado. Ou seja, sempre que for criar um projeto novo (ou clonar um existente), abra o terminal e faça toda a execução dentro da home do seu usuário. Geralmente eu crio uma pasta &lt;code&gt;Projects&lt;/code&gt; onde centralizo tudo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;Projects &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;Projects
&lt;span class="nb"&gt;mkdir &lt;/span&gt;exemplo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;exemplo
npm init &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"console.log('código de exemplo')"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso queira encontrar a pasta dos seus projetos pelo explorador de arquivos do windows, basta usar o comando abaixo dentro da pasta&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;explorer.exe &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;: no windows explorer, você pode fixar a pasta do seu wsl no menu lateral.&lt;/p&gt;

&lt;p&gt;E por fim, sempre que vou abrir o VS Code eu abro pelo terminal, executando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code &lt;span class="o"&gt;[&lt;/span&gt;caminho da pasta]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Finalizando
&lt;/h2&gt;

&lt;p&gt;Talvez eu tenha esquecido de deixar alguma configuração, por isso fiquem a vontade para comentar aqui ou me marcar no twitter que eu trago uma atualização.&lt;/p&gt;

&lt;p&gt;Espero que isso tenha sido útil para alguém, até a próxima!&lt;/p&gt;

&lt;p&gt;Esse post foi publicado originalmente na minha página do github, e você pode acessar aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.cadumagalhaes.dev/tutorial/2023/configura%C3%A7%C3%A3o-do-windows-para-desenvolvimento?utm_source=divulgacao&amp;amp;utm_medium=devto" rel="noopener noreferrer"&gt;Blog | cadumagalhaes.dev | Configuração do Windows para desenvolvimento&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
