Mostrando postagens com marcador Programação. Mostrar todas as postagens
Mostrando postagens com marcador Programação. Mostrar todas as postagens

sábado, abril 11, 2026

🐳 Docker Maker — Monte seu Ubuntu Desktop remoto pelo navegador (open-source)

Já precisou de um ambiente Linux completo com interface gráfica rodando dentro do Docker, acessível direto pelo navegador? E ficou perdendo tempo escrevendo Dockerfile na mão? 😩

Criei o Docker Maker para resolver exatamente isso — e ele é 100% gratuito e open-source! 🎉



quinta-feira, março 26, 2026

Como instalar o 🐳 Docker no Ubuntu — guia passo a passo para iniciantes

🐳 Como instalar o Docker no Ubuntu — guia passo a passo para iniciantes

Se você está no começo da graduação, talvez no 2º semestre, e começou a ouvir falar de Docker em aulas, vídeos ou projetos, este guia foi feito para você 😄

Aqui você vai aprender, de forma simples e prática, como instalar o Docker no Ubuntu, entender o que cada etapa faz e testar se tudo ficou funcionando corretamente.

📘 O que é Docker?
Docker é uma ferramenta que permite empacotar e executar aplicações em containers. Pense neles como “caixinhas” organizadas que carregam tudo que um programa precisa para funcionar.

🎯 O que vamos fazer

  • Atualizar o Ubuntu
  • Instalar os pacotes necessários
  • Adicionar o repositório oficial do Docker
  • Instalar a versão estável mais recente
  • Testar se o Docker está funcionando
  • Permitir usar Docker sem sudo

🧰 Pré-requisitos

Antes de começar, você precisa:

  • Ter um computador com Ubuntu instalado
  • Ter acesso a um usuário com permissão de administrador
  • Ter internet funcionando
  • Abrir o Terminal do Ubuntu
💡 Dica para iniciantes:
O terminal pode parecer assustador no início, mas ele é uma das ferramentas mais importantes para quem estuda computação. Vá copiando e executando um comando de cada vez com calma.

1️⃣ Atualizar a lista de pacotes do sistema

Primeiro, vamos atualizar as informações dos programas disponíveis no Ubuntu e instalar possíveis atualizações.

sudo apt update
sudo apt upgrade -y

O que isso faz?

  • sudo: executa o comando com permissão de administrador
  • apt update: atualiza a lista de pacotes disponíveis
  • apt upgrade -y: instala atualizações pendentes automaticamente

2️⃣ Instalar dependências necessárias

Agora vamos instalar alguns pacotes que ajudam o Ubuntu a baixar arquivos com segurança e trabalhar com repositórios externos.

sudo apt install -y ca-certificates curl gnupg

Explicando:

  • ca-certificates: ajuda na validação de certificados digitais 🔐
  • curl: permite baixar arquivos pela internet 🌐
  • gnupg: ajuda a verificar assinaturas e chaves de segurança

3️⃣ Adicionar a chave GPG oficial do Docker

Essa etapa garante que os pacotes do Docker sejam reconhecidos como oficiais e confiáveis.

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

O que está acontecendo aqui?

  • Criamos uma pasta para armazenar chaves de segurança
  • Baixamos a chave oficial do Docker
  • Salvamos essa chave em formato adequado para o sistema
  • Liberamos permissão de leitura para o arquivo
🛡️ Por que isso é importante?
Porque o Ubuntu precisa ter certeza de que os pacotes vêm realmente do Docker e não de uma fonte falsa.

4️⃣ Adicionar o repositório oficial do Docker

Agora vamos dizer ao Ubuntu onde ele deve procurar os pacotes do Docker.

echo \
"deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Em palavras simples:

  • arch=$(dpkg --print-architecture): identifica a arquitetura do seu computador, como amd64
  • VERSION_CODENAME: detecta automaticamente a versão do seu Ubuntu
  • stable: indica que queremos a versão estável do Docker ✅

5️⃣ Atualizar novamente a lista de pacotes

Como adicionamos um novo repositório, precisamos atualizar a lista de pacotes mais uma vez.

sudo apt update

6️⃣ Instalar o Docker

Agora sim: vamos instalar o Docker e alguns componentes importantes que vêm junto com ele.

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

O que esses pacotes fazem?

  • docker-ce: o motor principal do Docker 🐳
  • docker-ce-cli: comandos que você usa no terminal
  • containerd.io: componente que ajuda a executar containers
  • docker-buildx-plugin: facilita builds avançados de imagens
  • docker-compose-plugin: permite usar docker compose

7️⃣ Testar se a instalação funcionou

O jeito mais clássico de testar o Docker é rodar o container hello-world.

sudo docker run hello-world

Se tudo estiver certo, o Docker vai baixar uma imagem de teste e mostrar uma mensagem informando que a instalação foi bem-sucedida 🎉

8️⃣ Ver a versão instalada

Se você quiser confirmar a versão instalada no sistema, use:

docker --version

Ou, para ver mais detalhes:

docker version
📌 Importante:
Esse método instala a versão estável mais recente disponível no repositório oficial do Docker para sua versão do Ubuntu.

9️⃣ Usar Docker sem precisar digitar sudo

Por padrão, muitos comandos do Docker exigem sudo. Para facilitar sua vida, você pode adicionar seu usuário ao grupo docker.

sudo usermod -aG docker $USER

Depois disso, você precisa sair e entrar novamente na sessão do Ubuntu. Se quiser tentar aplicar no terminal atual, use:

newgrp docker

Agora teste sem sudo:

docker run hello-world

🔎 Comandos úteis para o dia a dia

Verificar se o serviço Docker está rodando

sudo systemctl status docker

