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.









Busca do Google

Custom Search