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.






Busca do Google

Custom Search