Iniciar o Docker manualmente

sudo systemctl start docker

Fazer o Docker iniciar junto com o sistema

sudo systemctl enable docker

Verificar o Docker Compose

docker compose version

⚠️ Problemas comuns

Erro: permission denied
Normalmente isso acontece porque o usuário ainda não foi adicionado ao grupo docker, ou porque você ainda não fez logout/login após o comando.
Erro por conflito com instalação antiga
Se você já tentou instalar Docker antes usando outro método, pode ser necessário remover pacotes antigos:
sudo apt remove docker docker-engine docker.io containerd runc

📝 Resumo rápido

  1. Atualize o sistema
  2. Instale dependências
  3. Adicione a chave oficial do Docker
  4. Adicione o repositório oficial
  5. Atualize os pacotes novamente
  6. Instale o Docker
  7. Teste com hello-world
  8. Opcionalmente, habilite uso sem sudo

🎓 Conclusão

Instalar o Docker no Ubuntu não é tão complicado quanto parece. Quando você entende o papel de cada etapa, tudo faz mais sentido e o terminal deixa de ser um bicho de sete cabeças 😄

Para quem está começando na computação, aprender Docker cedo é excelente, porque ele aparece em desenvolvimento de software, devops, banco de dados, deploy e até em projetos acadêmicos.

🚀 Próximo passo:
Depois de instalar, experimente aprender:
  • docker ps
  • docker images
  • docker run
  • docker compose up
Esses comandos já vão te colocar em outro nível.

quarta-feira, março 18, 2026

Comparação realista de engines de física para simulação e renderização

Imagem de capa sobre simulação física
SIMULAÇÃO FÍSICA

Engines de Física 2D e 3D: comparação realista para simular, visualizar e escolher melhor

Um guia prático e elegante sobre bibliotecas e engines gratuitas para Python e outras linguagens, com foco especial em um cenário real: uma esfera de aço arremessada contra uma parede de ferro em um ambiente com gravidade zero.

🐍 Python 🎮 Tempo real 🎬 Render 🆓 Gratuito ⚙️ Comparação prática

📚 Visão geral do conteúdo

1. O que é um motor de física
2. Bibliotecas para Python
3. Engines relevantes em outras linguagens
4. Comparação realista entre as principais opções
5. Melhor escolha para simular e renderizar
6. Cenário da esfera de aço contra parede de ferro
7. Limitações importantes

🧠 O que é um motor de física?

Um physics engine é um sistema de software responsável por simular o comportamento físico de objetos em um ambiente virtual.

Na prática, ele calcula e atualiza elementos como:

🌍 Gravidade
💥 Colisões
🧱 Corpos rígidos
🪢 Juntas e articulações
🛞 Atrito e restituição
🌊 Fluidos e partículas
Esses motores são usados em jogos, robótica, inteligência artificial, simulações científicas, educação e visualização técnica.

🐍 Principais motores de física para Python

🔥 PyBullet

É uma das opções mais práticas para simulação 3D em Python. Permite abrir uma interface gráfica, definir gravidade, colisões, massas e materiais com pouca configuração.

  • ✅ 3D
  • ✅ Bom para prototipação rápida
  • ✅ Muito usado em robótica e IA
  • ✅ Fácil de começar

🧠 MuJoCo

É uma engine muito forte em precisão física, especialmente em sistemas articulados, biomecânica, robótica e pesquisa científica.

  • ✅ 3D avançado
  • ✅ Alta precisão
  • ✅ Excelente para pesquisa e controle
  • ⚠️ Curva de aprendizado maior

🎮 Pymunk / PyBox2D

Ótimos para simulações 2D. São leves, rápidos e muito úteis em jogos, visualizações simples e protótipos bidimensionais.

  • ✅ 2D
  • ✅ Muito leves
  • ✅ Fáceis de usar
  • ⚠️ Não servem para o seu caso 3D

📘 VPython / PySPH

O VPython é excelente para ensino e visualização simples. O PySPH é mais voltado para partículas e fluidos. Ambos são interessantes, mas não seriam minha primeira escolha para a colisão 3D metálica do seu cenário.

🌍 Engines importantes em outras linguagens

Engine Linguagem base Perfil Observação
Bullet C++ 3D geral Base do PyBullet
Box2D C 2D Muito usado em jogos
PhysX C++ Jogos AAA Muito forte em engines de jogo
Rapier Rust 2D/3D moderno Boa opção moderna
BEPU / dyn4j C# / Java Física geral Alternativas válidas fora do ecossistema Python

🎬 Engines completas: física + renderização

Quando a necessidade não é apenas simular, mas também ver a cena funcionando com qualidade visual, entram em jogo engines e ferramentas mais completas.

🎬 Blender

Melhor escolha para visual bonito, materiais metálicos, iluminação, câmera e render final em vídeo ou imagem.

🕹️ Godot

Excelente para criar um simulador interativo em tempo real, alterando parâmetros ao vivo como velocidade, massa e direção.

🎮 Unity / Unreal

São fortíssimos em jogos e visual, mas geralmente menos práticos para um fluxo simples e direto em Python.

📊 Comparação realista entre as principais soluções

Engine Realismo físico Velocidade Facilidade Melhor uso
MuJoCo ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐ Pesquisa, robótica, IA
PyBullet ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ Prototipação rápida em Python
PhysX ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ Jogos e engines visuais
Box2D ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ Jogos e simulações 2D
Resumo honesto: se a prioridade for realismo científico, MuJoCo tende a ficar na frente. Se a prioridade for produtividade e rapidez em Python, PyBullet costuma ser a opção mais prática.

⚙️ Aplicando ao cenário real: esfera de aço contra parede de ferro em gravidade zero

🌌 O ambiente

Como a gravidade é zero, a esfera não “cai”. O movimento será dominado pela velocidade inicial e pela física da colisão.

💥 O impacto

O que mais influencia o resultado visual e dinâmico é o conjunto de parâmetros como:

  • velocidade inicial da esfera
  • massa e raio
  • restituição (quanto ela quica)
  • atrito e atrito de rolamento
  • espessura e rigidez da parede no modelo usado

🎯 Melhor escolha para esse caso

Para simular e ver funcionando, minha recomendação prática é:

🐍
PyBullet
Melhor para testar rápido em Python e abrir uma GUI 3D simples.
🎬
Blender
Melhor para materiais metálicos, luz, câmera e render visual bonito.
🕹️
Godot
Melhor se a ideia for virar um simulador interativo ou mini app.

📈 Comparação prática para esse cenário específico

Critério PyBullet Blender Godot MuJoCo
Ver funcionando rapidamente 9/10 6/10 8/10 5/10
Qualidade visual final 4/10 10/10 7/10 3/10
Controle via Python 10/10 6/10 4/10 8/10
Interatividade 6/10 3/10 10/10 4/10
Curva de aprendizado 8/10 6/10 7/10 4/10

⭐ Recomendação final

Fluxo mais inteligente para esse tipo de projeto

PyBullet para validar a física e experimentar o impacto rapidamente.
Blender para refazer a cena com materiais metálicos, luz e render mais bonito.
Godot se a meta for criar uma experiência interativa ou um mini simulador.

Escolha direta por objetivo

  • Quero ver funcionando agora em Python: PyBullet
  • Quero um render bonito para post, vídeo ou apresentação: Blender
  • Quero um app interativo: Godot
  • Quero máxima precisão científica: MuJoCo

⚠️ Limitações importantes

Um ponto crucial: motores de física comuns usados em jogos e protótipos geralmente trabalham com corpos rígidos.

  • Isso significa que eles simulam muito bem a colisão, o movimento, o quique e a resposta dinâmica.
  • Mas não costumam simular com fidelidade a deformação real do metal.
  • Também não são a melhor ferramenta para amassamento preciso, fratura ou ruptura estrutural.
Para esse nível de fidelidade, o caminho normalmente passa por FEM (método dos elementos finitos) e ferramentas de engenharia mais especializadas.

✅ Conclusão

Existe, sim, um ótimo ecossistema gratuito para simulação física em Python e em outras linguagens. Para a maioria dos casos práticos, a decisão não é “qual engine é melhor no papel”, mas sim qual engine entrega melhor o que você precisa ver.

Para o cenário da esfera de aço contra uma parede em gravidade zero, a resposta mais honesta é: PyBullet para testar, Blender para impressionar, Godot para interagir e MuJoCo para pesquisar.

quarta-feira, fevereiro 25, 2026

ChartDB: diagramas de banco (ERD) em segundos

ChartDB: diagramas de banco (ERD) em segundos — online ou self-hosted com Docker 🚀

A dica de hoje é uma ferramenta que costuma economizar horas quando você precisa entender, documentar ou evoluir um esquema de banco: ChartDB.

O que é o ChartDB?

O ChartDB é um editor web open-source para diagramas de esquema de banco (ERD/relacionamentos). A ideia é simples e poderosa: você importa o schema (muitas vezes com uma única query “inteligente”), visualiza as tabelas/relacionamentos, ajusta o diagrama e exporta quando precisar.

Opção 1: testar online (zero instalação) 🌐

Quer só validar a ferramenta rapidinho? Vai no site e testa no navegador: https://www.chartdb.io. É ótimo para:

  • entender um banco legado antes de mexer nele;
  • gerar um diagrama pra documentação;
  • explicar o modelo pro time (ou pro “eu do futuro” 😄).

Opção 2: rodar na sua infraestrutura (self-hosted) com Docker 🐳

Se você trabalha com dados sensíveis, rede restrita, ou simplesmente quer controle total, dá pra subir o ChartDB localmente com Docker em poucos segundos.

🚦 “Quero rodar AGORA” (sem IA)

Para as funcionalidades sem IA, você não precisa de API key. Basta subir o container e acessar no navegador:

docker run -p 8080:80 ghcr.io/chartdb/chartdb:latest

Depois abra: http://localhost:8080

🤖 “Quero IA também” (opcional)

O ChartDB tem recursos com IA (por exemplo, assistente/geração/ajuda em exportações). Para isso, você configura uma chave (ou um endpoint/modelo custom, dependendo do seu setup). Um jeito bem direto é via variável de ambiente:

docker run -e OPENAI_API_KEY=YOUR_OPEN_AI_KEY -p 8080:80 ghcr.io/chartdb/chartdb:latest
Dica de sala de aula: se você só quer diagramar/importar/exportar sem recursos de IA, não coloque a chave. Assim você evita dependências desnecessárias e mantém o setup mais “seco” e previsível.

🕵️ Extra: desabilitar analytics (se você preferir)

Se a sua política interna pede o mínimo de telemetria possível, existe opção de desabilitar analytics via env:

docker run -e DISABLE_ANALYTICS=true -p 8080:80 ghcr.io/chartdb/chartdb:latest

Quando eu usaria isso na vida real?

  • Onboarding de dev/analista novo: “tá aqui o mapa do banco”.
  • Refactor com segurança: enxergar dependências antes de renomear/migrar tabelas.
  • Documentação viva: diagrama + export gerando base pro seu ADR/README.
  • Discussões de arquitetura: o time fala melhor olhando o desenho do que só lendo DDL.

Fechando (e a lição de casa 😄)

Se você nunca testou uma ferramenta de ERD “rápida”, faz assim:

  1. abre o ChartDB online e brinca 10 minutos;
  2. depois sobe com Docker local pra ver como fica no seu ambiente;
  3. por fim, decide se vale habilitar IA (só quando fizer sentido).


Referências: chartdb.io · github.com/chartdb/chartdb

domingo, fevereiro 22, 2026

📊 Prompt para Análise e Reverse-Engineering de Dashboard



Se você usa IA no Cursor (ou qualquer editor com copilots) para criar interfaces, já deve ter percebido um problema clássico: a IA até descreve a tela… mas mistura explicação com estrutura, perde consistência e vira um “texto bonito” difícil de implementar.

Para criar os exemplos de interfaces você pode usar o Google Stitch - Design with AI.

A solução é simples e poderosa: escrever um prompt que força uma análise de UI/UX como um handoff real de designer → dev, com saída em JSONC (estrutura previsível, fácil de evoluir e versionar).


🎯 O objetivo

  • “Reverse-engineering” do dashboard a partir de um screenshot
  • Descrever layout, componentes, hierarquia e interação
  • Cobrir light mode e dark mode
  • Definir responsividade com breakpoints padrão do Tailwind
  • Extrair paletas e design tokens sem exagerar nos detalhes
  • Gerar um brief final para implementação (sem entrar em “stack”)

✅ Resultado: você ganha um “contrato de UI” que pode ser iterado, comparado no Git, reaproveitado como base de design system e usado para gerar componentes com muito menos retrabalho.

🧠 Por que JSONC é melhor do que só Markdown?

Markdown é ótimo para explicar, mas ruim para estruturar. Quando o objetivo é construir UI com precisão, você quer uma saída que seja:

  • Previsível (sempre no mesmo formato)
  • Parsável (dá pra transformar em config, schema, DSL, etc.)
  • Iterável (diferenças aparecem claramente em diff no Git)

O ideal é o formato híbrido: Markdown para instruções + JSONC como saída + um prompt final em bloco de código.


🧩 O prompt (no Gist)

Eu deixei o prompt completo pronto para copiar e colar no Cursor. Basta acessar o Gist pelo link abaixo:

🔗 Abrir o prompt no GitHub Gist

💡 Dica: no Cursor, cole o prompt e peça: “analise esta imagem e gere a saída em JSONC”. Depois, reaproveite os tokens para criar uma base de design system.

🚀 Como usar (fluxo recomendado)

  1. Anexe o screenshot do dashboard para a IA
  2. Rode o prompt e gere o JSONC
  3. Revise tokens/paletas e normalize nomes (primary/secondary/grays)
  4. Use o “prompt final para dev” (gerado pela IA) para guiar a implementação
  5. Itere: peça alterações específicas e compare mudanças no diff

✨ Bônus: evoluindo para uma DSL de UI

Se você criar muitos dashboards parecidos, vale considerar uma DSL de UI (uma linguagem declarativa para descrever telas). O JSONC que esse prompt produz já pode ser o primeiro passo: um contrato estruturado que vira “config de tela” e pode alimentar um renderizador, um builder visual ou templates padronizados.


sexta-feira, fevereiro 06, 2026

Como Resolver o Erro de Certificado SSL no Git


Se você trabalha em redes corporativas e tentou rodar um pip install ou git clone, provavelmente encontrou este erro frustrante:

O Problema

fatal: unable to access '...': schannel: next InitializeSecurityContext failed: SEC_E_UNTRUSTED_ROOT (0x80090325)

Por que isso acontece?

Esse erro ocorre porque o Git (usando o SChannel do Windows) tenta validar o certificado SSL do servidor GitLab interno. Em intranets, é comum o uso de certificados autoassinados ou emitidos por uma CA (Autoridade Certificadora) interna que não está na lista de "raízes confiáveis" do seu sistema operacional.

Como o Windows não consegue garantir que o servidor é quem diz ser, ele bloqueia a conexão para te proteger.

Como Resolver

Solução 1: Variável de Ambiente (Recomendado para uso pontual)

A forma mais rápida no PowerShell, sem precisar alterar configurações globais do Git:

$env:GIT_SSL_NO_VERIFY=$true
pip install git+https://gitlab.intranet.br

Solução 2: Configuração Global do Git

Para não precisar digitar o comando acima toda vez:

git config --global http.sslVerify false

Solução 3: Mudar o Backend de Segurança

Às vezes, forçar o Git a usar o OpenSSL resolve problemas de integração com o Windows:

git config --global http.sslBackend openssl

Dica de Segurança: Embora desativar o SSL facilite o trabalho interno, lembre-se de reativá-lo ao trabalhar com repositórios públicos na internet para garantir sua segurança.

terça-feira, fevereiro 03, 2026

GitLab: Merge do main no seu branch

🔀✅ Fazer Merge do main no seu branch (sem reescrever histórico)

Se alguém acabou de fazer merge no main no GitLab e você está trabalhando em outro branch, o caminho mais simples e seguro é: trazer o main atualizado para dentro do seu branch usando merge.

✅ Por que essa opção é “mais simples”?
  • 📌 Não reescreve histórico (nada de --force)
  • 🤝 Melhor para trabalho em equipe
  • 🧯 Menor risco de confusão e perdas

🧭 Quando usar o merge do main no seu branch?

  • 🚧 Você ainda está desenvolvendo e quer evitar conflitos grandes depois
  • 🧪 Você quer garantir que seu branch funciona com o main mais recente
  • 📦 Você vai abrir/atualizar um Merge Request no GitLab

🛠️ Passo a passo (comandos Git)

1) Verifique seu estado atual 🧩
git status
⚠️ Se tiver alterações não commitadas:
  • ✅ Recomendado: faça commit (mesmo WIP)
  • 🧳 Alternativa: use stash
git add .
git commit -m "WIP: salvando trabalho"
git stash -u
2) Atualize o main local ⬇️
git fetch origin
git checkout main
git pull origin main
3) Volte para seu branch e faça merge do main 🔀
git checkout feature/seu-branch
git merge main
4) Resolva conflitos (se aparecerem) 🧯

Se o Git parar e indicar conflitos:

  1. 🔎 Abra os arquivos marcados como conflito
  2. ✍️ Escolha o conteúdo correto e remova os marcadores <<<<<<< / ======= / >>>>>>>
  3. ✅ Marque como resolvido e finalize
git add .
git commit -m "Merge main no meu branch"
5) Envie seu branch atualizado para o GitLab 🚀
git push
💡 Dica esperta: depois do merge, rode seus testes/local server antes do MR:
python manage.py test
# ou seu comando de testes/lint

✅ Vantagens vs ⚠️ Desvantagens

📌 Comparativo rápido

✅ Vantagens

  • 🧾 Histórico preservado (sem reescrever commits)
  • 🤝 Menos risco em equipe
  • 🚫 Não precisa push --force

⚠️ Desvantagens

  • 🌀 Pode criar commits de merge extras
  • 📚 Histórico pode ficar menos “linear”

🧷 FAQ rápido

❓ “Eu preciso fazer isso sempre?”
Não sempre — mas é recomendado antes de abrir/atualizar MR ou quando o main mudou bastante.

❓ “E se eu não quiser mexer agora?”
Você pode continuar no seu branch, mas o ideal é integrar o main cedo para evitar conflitos maiores depois.

✅ TL;DR (roteiro rápido)
git fetch origin
git checkout maingit pull origin main
git checkout feature/seu-branchgit merge main
git push

✍️ Post prático para equipes: Merge do main no branch sem reescrever histórico (ideal quando você não quer usar rebase/force push).




quarta-feira, janeiro 21, 2026

Git + GitLab na prática: criar branch, enviar, abrir MR, dar merge e limpar branch

🚀 Git + GitLab na prática: branch, merge e limpeza sem dor de cabeça

Este guia é um passo a passo direto ao ponto para o fluxo mais comum no Git/GitLab:

  • 🌱 Criar um novo branch
  • 📤 Enviar para o GitLab e fazer merge com main
  • 🧹 Voltar para o branch principal e apagar o branch local

✅ Pré-check (altamente recomendado)

Antes de qualquer coisa, confira em qual branch você está:

git branch

Atualize seu main local antes de criar novos branches:

git checkout main
git pull origin main

🌱 1) Como criar um novo branch

Opção A (recomendada)

Crie o branch sempre a partir do main atualizado:

git checkout main
git pull origin main
git checkout -b feature/nome-da-feature

📌 Exemplo real:

git checkout -b feature/projetos

Opção B (Git moderno)

git switch main
git pull origin main
git switch -c feature/projetos

📤 2) Já fiz commit. Como enviar para o GitLab e fazer merge?

2.1 Enviar o branch para o remoto

Primeiro push do branch:

git push -u origin feature/projetos

Pushs seguintes:

git push

2.2 Criar o Merge Request no GitLab

  1. 🌐 Abra o repositório no GitLab
  2. 🔀 Vá em Merge Requests → New merge request
  3. Selecione:
    • Source: feature/projetos
    • Target: main
  4. ✅ Crie o MR e clique em Merge quando estiver pronto

⚠️ Boa prática antes do merge

Traga o main mais recente para dentro do seu branch:

git fetch origin
git checkout feature/projetos
git merge origin/main
git add .
git commit
git push

💡 Algumas equipes preferem rebase. Se for o seu caso:

git fetch origin
git checkout feature/projetos
git rebase origin/main
git push --force-with-lease

🧹 3) Voltar para o main e apagar o branch local

3.1 Voltar para o branch principal

git checkout main
git pull origin main

3.2 Apagar o branch local após o merge

Forma segura (recomendada):

git branch -d feature/projetos

⚠️ Se o Git reclamar que não está mergeado:

git pull origin main
git branch -d feature/projetos

🔥 Forçar exclusão (use só se tiver certeza):

git branch -D feature/projetos

3.3 Limpar referências de branches remotos

git fetch --prune

📌 Checklist final (salva-vidas)

# criar branch
git checkout main
git pull origin main
git checkout -b feature/projetos

# trabalhar, commitar, enviar
git add .
git commit -m "feat: projetos"
git push -u origin feature/projetos

# (GitLab) abrir MR → merge

# voltar ao main e limpar branch
git checkout main
git pull origin main
git branch -d feature/projetos
git fetch --prune

✅ Pronto! Fluxo limpo, previsível e profissional.

PostgreSQL e IDENTITY: por que a sequência “desalinha” e como corrigir



Se você usa PostgreSQL, provavelmente já viu (ou vai ver) um erro como:

ERROR: duplicate key value violates unique constraint
DETAIL: Key (id)=(2) already exists.

Esse erro costuma aparecer quando uma coluna IDENTITY (ou SERIAL) está tentando gerar um ID que já existe na tabela. Na prática, isso significa que a sequência interna do PostgreSQL ficou desalinhada com os dados.

Neste artigo você vai entender:

  • o que é a sequência interna (sequence) do IDENTITY
  • por que ela pode “perder o valor correto”
  • como diagnosticar o problema
  • como ajustar a sequência com segurança

1) O que é IDENTITY no PostgreSQL?

Uma coluna definida como GENERATED ... AS IDENTITY gera valores automaticamente usando uma sequence (sequência) por trás.

Exemplo:

CREATE TABLE exemplo (
  id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  nome text NOT NULL
);

O PostgreSQL cria uma sequence interna (com um nome próprio) e passa a usar algo como:

nextval('nome_da_sequence')

para gerar IDs automaticamente.


2) Por que a sequência pode “desalinhar”?

O ponto mais importante é este:

A sequence é independente da tabela. Ela não “olha” os dados para decidir o próximo número.

Ou seja: a tabela pode ter ID 1000, mas se a sequence ainda estiver em 10, o próximo insert automático pode tentar gerar 11, 12... e em algum momento pode gerar um valor que já existe, causando erro.

Motivos comuns (na prática)

  • Importação/carga de dados inserindo IDs manualmente (ex.: INSERT com id=1000)
  • Restore de backup onde os dados voltam, mas a sequence não é ajustada
  • Scripts de migração ou manutenção que inserem IDs explicitamente
  • TRUNCATE/DELETE (a tabela muda, mas a sequence mantém o valor antigo)
  • Testes/seed com dados fixos e IDs definidos “na mão”

3) Como diagnosticar se a sequence está errada

O diagnóstico clássico compara:

  • maior ID da tabela vs
  • valor atual da sequence

3.1 Descobrir o nome da sequence associada ao IDENTITY

SELECT pg_get_serial_sequence('schema.tabela', 'coluna_id');

Exemplo:

SELECT pg_get_serial_sequence('public.exemplo', 'id');

O retorno será o nome da sequence (por exemplo public.exemplo_id_seq).

3.2 Ver o maior ID existente na tabela

SELECT MAX(id) FROM public.exemplo;

3.3 Ver o valor atual da sequence

SELECT last_value FROM public.exemplo_id_seq;

Se last_value for menor que o MAX(id), você tem um desalinhamento.


4) Como ajustar a sequência do IDENTITY (forma segura)

A correção consiste em configurar a sequence para continuar a partir do maior ID existente.

4.1 Ajuste automático usando o máximo da tabela

SELECT setval(
  pg_get_serial_sequence('schema.tabela', 'coluna_id'),
  (SELECT COALESCE(MAX(coluna_id), 1) FROM schema.tabela)
);

Exemplo completo:

SELECT setval(
  pg_get_serial_sequence('public.exemplo', 'id'),
  (SELECT COALESCE(MAX(id), 1) FROM public.exemplo)
);

Após isso, o próximo INSERT automático usará MAX(id) + 1.


5) Caso especial: tabela vazia

Se a tabela estiver vazia e você quiser reiniciar a contagem, use o terceiro parâmetro do setval:

SELECT setval(
  pg_get_serial_sequence('public.exemplo', 'id'),
  1,
  false
);

O false indica que o próximo valor gerado será exatamente 1.


6) Por que “buracos” em IDs são normais

Um detalhe que muita gente estranha:

Sequences não fazem rollback. Elas avançam mesmo se a transação falhar.

Exemplo:

BEGIN;
INSERT INTO public.exemplo (nome) VALUES ('Teste');
ROLLBACK;

Mesmo com rollback, a sequence pode ter incrementado. Isso gera “buracos” nos IDs, e isso é esperado. IDs não devem ser usados como números contábeis ou sequenciais perfeitos.


7) Boas práticas para evitar o problema

  • Evite inserir IDs manualmente. Se precisar, ajuste a sequence depois.
  • Após restore/importações, sempre valide MAX(id) vs sequence.
  • Crie um checklist pós-deploy para checar sequences.
  • Em migrações, prefira inserir sem ID e deixar o banco gerar.

Conclusão

Quando o PostgreSQL “tenta repetir um ID”, quase sempre o problema é a sequence interna do IDENTITY que ficou atrás do maior valor real da tabela.

A correção é simples e segura usando setval alinhado ao MAX(id). Com isso, você evita erros de chave duplicada e mantém o banco saudável mesmo após importações ou restores.

Se você quiser, eu posso publicar uma versão complementar mostrando:

  • como resetar sequences em lote para um schema inteiro
  • como fazer isso no contexto do Django (sqlsequencereset)
  • como automatizar validação pós-deploy

Tabelas Padrão do Django: Autenticação, Permissões e Infraestrutura

 


Entendendo as Tabelas Padrão do Django: Autenticação, Permissões e Infraestrutura

Quando iniciamos um projeto com Django, várias tabelas são criadas automaticamente no banco de dados. Para quem olha pela primeira vez, nomes como auth_group, django_content_type ou django_migrations podem parecer confusos.

Este artigo explica para que serve cada uma dessas tabelas, como elas se relacionam e quando você deve (ou não) interagir com elas.

Atenção: a maioria dessas tabelas faz parte da infraestrutura do framework. Elas não são tabelas de negócio.


Visão geral

As tabelas padrão do Django podem ser agrupadas em quatro grandes áreas:

  1. Autenticação (quem é o usuário)
  2. Autorização (o que o usuário pode fazer)
  3. Infraestrutura interna do framework
  4. Sessão e estado

1. Tabelas de Autenticação

auth_user

É a tabela central de usuários autenticáveis do Django.

Ela armazena informações como:

  • nome de usuário
  • senha (sempre em hash)
  • e-mail
  • flags de acesso (is_active, is_staff, is_superuser)
  • datas de login e criação

Essa tabela é usada pelo sistema de login, logout e controle de acesso.

Boa prática: use auth_user para autenticação, não como entidade de negócio (ex.: funcionário, cliente, aluno).


2. Tabelas de Autorização (Permissões)

auth_permission

Armazena permissões individuais do sistema.

Para cada model Django, o framework cria automaticamente permissões padrão, como:

  • adicionar
  • alterar
  • excluir
  • visualizar

Essas permissões são usadas para controlar o acesso a funcionalidades específicas.

auth_group

Representa grupos de usuários.

Um grupo é basicamente um conjunto de permissões que pode ser atribuído a vários usuários.

Exemplos de grupos comuns:

  • Administradores
  • Editores
  • Leitores

auth_group_permissions

Tabela associativa entre:

  • grupos
  • permissões

Define quais permissões cada grupo possui.

É aqui que o Django resolve a pergunta:

“O que usuários deste grupo podem fazer?”

auth_user_groups

Tabela associativa entre:

  • usuários
  • grupos

Define a quais grupos cada usuário pertence.

Um usuário pode estar em vários grupos ao mesmo tempo.

auth_user_user_permissions

Tabela associativa entre:

  • usuários
  • permissões individuais

Permite conceder permissões diretamente a um usuário, sem passar por grupos.

Boa prática: usar grupos sempre que possível e evitar permissões diretas, pois elas dificultam a manutenção.


3. Tabelas de Infraestrutura do Django

django_content_type

Registra todos os models instalados no projeto.

Cada registro identifica:

  • o app
  • o nome do model

Essa tabela é usada internamente pelo Django para:

  • sistema de permissões
  • Django Admin
  • relacionamentos genéricos
  • logs

Ela é fundamental para o funcionamento interno do framework.

django_admin_log

Armazena logs de ações realizadas no Django Admin.

Registra informações como:

  • qual usuário realizou a ação
  • qual objeto foi afetado
  • qual operação foi executada (criação, alteração, exclusão)

É muito útil para auditoria administrativa.

django_migrations

Controla quais migrações já foram aplicadas no banco de dados.

Cada vez que você executa python manage.py migrate, o Django consulta essa tabela para saber:

  • quais migrações já rodaram
  • quais ainda precisam ser aplicadas

Importante: nunca edite ou apague registros dessa tabela manualmente.


4. Tabela de Sessão

django_session

Armazena as sessões ativas dos usuários.

É usada para:

  • manter usuários logados
  • armazenar dados temporários
  • mensagens flash
  • estados intermediários de formulários

As sessões têm prazo de validade e podem ser limpas automaticamente.


Resumo rápido

Tabela Finalidade
auth_userUsuários do sistema
auth_groupGrupos / perfis
auth_permissionPermissões
auth_group_permissionsGrupo ↔ Permissão
auth_user_groupsUsuário ↔ Grupo
auth_user_user_permissionsPermissões diretas
django_content_typeRegistro de models
django_admin_logLog do admin
django_migrationsControle de migrations
django_sessionSessões

Boas práticas gerais

  • Não manipule essas tabelas diretamente via SQL.
  • Use sempre a API do Django (models, admin, permissions).
  • Centralize permissões em grupos.
  • Use auth_user apenas para autenticação.
  • Separe entidades de negócio em tabelas próprias.

Conclusão

As tabelas padrão do Django formam a base de segurança e funcionamento do framework. Entendê-las ajuda a:

  • modelar sistemas mais seguros
  • evitar erros em produção
  • criar arquiteturas mais limpas e escaláveis

Mesmo que você nunca precise mexer nelas diretamente, saber para que cada uma existe faz toda a diferença.

quarta-feira, dezembro 17, 2025

Como mover uma tabela de um schema para outro no PostgreSQL 📦


📦 Como mover uma tabela de um schema para outro no PostgreSQL

Organizar tabelas em schemas é uma prática essencial para manter bancos de dados grandes bem estruturados — especialmente em aplicações com múltiplos módulos, equipes ou microserviços.

Mas o que fazer quando você precisa mover uma tabela existente para outro schema? Felizmente, o PostgreSQL oferece um comando simples e poderoso para isso.

✅ Comando oficial: ALTER TABLE ... SET SCHEMA

Para mover uma tabela de um schema para outro, basta executar:

ALTER TABLE schema_atual.nome_da_tabela 
SET SCHEMA novo_schema;

📌 Exemplo prático

Mover a tabela usuarios de public para app_core:

ALTER TABLE public.usuarios
SET SCHEMA app_core;

📁 O que acontece quando você move uma tabela?

  • As constraints (PK, FK, UNIQUE) vão junto automaticamente ✔️
  • As foreign keys continuam funcionando ✔️
  • Views e funções que referem o schema antigo podem parar de funcionar ⚠️
  • Triggers, policies e permissões seguem anexadas à tabela ✔️

Ou seja: o PostgreSQL move toda a estrutura interna de forma segura, mas você precisa revisar apenas objetos que usam o nome qualificado do schema.


🔎 Verificando dependências antes de mover

Quer saber onde a tabela está sendo usada?

SELECT *
FROM pg_depend d
JOIN pg_class c ON d.refobjid = c.oid
WHERE c.relname = 'usuarios';

Isso ajuda a identificar views, funções ou objetos que referenciam a tabela.


🚚 Mover todas as tabelas de um schema automaticamente

Se você precisa mover várias tabelas de uma vez, use o bloco DO abaixo:

DO $$
DECLARE r RECORD;
BEGIN
  FOR r IN
    SELECT tablename
    FROM pg_tables
    WHERE schemaname = 'public'
  LOOP
    EXECUTE format('ALTER TABLE public.%I SET SCHEMA app_core;', r.tablename);
  END LOOP;
END$$;

Simples e eficiente para reorganizar um banco inteiro.


🏗️ Quando faz sentido mover tabelas para outro schema?

  • Separar tabelas internas das tabelas da aplicação
  • Organizar módulos diferentes (ex.: financeiro, usuarios, core)
  • Melhorar segurança com permissões por schema
  • Evitar poluição do schema public

Criar schemas bem definidos melhora a manutenção, a governança de dados e a colaboração entre equipes de desenvolvimento.


🎯 Conclusão

Mover tabelas entre schemas no PostgreSQL é simples com ALTER TABLE ... SET SCHEMA, e essa prática ajuda a manter sua estrutura de banco de dados limpa, organizada e modular.

Se você utiliza Django, Supabase ou microserviços, separar suas tabelas em schemas diferentes pode ser um grande avanço na arquitetura do projeto.

Gostou do conteúdo? Compartilhe com outros desenvolvedores! 🚀

📦 PostgreSQL: Movendo Tabelas Entre Schemas

1️⃣ Comando Principal

ALTER TABLE schema_atual.tabela
SET SCHEMA novo_schema;
  

✔ Simples, rápido e seguro.
✔ Move a tabela inteira, incluindo PK, FK, UNIQUE e índices.


2️⃣ O que Acontece ao Mover?

  • 🔗 FKs, PKs e UNIQUE vão junto automaticamente.
  • 🏷 Views e funções que referem o schema antigo podem precisar de ajuste.
  • ⚙ Permissões e triggers permanecem funcionando.

3️⃣ Verificar Dependências Antes

SELECT *
FROM pg_depend d
JOIN pg_class c ON d.refobjid = c.oid
WHERE c.relname = 'nome_da_tabela';
  

🔍 Útil para localizar views, triggers e funções dependentes.


4️⃣ Mover Todas as Tabelas de um Schema

DO $$
DECLARE r RECORD;
BEGIN
  FOR r IN
    SELECT tablename
    FROM pg_tables
    WHERE schemaname = 'public'
  LOOP
    EXECUTE format('ALTER TABLE public.%I SET SCHEMA app_core;', r.tablename);
  END LOOP;
END$$;
  

🚚 Excelente para reorganizar o banco inteiro.


5️⃣ Quando Usar Schemas Separados?

  • 📁 Separar tabelas internas e tabelas de aplicação.
  • 🧩 Organizar módulos (financeiro, usuários, core etc.).
  • 🔐 Melhorar segurança com permissões por schema.
  • 🧹 Evitar poluição do schema public.

🎯 Dica Final

Use schemas para modularidade, segurança e organização do banco.
Mover tabelas é seguro e simples com SET SCHEMA.




terça-feira, dezembro 09, 2025

Git: Comandos para Desfazer e Deletar

 




Se você trabalha com programação, cedo ou tarde vai precisar dominar os comandos essenciais do Git. Neste guia prático, você vai aprender de forma simples como apagar branches, desfazer commits, criar novos branches e trabalhar corretamente com o GitLab.


✅ Como Apagar um Branch com Segurança

⚠️ Erro comum: não é possível apagar o branch que está em uso no momento. O Git protege você contra isso.

1️⃣ Volte para o branch principal

git checkout main

2️⃣ Apague o branch local

git branch -D nome_do_branch

3️⃣ (Opcional) Apague o branch remoto no GitLab

git push origin --delete nome_do_branch

✅ 4 Maneiras de Desfazer um Commit

🔹 1. Corrigir mensagem ou incluir arquivo (mantém alterações)

git reset --soft HEAD~1

Desfaz o commit, mas mantém os arquivos no estado de modificação.

🔹 2. Descartar completamente o último commit

git reset --hard HEAD~1

⚠️ Apaga tudo permanentemente.

🔹 3. Desfazer um commit que já foi enviado (push)

git revert HEAD

Cria um novo commit que desfaz o anterior (modo mais seguro).

🔹 4. Apagar commit até no repositório remoto (perigoso)

git reset --hard HEAD~1
git push origin main --force

✅ Ciclo de Vida de um Branch no GitLab

🚀 1. Enviar (push) seu novo branch

git push -u origin nome_do_branch

🗑️ 2. Apagar a cópia local após o merge

git branch -d nome_do_branch

🌐 3. Apagar o branch remoto

git push origin --delete nome_do_branch

💡 Dica Pro: ao criar um Merge Request (MR) no GitLab, marque a opção “Delete source branch after merge” para apagar automaticamente.


✅ Como Criar um Novo Branch para uma Nova Funcionalidade

1️⃣ Vá para a branch principal e atualize

git checkout main
git pull origin main

2️⃣ Crie e já entre no novo branch

git checkout -b feature/nova-funcionalidade

3️⃣ Envie para o GitLab

git push -u origin feature/nova-funcionalidade

✅ Como Renomear um Branch

Se estiver no próprio branch:

git branch -m novo_nome

Se for outro branch:

git branch -m nome_antigo novo_nome

Atualizar no GitLab:

git push -u origin novo_nome
git push origin --delete nome_antigo

✅ Resumo Rápido dos Comandos Essenciais

  • Criar branch: git checkout -b feature/minha-feature
  • Enviar branch: git push -u origin minha-feature
  • Apagar branch local: git branch -d minha-feature
  • Apagar branch remoto: git push origin --delete minha-feature
  • Desfazer commit mantendo arquivos: git reset --soft HEAD~1
  • Desfazer commit apagando tudo: git reset --hard HEAD~1
  • Desfazer commit já enviado: git revert HEAD

🎯 Conclusão

Dominar esses comandos do Git e o fluxo com GitLab é essencial para trabalhar com qualidade, segurança e produtividade. Com esse guia, você evita erros comuns, mantém seu repositório limpo e trabalha alinhado com boas práticas profissionais.

🚀 Bons commits!






Busca do Google

Custom Search