anúncios

quinta-feira, 16 de abril de 2026

A era da IA Generativa: Ainda vale a pena aprender a programar?

Se você está começando agora na área de tecnologia ou já atua como desenvolvedor Júnior, provavelmente já se deparou com a pergunta: "Por que gastar meses estudando lógica, sintaxe e estruturas de dados se o ChatGPT, Gemini, Claude Code, ou GitHub Copilot escrevem o código em segundos?"

Antes de aprofundarmos, é preciso fazer uma distinção técnica fundamental: quando falamos popularmente em "IA", estamos simplificando um campo vasto da Ciência da Computação. O que utilizamos hoje para gerar código são, na verdade, Agentes de IA baseados em LLMs (Large Language Models - Grandes Modelos de Linguagem). Ferramentas como ChatGPT, Claude, Gemini e GitHub Copilot não "pensam" no sentido humano; elas são modelos probabilísticos altamente sofisticados que preveem o próximo token de código com base em padrões de bilhões de linhas de dados.

A sensação para muitos iniciantes é de que a barra de entrada subiu ou que a profissão está desaparecendo. No entanto, a realidade é oposta: nunca houve um momento tão estratégico para aprender a programar, desde que você entenda a diferença entre escrever código e engenharia de software.

1. O Código como Commodity: A Mudança de Paradigma

Para entender por que a programação ainda é essencial, precisamos primeiro aceitar que o "código" em si tornou-se uma commodity. No mercado de TI, uma commodity é algo que pode ser produzido em massa e tem pouco valor agregado se não houver um diferencial competitivo.

Para o cliente final ou para o dono de uma empresa, o código é apenas o meio para atingir um fim. O cliente não compra "um sistema em Java com Spring Boot", ele compra a solução para um problema de negócio (ex: "preciso que meu estoque seja atualizado em tempo real").

Os agentes de LLM são excelentes em gerar a sintaxe (o "como"), mas eles não possuem visão de negócio nem consciência do contexto organizacional (o "o quê" e o "porquê"). O desenvolvedor que foca apenas na sintaxe será substituído; o desenvolvedor que foca na resolução de problemas usando a tecnologia como ferramenta será promovido.

2. A Armadilha da "Ilusão de Competência"

Um dos maiores riscos para os estagiários e juniores hoje é a ilusão de competência. Isso acontece quando um estudante pede para um agente de IA gerar uma função complexa, o código funciona de primeira e ele assume que "sabe" como aquilo funciona.

O problema surge no momento do debug. Quando o código do LLM falha, e ele falha frequentemente em casos de borda (edge cases) — quem não domina os fundamentos não consegue rastrear o erro. Sem a base, você não é o piloto da IA, você é apenas um passageiro que espera que a máquina não bata.

A diferença entre Operador de Prompt e Engenheiro de Software

Critério Operador de Prompt (Dependente) Engenheiro de Software (Autônomo)
Abordagem Tenta a sorte com prompts até o código "funcionar". Planeja a arquitetura e usa a IA para implementar partes.
Validação Executa o código e, se não deu erro, assume que está correto. Analisa a complexidade temporal, espacial e a segurança.
Manutenção Dificuldade em alterar o código sem quebrar outras partes. Aplica princípios de SOLID e Design Patterns para escalabilidade.
Resolução de Bugs Copia o erro no prompt e reza para a IA corrigir. Usa debuggers, logs e conhecimento de memória/stack para resolver.

3. Os Pilares Inegociáveis: O que você DEVE aprender

Se os agentes de LLM geram o código, onde você deve focar seus estudos? A resposta é: nos fundamentos que a IA não consegue simular com consciência.

  1. Lógica de Programação e Algoritmos: Você precisa entender como os dados fluem. Se você não sabe a diferença entre um Array e uma LinkedList, você não saberá pedir ao LLM a estrutura mais eficiente para o seu caso.
  2. Estruturas de Dados: Saber quando usar um HashMap em vez de percorrer uma lista com um loop for é a diferença entre um sistema que escala e um sistema que trava.
  3. Engenharia de Software:
    • SOLID: Para garantir que o código gerado pela IA não seja um "monolito" impossível de manter.
    • Design Patterns: Saber implementar um Observer ou um Factory para organizar a comunicação entre objetos.
    • Testes Automatizados: O LLM pode gerar o código, mas você deve escrever os testes unitários e de integração para provar que o código é confiável.
  4. Arquitetura de Sistemas: Entender a diferença entre Monólitos, Microsserviços e Serverless. O agente de IA pode escrever a função, mas ele não desenha a topologia da rede ou a estratégia de cache do Redis.

4. O Agente de IA como o "Novo Compilador"

Historicamente, a programação sempre evoluiu para abstrações maiores. Antigamente, programava-se em binário, depois Assembly, depois C, depois linguagens de alto nível como Java e Python.

O uso de LLMs é apenas a próxima camada de abstração. Eles não substituem o programador, eles substituem a digitação manual de códigos repetitivos (boilerplate).


// Exemplo de código commodity 
// (Agente de LLM faz em 1 segundo):
public class User {
    private String name;
    private String email;
    // Getters e Setters repetitivos...
}

O valor real não está em escrever a classe acima, mas em decidir se esse User deve ser persistido em um banco NoSQL para performance de leitura ou em um Relacional para consistência ACID.

5. Considerações finais: O Futuro do Desenvolvedor

A pergunta "Ainda vale a pena aprender a programar?" deve ser substituída por: "Como posso me tornar um desenvolvedor que domina as ferramentas de LLM, em vez de ser dominado por elas?"

A responsabilidade final pelo software continua sendo do ser humano. Se o sistema de um banco falha ou se os dados de um hospital são vazados, a culpa não é do modelo de linguagem que gerou o snippet de código, mas do engenheiro que validou e implementou aquele código sem a devida análise crítica.

Portanto, para os estagiários e juniores: estudem a base. Aprendam a ler código. Questionem cada linha que a IA gera. Transformem-se em arquitetos de soluções. O código é a ferramenta, mas a engenharia é a arte. E a arte, por enquanto, continua sendo humana.

Feito!

quarta-feira, 15 de abril de 2026

Como encontrar e remover arquivos duplicados com essa ferramenta

Você já ficou sem espaço no disco e suspeitou que tinha arquivos duplicados ocupando espaço desnecessário? O fdupes é a ferramenta perfeita para resolver esse problema!

O que é o fdupes?

O fdupes é um programa de linha de comando que identifica arquivos duplicados em um ou mais diretórios. Ele usa uma combinação intelligente de tamanho de arquivo e hash MD5/SHA1 para encontrar duplicatas de forma eficiente, sem precisar comparar byte a byte.

Instalação

Debian/Ubuntu

sudo apt install fdupes

Fedora

sudo dnf install fdupes

Arch Linux

sudo pacman -S fdupes

macOS (via Homebrew)

brew install fdupes

Como usar

Exemplo básico: encontrar duplicatas

fdupes ~/Downloads

Saída esperada:

./Downloads/documento.txt
./Downloads/documento-copia.txt

Ver detalhes dos arquivos duplicados

fdupes -l ~/Downloads

Saída com tamanho:

   1024 ./Downloads/documento.txt
   1024 ./Downloads/documento-copia.txt

Procura recursiva em subdiretórios

fdupes -r ~/Documentos

Primeira opção é a original (mantém primeiro)

fdupes -d ~/Downloads

O fdupes vai pedir confirmação para manter ou excluir cada conjunto de duplicatas.

Opções mais úteis

Lista de opções disponíveis fdupes
Opção Descrição
-r, --recurse Procura recursivamente nos diretórios
-l Lista apenas com detalhes de tamanho
-S, --size Mostra tamanho dos arquivos duplicados
-m, --summarize Mostra estatísticas resumidas
-d, --delete Deleta duplicatas (cuidado!)
-N, --noprompt Com -d, deleta sem pedir confirmação
-f, --omitfirst O primeiro arquivo do grupo é considerado original
-n, --noempty Ignora arquivos vazios
-H, --hardlinks Trata hard links como duplicatas
-q, --quiet Modo silencioso
-1, --sameline Lista em uma única linha
-h Mostra ajuda

Dicas de uso

Encontrar e listar sem deletar (modo seguro)

fdupes -rl ~/Downloads | less

Exemplo prático completo

1. Primeiro, descubra onde estão as duplicatas

fdupes -r ~/Downloads

2. Liste os detalhes para ver quanto espaço pode liberar

fdupes -rl ~/Downloads

3. Crie uma pasta para backups antes de excluir

mkdir ~/duplicadas_backup

4. Copie as duplicatas para a pasta de backup

fdupes -r ~/Downloads -d ~/duplicadas_backup

5. Confirme que as cópias estão na pasta de backup

ls ~/duplicadas_backup

Por que usar fdupes?

  • Economia de espaço: Arquivos duplicados podem consumir gigabytes
  • Organização: Ajuda a limpar projetos e pastas bagunçadas
  • Identificação de projetos duplicados: Encontra projetos/clones repetidos
  • Limpeza de backup: Remove cópias desnecessárias

Cuidado!

  • Sempre use -l primeiro para listar sem alterar nada
  • Faça backup antes de deletar com -d
  • O fdupes pode não funcionar bem com links simbólicos
  • Arquivos com metadados diferentes mas conteúdo igual são considerados duplicatas

Referência

fdupes man page - Linux Command Library

Feito!

terça-feira, 14 de abril de 2026

MUDANÇA NO CNPJ: O que você precisa fazer no seu projeto

A Receita Federal confirmou: a partir de julho de 2026, o CNPJ será alfanumérico (com letras e números). Novo formato: 14 caracteres sendo 12 primeiros alfanuméricos + 2 dígitos verificadores (DV) numéricos.

Isso vai quebrar muitos sistemas. Vamos aos impactos:

1. CNPJ como Integer no banco de dados

Problema: CNPJs novos terão letras (ex: 12AB3456C0001). Tipo INTEGER não suporta letras.

Solução: Migrar coluna para VARCHAR(18) ou CHAR(14), mantenham o tamanho fixo para compatibilidade com sistemas legados.

2. CNPJ como Primary Key

Problema: PKs inteiras não funcionam + índices unique baseados em Integer falharão para novos registros.

Solução:

  • Alterar tipo da PK para VARCHAR(18) ou CHAR(14)
  • Atualizar foreign keys em todas as tabelas relacionadas
  • Regenerar índices unique

3. Validação de DV (Módulo 11)

Problema: Algoritmo atual não reconhece letras.

Solução: Ver algoritmo em pseudocódigo abaixo.

4. Máscaras e formats existentes

Problema: XX.XXX.XXX/0001-XX pode não funcionar com letras.

Solução: Criar máscara flexível que aceite alfanumérico.

5. Integração com APIs e ERPs

Problema: Sistemas legados que recebem CNPJ como número quebrarão.

Solução: Revisar APIs, contratos, e integrações -> tipar como string, não integer.

Cronograma

  • Julho 2026: Primeiros CNPJs alfanuméricos emitidos
  • CNPJs atuais: Permanecem válidos (não precisam migrar)

Ação imediata

  • ✓ Audit no banco: identifique colunas CNPJ com tipo Integer
  • ✓ Planeje migração para VARCHAR/CHAR
  • ✓ Teste o novo algoritmo de validação
  • ✓ Revise integrações externas

Algoritmo de Validação do DV (Módulo 11)

O algoritmo a seguir funciona para CNPJs numéricos (atuais) e CNPJs alfanuméricos (novos).

Tabela de Conversão

Caractere Valor para cálculo
0-9 0-9 (valor numérico)
A 17
B 18
C 19
D 20
E 21
F 22
G 23
H 24
I 25
J 26
K 27
L 28
M 29
N 30
O 31
P 32
Q 33
R 34
S 35
T 36
U 37
V 38
W 39
X 40
Y 41
Z 42

Pseudocódigo

FUNÇÃO obterValorCaractere(caractere):
    SE caractere >= '0' E caractere <= '9':
        RETORNAR inteiro(caractere)
    FIM SE
    
    SE caractere >= 'A' E caractere <= 'Z':
        codigoASCII <- inteiro(caractere)
        RETORNAR codigoASCII - 48
    FIM SE
    
    RETORNAR -1  // Caractere inválido
FIM FUNÇÃO


FUNÇÃO calcularDV(cnpj, posicaoDV):
    // posicaoDV = 1 para primeiro DV, 2 para segundo DV
    
    SE posicaoDV == 1://Primeiros 12 caracteres do CNPJ
        pesos <- [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
        digitos <
    SENÃO://Primeiros 12 caracteres do CNPJ + primeiro DV
        pesos <- [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
        digitos <
    FIM SE
    
    soma <- 0
    PARA i DE 0 ATÉ comprimento(digitos) - 1:
        valor <- obterValorCaractere(digitos[i])
        soma <- soma + (valor * pesos[i])
    FIM PARA
    
    resto <- soma MOD 11
    
    SE resto <= 1:
        DV <- 0
    SENÃO:
        DV <- 11 - resto
    FIM SE
    
    RETORNAR DV
FIM FUNÇÃO


FUNÇÃO validarCNPJ(cnpj):
    // Remove máscara (pontos, barras, hífen)
    cnpjLimpo <- limparMascara(cnpj)
    
    SE comprimento(cnpjLimpo) != 14:
        RETORNAR FALSO
    FIM SE
    
    // Extrai os DVs informados no CNPJ
    dv1Informado <- inteiro(cnpjLimpo[12])
    dv2Informado <- inteiro(cnpjLimpo[13])
    
    // Calcula primeiro DV
    dv1Calculado <- calcularDV(cnpjLimpo, 1)
    
    SE dv1Informado != dv1Calculado:
        RETORNAR FALSO
    FIM SE
    
    // Calcula segundo DV
    dv2Calculado <- calcularDV(cnpjLimpo, 2)
    
    SE dv2Informado != dv2Calculado:
        RETORNAR FALSO
    FIM SE
    
    RETORNAR VERDADEIRO
FIM FUNÇÃO

Exemplo de Implementação em JavaScript

function obterValorCaractere(char) {
    if (char >= '0' && char <= '9') {
        return parseInt(char, 10);
    }
    const codigoASCII = char.charCodeAt(0);
    if (codigoASCII >= 65 && codigoASCII <= 90) {
        return codigoASCII - 48;
    }
    return -1;
}

function calcularDV(cnpj, posicaoDV) {
    const pesos = posicaoDV === 1 
        ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
        : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
    
    const digitos = posicaoDV === 1 
        ? cnpj.substring(0, 12) 
        : cnpj.substring(0, 12) + cnpj.charAt(12);
    
    let soma = 0;
    for (let i = 0; i < digitos.length; i++) {
        const valor = obterValorCaractere(digitos[i]);
        soma += valor * pesos[i];
    }
    
    const resto = soma % 11;
    return resto <= 1 ? 0 : 11 - resto;
}

function validarCNPJ(cnpj) {
    const cnpjLimpo = cnpj.replace(/[.\/-]/g, '');
    
    if (cnpjLimpo.length !== 14) {
        return false;
    }
    
    const dv1 = parseInt(cnpjLimpo[12], 10);
    const dv2 = parseInt(cnpjLimpo[13], 10);
    
    if (calcularDV(cnpjLimpo, 1) !== dv1) {
        return false;
    }
    
    if (calcularDV(cnpjLimpo, 2) !== dv2) {
        return false;
    }
    
    return true;
}

// Testes
// true (CNPJ atual válido)
console.log(validarCNPJ('83.847.133/0001-25')); 

// true (CNPJ novo fictício válido)
console.log(validarCNPJ('53.RRV.R8C/9PHH-34')); 

// false
console.log(validarCNPJ('12345678900013')); 

// false
console.log(validarCNPJ('77.888.364/0001-81')); 

// false
console.log(validarCNPJ('X3.VGJ.TBC/0001-43')); 

Referências

Instrução Normativa RFB nº 2.229/2024

Nota Técnica Conjunta CNPJ Alfanumérico 2025.001

Nota Técnica Conjunta COCAD/SUARA/RFB nº 49/2024

A mudança não é complexa, mas exige atenção. Quem esperar o dia pode enfrentar problemas de última hora.

Feito!

segunda-feira, 13 de abril de 2026

Como a matemática criou a confiança digital

Se você faz um Pix, salva um arquivo na nuvem ou simplesmente faz login em uma rede social hoje, você está utilizando uma das tecnologias mais disruptivas da história da computação: o SSL/TLS.

Mas nem sempre foi assim. Em 1994, enviar o número do seu cartão de crédito pela internet era o equivalente tecnológico a gritar sua senha no meio da rua. Qualquer pessoa no caminho do pacote de dados poderia ler o conteúdo. A internet não foi desenhada para ser segura; ela foi desenhada para compartilhar pesquisas acadêmicas.

A mudança de paradigma veio com um nome: Taher Elgamal, e uma sacada matemática que transformou a confiança em equação.

O Problema da "Via Expressa Aberta"

Nos primórdios da web, o protocolo HTTP era como um cartão-postal. Cada roteador e servidor pelo qual a informação passava podia "ler o verso" do cartão. Para que o e-commerce existisse, precisávamos de um envelope blindado.

Foi na Netscape que Elgamal e sua equipe desenvolveram o SSL (Secure Socket Layer). Embora o início tenha sido conturbado (a versão 1.0 foi quebrada em minutos), a versão 2.0 lançada em 1995 mudou o mundo. Hoje, essa tecnologia evoluiu para o TLS (Transport Layer Security), que protege mais de 97% do tráfego web atual.

A magia da assimetria: O truque da tinta

O que torna o SSL/TLS tão poderoso é o conceito de funções unidirecionais. Imagine o seguinte:

Misturar tinta azul e amarela para fazer verde é trivial.

Tentar separar a tinta verde de volta em azul e amarelo é praticamente impossível.

Na criptografia, usamos a exponenciação modular e a fatoração de números primos gigantes. Multiplicar dois números primos de 300 dígitos é algo que seu celular faz em nanossegundos. No entanto, pegar o resultado dessa multiplicação e tentar descobrir quais foram os dois números primos originais é uma tarefa que levaria milhões de anos para os melhores supercomputadores do mundo.

Essa assimetria é o que permite que você e um servidor estabeleçam uma conexão segura sem nunca terem trocado uma chave secreta antes.

Por que isso importa para você leitor e Desenvolvedores em geral?

Como engenheiros de software, muitas vezes tratamos o "cadeado no navegador" como uma commodity, mas há três lições fundamentais na história de Elgamal:

  • Padrões Abertos vencem:
  • Elgamal convenceu a Netscape a tornar o SSL gratuito e aberto, inclusive para concorrentes. Sem isso, a internet teria se fragmentado em silos proprietários e inseguros.

  • Performance vs. Segurança:
  • O TLS 1.3 hoje faz o handshake de segurança em apenas uma "ida e volta" (round-trip), provando que segurança robusta não precisa sacrificar a experiência do usuário.

  • A Matemática como Base:
  • Enquanto algoritmos de recomendação ganham as manchetes, é a criptografia que sustenta os 6,4 trilhões de dólares do e-commerce global.

O Legado de Elgamal

Hoje, Taher Elgamal é reconhecido como o "Pai do SSL". Seu trabalho prova que a engenharia de contexto e a aplicação de conceitos matemáticos puros podem resolver problemas estruturais da sociedade.

Cada vez que você inicia uma transação ou protege um endpoint com HTTPS, você está executando a visão de que a privacidade não deve ser uma exceção, mas o padrão.

A segurança não é um plugin que você adiciona ao final do projeto; é o alicerce matemático que permite que o usuário confie no seu código.

Feito!

quinta-feira, 9 de abril de 2026

Dívida Cognitiva: O "Juro Invisível" que está fritando o cérebro dos desenvolvedores

A promessa era sedutora: os agentes dos provedores de LLM faria o trabalho pesado, geraria o código repetitivo e nós, desenvolvedores, teríamos mais tempo para a estratégia e a criatividade. Mas, após alguns anos de uso intenso de Copilots e agentes, a realidade bateu à porta. Não estamos trabalhando menos; estamos processando informação em uma velocidade inumana.

Esse fenômeno já tem nome: AI Brainfry. E a causa raiz é o que a pesquisadora Margaret-Anne Storey define como Dívida Cognitiva.

O que é Dívida Cognitiva?

Se a dívida técnica é o custo de atalhos tomados no código, a dívida cognitiva é o custo de atalhos tomados no nosso entendimento.

Quando você escreve cada linha de uma função, você constrói um modelo mental daquela lógica. Quando você pede para um agente de um provedor de LLM gerar 200 linhas de código e apenas "dá um joinha", você está pulando a fase de construção desse modelo. O código está lá, funciona (por enquanto), mas você não "sernente" o sistema.

"Dívida cognitiva não quebra o build, quebra a capacidade do time de pensar."

O Alerta de Margaret-Anne Storey

A professora canadense Margaret-Anne Storey observou isso na prática em suas aulas. Equipes de alunos que utilizavam um agente de IA (em algum provedor de LLM) de forma desenfreada chegavam a um ponto de paralisia total por volta da oitava semana. Eles não conseguiam fazer uma alteração simples sem quebrar o sistema. O motivo? Ninguém conseguia explicar por que o design era daquele jeito. O entendimento compartilhado havia desaparecido.

O Perigo do "Vibe Coding" e da produtividade ilusória

Estamos vivendo a era do Vibe Coding. Você abre o Cursor, orquestra três ou quatro agentes, vê o código fluindo na tela e sente que é um super-humano. Mas será que essa velocidade é real?

Estudos recentes mostram que supervisionar uma IA exige 14% mais esforço mental e causa 12% mais fadiga do que codar manualmente. Isso acontece porque o cérebro humano não é tão paralelo quanto um LLM. Tentar acompanhar múltiplos agentes gerando soluções simultâneas cria uma sobrecarga de informação que nos deixa exaustos ao final do dia, mesmo sem termos digitado uma linha de código sequer.

Insights para um Desenvolvimento Sustentável

A solução não é abandonar a IA (agentes dos provedores de LLM), o mercado mudou e não há volta. O desafio é aprender a usá-la de forma saudável e estratégica. Aqui estão alguns pontos cruciais:

  1. A IA deve ampliar o entendimento, não substituí-lo:
  2. Use a ferramenta para explicar trechos complexos, não apenas para gerá-los.

  3. O "CPF" no Pull Request é seu:
  4. Se o código foi para produção, a responsabilidade técnica e moral é do humano. Se você não consegue explicar o que o código faz, você não deveria aprová-lo.

  5. Foco na Arquitetura e Julgamento:
  6. Em um mundo onde o código é commodity, o diferencial do desenvolvedor sênior passa a ser o julgamento crítico. Saber quando dizer não a uma sugestão da IA (agente de algum provedor de LLM) é mais importante do que saber fazer o prompt.

  7. Cuidado com a métrica de tokens:
  8. Ignorar a qualidade em prol de "consumir tokens" ou "gerar volume" é o caminho mais rápido para criar um legado impossível de manter.

Considerações finais

O uso de agentes e ferramentas como o ChatGPT, Codex, Claude Code ou o Gemini não deve ser abandonado, mas sim ressignificado sob uma ótica de Engenharia de Contexto e governança técnica. Ser um profissional "AI-powered" em 2026 exige que você atue como um arquiteto e revisor crítico, e não apenas como um consumidor de código. O uso inteligente dessas ferramentas envolve utilizá-las para acelerar a implementação de padrões que você já domina, mantendo o controle total sobre a arquitetura e garantindo que cada linha gerada seja compreendida e integrada ao modelo mental do projeto. O segredo é garantir que os agentes do provedor de LLM (como Codex, Claude Code, Gemini CLI, etc) trabalhem para o sistema, e não que você se torne um refém da complexidade que eles geram.

Em vez de simplesmente delegar a autoria, o uso profissional desses agentes exige que o desenvolvedor atue como um orquestrador estratégico, utilizando-os para validar hipóteses, acelerar a escrita de especificações e implementar padrões de arquitetura sob rigorosa supervisão humana. Utilizar essas ferramentas de forma inteligente significa manter o controle do "leme" técnico, garantindo que a velocidade de entrega nunca atropele a integridade do modelo mental e a sustentabilidade do código a longo prazo.

Referência

STOREY, Margaret-Anne. The Triple Debt of AI-Assisted Software Development: Technical, Cognitive, and Cultural. arXiv:2603.22106 [cs.SE], 2026. Disponível em: https://arxiv.org/pdf/2603.22106

O que você tem sentido no seu dia a dia? A IA tem libertado sua mente ou fritado seus neurônios? Deixe seu comentário abaixo!

Feito!

quarta-feira, 8 de abril de 2026

Instalando o software IRPF 2026 no Linux

Procedimentos de instalação do software IRPF 2026 no Linux (qualquer distro)

Pré-requisitos:

Ter o openJDK 1.8 ou superior configurado no PATH do SO.

Copie a linha seguinte e cole no terminal da distribuição Linux que estiver usando ou clique no link https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/download/pgd/dirpf

Setar a permissão para execução

$ chmod +x IRPF2026Linux-x86_64v1.1.sh.bin $ ./IRPF2026Linux-x86_64v1.1.sh.bin

Na primeira tela, clique no botão "Avançar"

Clique no botão "Avançar".

O próximo passo é escolher o diretório de instalação que deseja salvar, clique em "Avançar".

Confirme a instalação no botão "Avançar".

Por fim, clique no botão "Terminar".

Pronto, a instalação do IRPF2026 está concluída, poderá abrir no atalho que foi criado na área de trabalho.

Agora, pode fazer a sua declaração do imposto de renda no Linux.

Após fazer a sua declaração e salvar o comprovante que fez a declaração do imposto de renda 2026, se quiser, pode desinstalar o software IRPF 2026.

Execute no terminal.

~/ProgramasRFB/IRPF2026/uninstall

Confirme o tipo de desinstalação (padrão ou completa), clique no botão "Avançar" e confirme.

Feito!

terça-feira, 7 de abril de 2026

Além do Hype: O guia de sobrevivência em IA para Desenvolvedores

Se você abre o LinkedIn ou o YouTube hoje, é bombardeado por siglas: NLP, LLM, RAG, MCP, Agentes. Parece que a cada 24 horas o que você aprendeu ontem se tornou obsoleto. A sensação de insegurança é real, mas aqui vai um segredo: as ferramentas mudam, mas os fundamentos são os mesmos desde a década de 50.

No presente artigo, vamos dissecar os conceitos apresentados pelo canal balta, separando o que é barulho do que é base sólida para a sua carreira.

  1. IA não é uma "Ferramenta", é uma Categoria
  2. Muitas vezes ouvimos que "o Google lançou uma nova IA". Tecnicamente, isso está errado. A Inteligência Artificial é um termo "guarda-chuva" cunhado em 1956. O que estamos vendo hoje são novos modelos e arquiteturas dentro dessa categoria.

    Entender isso acalma os nervos. Você não precisa aprender uma "nova IA" toda semana; você precisa entender como os novos modelos se comportam dentro do ecossistema que já existe.

  3. O coração do código: Redes Neurais e Probabilidade
  4. Tudo o que vemos hoje, do ChatGPT, Gemini, Claude Code e etc baseia-se em Redes Neurais Artificiais.

    O que são: Microfunções (neurônios) organizadas em camadas.

    Como funcionam: Elas não "pensam". Elas recebem um input, processam através de pesos matemáticos e entregam uma probabilidade.

    Quando você interage com um LLM (Large Language Model), ele está apenas prevendo o próximo token (pedaço de palavra). Não existe um processo criativo ou consciência; existe estatística de alto nível.

    Por isso a alucinação acontece: a função do provedor de LLM é continuar o texto, mesmo que ela precise inventar algo para que a frase faça sentido gramatical.

  5. Onde está o valor real? (Dica: não é no modelo)
  6. Qualquer pessoa com R$ 100 pode assinar o ChatGPT Plus. Se o seu diferencial como dev ou empresa for apenas "usar o provedor de LLM", você não tem diferencial.

    O verdadeiro ouro está nos dados.

    Modelos como o GPT-4, Gemini, Claude Code foram treinados com dados públicos da internet (que muitas vezes são ruidosos ou desatualizados). O valor competitivo surge quando você conecta esses modelos aos seus dados privados e estruturados.

  7. O Trio de Ferro: RAG, MCP e Agentes
  8. Para tirar o provedor de LLM do "chat" e levá-la para o mundo real, usamos três pilares:

    • RAG (Retrieval-Augmented Generation)
    • O provedor de LLM é como um gênio que leu toda a biblioteca do mundo até 2023, mas não sabe o que aconteceu hoje de manhã na sua empresa. O RAG é a técnica de "dar um livro aberto" para o provedor de LLM consultar antes de responder. Você fornece o contexto (seus PDFs, bancos de dados) e ela responde com base nisso.

    • MCP (Model Context Protocol)
    • Não basta o provedor de LLM ler; ele precisa agir. O MCP é um protocolo que padroniza como o provedor de LLM se comunica com o seu sistema. É através dele que a IA entende que pode "chamar uma função" para emitir uma nota fiscal ou consultar um estoque.

    • Agentes e Skills
    • Agentes: São programas autônomos que decidem como resolver um problema passo a passo.

      Skills: São habilidades passivas (ex: saber formatar um texto em Markdown) que os agentes utilizam para cumprir sua missão.

  9. Por que os Programadores não vão sumir?
  10. O provedor de LLM é estocástica (imprevisível). Ela pode dar uma resposta diferente para o mesmo comando. Sistemas críticos, como transferências bancárias ou diagnósticos médicos, exigem determinismo.

    A engenharia de software continua sendo sobre como construir sistemas robustos, seguros e escaláveis. A IA será uma peça desse quebra-cabeça, mas o "arquiteto" que decide onde cada peça se encaixa ainda é você.

Considerações finais

O segredo para não temer aos provedores de LLM é parar de olhar para a interface de chat e começar a olhar para a arquitetura. Entender tokens, embeddings, camadas e protocolos transforma você de um simples "usuário de ferramentas" em um engenheiro capaz de construir o futuro.

Feito!

segunda-feira, 6 de abril de 2026

O novo "Contrato" do Desenvolvedor: Por que os agentes de IA não vão salvar seu código (mas podem te tornar um Arquiteto)

A era do desenvolvimento assistido por Inteligência Artificial (IA) chegou com uma promessa tentadora: "Copie e cole sua ideia, e nós geramos o código". E, de fato, os agentes de IA dos provedores de LLM (ChatGPT/Codex da OpenAI, Claude Code da Anthropic, Gemini do Google e etc) são impressionantes. Eles escrevem funções em segundos, sugerem refatorações e explicam bugs complexos.

No entanto, há um coro crescente nos fóruns de programação: "A IA introduziu um bug sutil no meu projeto" ou "Pedi X e ela entregou Y, totalmente fora do contexto".

A verdade crua é: a responsabilidade pelo código final continua sendo, 100%, do desenvolvedor.

Os agentes de IA não são "mágicos"; eles são ferramentas de processamento de linguagem extremamente avançadas. Atribuir a culpa de um bug a um LLM é como culpar o compilador por um erro de sintaxe. O erro estava na intenção ou na instrução.

Vamos explorar o paralelo que define essa nova fase do desenvolvimento e os desafios técnicos onde os agentes de IA ainda falham terrivelmente.

O Paralelo com o PO: Prompt raso = Requisito raso

Imagine a cena (clássica para qualquer Dev): o Product Owner (PO) ou o Scrum Master (SM) chega com um requisito de uma linha: "Precisamos de um sistema de login". Você, o desenvolvedor, acena, acha que entendeu e implementa um sistema simples com email/senha. Na entrega, o PO diz: "Mas eu precisava de login social (Google/Apple) e autenticação em dois fatores (2FA)".

O resultado? Frustração e retrabalho. De quem é a culpa? Do desenvolvedor que aceitou o requisito sem questionar.

O mesmo se aplica aos agentes de IA dos provedores de LLM. Um prompt raso é um requisito raso. O agente, treinado para ser útil, vai "adivinhar" o resto do contexto com base nos seus dados de treinamento. É aqui que nascem as "alucinações": o agente cria uma solução que parece correta, mas que não se encaixa no seu ecossistema específico.

A lição: Do mesmo modo que exigimos requisitos completos do PO, devemos fornecer contextos completos (prompts detalhados) aos agentes. Se você não tirar as dúvidas antes de gerar o código, o agente vai entregar o que "acha" que você quer, não o que você precisa.

Onde os agentes de IA falham e onde você é indispensável?

Mesmo com o melhor prompt do mundo, os agentes de IA atuais têm limitações estruturais que exigem o raciocínio humano.

  1. A falta de visão sistêmica e arquitetural
  2. Os agentes de IA são excelentes em resolver o "problema da função" atual (ex: ordenar uma lista). Eles muitas vezes falham em enxergar o sistema como um todo.

    O risco: Ao pedir para alterar um módulo de pagamento para aceitar uma nova moeda, o agente pode não perceber que essa mudança quebra a conciliação financeira em um microsserviço legado do outro lado da arquitetura. Ele foca no contexto imediato (o arquivo aberto), não na integridade arquitetural a longo prazo.

  3. A "última milha" da depuração profunda (Deep Debugging)
  4. Bugs de lógica simples? Os LLMs resolvem. Mas e as condições de corrida (race conditions)? Vazamentos de memória sutis? Bugs que só ocorrem sob alta latência de rede?

    O risco: O agente trabalha com o código estático ou logs que você fornece. Ele não "sente" o ambiente de execução. Depurar um erro que só acontece quando o banco de dados está a 90% de carga e o usuário cancela a requisição no meio do handshake ainda exige o instinto detetive de um desenvolvedor experiente.

  5. Segurança e a "alucinação de pacotes"
  6. Este é um risco crescente e crítico (Supply Chain Security).

    O risco: Às vezes, o agente sugere bibliotecas ou pacotes que não existem ou, pior, que foram criados por atacantes com nomes similares (typosquatting) para injetar código malicioso. Se o desenvolvedor apenas copia e cola (npm install), ele abre uma brecha de segurança grave. A curadoria de dependências continua sendo uma tarefa estritamente humana.

  7. As regras de negócio implícitas
  8. A documentação do Jira raramente contém 100% da verdade. O conhecimento real muitas vezes está na cabeça dos desenvolvedores sêniores.

    O risco: O agente de IA pode sugerir remover um trecho de código "feio" ou "redundante" por um ( Clean Code). O que ele não sabe é que esse código trata uma exceção bizantina de um cliente que representa 40% do faturamento da empresa. A IA não conhece a história e a política por trás do código.

O Caminho: Spec-Driven Development (SDD)

Então, como usar os agentes de IA dos provedores de LLM de forma profissional? O segredo não é "pedir código", é "pedir validação".

Esta é a fronteira entre o amadorismo e o profissionalismo no uso de IA:

  • Brainstorm com o agente:
  • Use a skill de brainstorm do agente. Diga: "Tenho essa ideia de recurso. Que perguntas você me faria para garantir que entende todos os requisitos de negócio, técnicos e de segurança?".

  • Geração da Spec.md:
  • Com base nas suas respostas, peça ao agente para gerar um arquivo Spec.md (Especificação Técnica) detalhando a implementação.

  • Validação Humana (SEU PAPEL):
  • Leia a especificação. É o que o negócio precisa? Segue a arquitetura? É seguro? Valide a Spec.

  • Geração do Código:
  • Só depois de validar a Spec, peça para o agente gerar o código com base nela.

É mais barato corrigir um parágrafo de texto do que 500 linhas de código em alguma linguagem de programação.

Considerações finais

O desenvolvimento de software não mudou fundamentalmente; as ferramentas mudaram. O maior desafio hoje não é escrever código, mas sim saber o que pedir e garantir que o que foi entregue é o que o negócio precisa.

O desenvolvedor deixou de ser apenas um construtor de tijolos para ser o arquiteto que revisa cada viga da obra. Os agentes de IA são seus operários mais rápidos, mas você ainda é o responsável pelo prédio não cair.

Feito!

terça-feira, 31 de março de 2026

Resolvendo erro 404 ao instalar pacotes no Ubuntu

Recentemente, ao tentar instalar o libsqlite3-dev no Ubuntu 24.10 (Oracular), deparei com o seguinte erro:

Err:1 http://security.ubuntu.com/ubuntu oracular-updates/main amd64 libsqlite3-dev amd64 3.46.1-1ubuntu0.2
404 Not Found [IP: 2a06:bc80:0:1000::17 80]
Error: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

Por que isso acontece?

O Ubuntu segue um ciclo de lançamento semestral. A cada 6 meses, uma nova versão é lançada, e as versões anteriores são movidas para o repositório old-releases.ubuntu.com.

O Ubuntu 24.10 (codinome "Oracular") foi lançado em outubro de 2024. No entanto, os mirrors e repositórios de segurança podem não ter todas as versões de pacotes imediatamente disponíveis, especialmente durante o período de transição.

Por que o apt update não resolve?

Em alguns casos, mesmo após executar apt update, o erro persiste porque:

  1. O pacote foi movido antes da sincronização
  2. O repositório de segurança pode ter movido o pacote para old-releases antes do apt-get update refletir essa mudança

  3. Sincronização incompleta
  4. Nem todos os mirrors estão sincronizados com o repositório principal

  5. Ciclo de vida curto
  6. Versões não-LTS têm suporte de apenas 9 meses, então os repositórios são migrados mais rapidamente

A Solução

A solução é simples: alterar o sources.list.d/ubuntu.sources para usar old-releases.ubuntu.com em vez de archive.ubuntu.com.

Procedimentos

  1. Faça backup do ubuntu.sources:
  2. sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.backup
  3. Edite o arquivo (substitua todas as ocorrências):
  4. sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources
    sudo sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources

    Ou edite manualmente se o arquivo estiver em outro local como /etc/apt/sources.list.d/ubuntu.sources:

    deb http://old-releases.ubuntu.com/ubuntu oracular main restricted universe multiverse
    deb http://old-releases.ubuntu.com/ubuntu oracular-updates main restricted universe multiverse
    deb http://old-releases.ubuntu.com/ubuntu oracular-security main restricted universe multiverse
  5. Atualize e instale:
  6. sudo apt update
    sudo apt install libsqlite3-dev

É Comum em Versões Não-LTS?

Sim, é relativamente comum, especialmente em versões de curto suporte (non-LTS).

ciclo de Vida do Ubuntu

Versão Codnome Tipo Lançamento Fim de Suporte Status
Ubuntu 24.04 Noble Numbat LTS Abril 2024 Abril 2029 ✅ Suportado
Ubuntu 24.10 Oracular Oriole Non-LTS Outubro 2024 Julho 2025 ✅ Suportado
Ubuntu 23.10 Mantic Minotaur Non-LTS Outubro 2023 Julho 2024 ❌ End of Life
Ubuntu 22.04 Jammy Jellyfish LTS Abril 2022 Abril 2027 ✅ Suportado
Ubuntu 22.10 Kinetic Kudu Non-LTS Outubro 2022 Julho 2023 ❌ End of Life
Ubuntu 21.10 Impish Indri Non-LTS Outubro 2021 Julho 2022 ❌ End of Life
Ubuntu 20.04 Focal Fossa LTS Abril 2020 Abril 2025 ❌ End of Life

Por que é mais comum em non-LTS?

  1. Ciclo mais curto:
  2. Os pacotes são migrados para old-releases mais rapidamente

  3. Menos prioridade:
  4. Mantimentos de repositórios podem priorizar versões LTS

  5. Volume de usuários:
  6. Menos pessoas usam versões non-LTS, então bugs podem demorar mais para serem reportados

  7. Transição de versão:
  8. O período entre o lançamento e a sincronização completa dos mirrors pode gerar inconsistências

Histórico de problemas similares:

  • Ubuntu 23.10 (Mantic)
  • diversos pacotes tiveram problemas semelhantes

  • Ubuntu 22.10 (Kinetic)
  • mesmo problema

  • Ubuntu 21.10 (Impish)
  • mesmo cenário

Considerações finais

Se você encontrar erro 404 ao instalar pacotes em versões não-LTS do Ubuntu, não se preocupe, é um problema comum e facilmente resolvido. A solução de usar old-releases.ubuntu.com é temporária e não deve causar problemas a longo prazo, já que essas versões têm suporte limitado de qualquer forma.

Para ambientes de produção, sempre recomendo usar versões LTS (como 22.04 ou 24.04) para evitar surpresas como essa.

Feito!

quinta-feira, 26 de março de 2026

Onde colocar as validações? O dilema entre DTO, Service e Entidade

Se você já desenvolveu uma API, certamente parou diante do teclado com uma dúvida cruel: "Onde eu coloco essa validação?".

Devo usar as anotações do Bean Validation no DTO? Devo verificar se o usuário existe dentro do Service? Ou será que a regra de negócio deveria estar protegida dentro da Entidade?

Vamos explorar como organizar sua casa (ou melhor, seu código) para que cada camada cumpra o seu papel sem gerar uma bagunça de responsabilidades.

  1. O DTO: O Porteiro do seu Sistema
  2. O DTO (Data Transfer Object) é a primeira linha de defesa. Ele representa os dados que vêm de fora (do frontend ou de outra API) para dentro do seu sistema.

    O que validar aqui: O foco é puramente técnico e estrutural. Formatos de e-mail, se um campo obrigatório está presente, o tamanho mínimo de uma senha ou se um valor numérico está dentro de um intervalo aceitável.

    O insight: O DTO não conhece as regras do seu negócio. Ele apenas garante que o dado é "aceitável" para cruzar a fronteira da aplicação. Se o JSON está malformado ou falta um campo essencial, o sistema nem deve perder tempo processando.

  3. A Camada de Service: O Maestro
  4. No ecossistema Java/Spring/Quarkus, o Service costuma ser o coração da aplicação, mas ele tem uma função específica: orquestração.

    O que validar aqui: Aqui moram as validações que dependem de infraestrutura. Exemplo: "Este e-mail já está cadastrado no banco de dados?" ou "Este cliente tem saldo suficiente para esta transação?.

    A realidade do mercado: Embora muitos defendam o DDD (Domain-Driven Design) puro, assim como "Modelo Anêmico" (entidades com apenas getters e setters) é muito comum no mercado. Nesses casos, o Service acaba herdando quase toda a lógica de negócio por necessidade técnica.

  5. Entidades: A Alma do Negócio
  6. Em uma arquitetura ideal, a Entidade deveria ser "rica". Ela deve garantir a integridade do domínio independentemente de quem a chama.

    O insight: Se você tem uma regra que diz que "um pedido não pode ser criado sem pelo menos um item", essa lógica deveria estar dentro da classe "Pedido", e não espalhada em múltiplos Services.

    Isso evita que o sistema entre em estados inválidos por erro de um desenvolvedor que esqueceu de chamar uma validação no Service.

  7. E o Banco de Dados?
  8. Para quem trabalha com sistemas legados ou grandes ERPs, as validações no banco (via constraints, triggers ou procedures) são uma realidade. Embora o desenvolvimento moderno tente manter a lógica no código para facilitar testes, o banco de dados é a última linha de defesa para garantir a integridade dos dados.

Considerações finais

O pragmatismo vence o purismo.

A grande lição que tiramos dessa discussão é que contexto é rei.

Se você trabalha em uma empresa que segue padrões rígidos de Service, não tente ser o "rebelde do DDD" sozinho. O código precisa ser legível e sustentável para a equipe. O segredo é ter camadas:

  1. DTO valida a forma.
  2. Service orquestra a lógica e consulta o mundo externo.
  3. Entidade protege as regras fundamentais do negócio.

Quanto mais camadas de validação você tiver (de forma organizada), mais seguro e resiliente será o seu software.

Feito!

quinta-feira, 19 de março de 2026

Instruções de entrega do IRPF 2026

O prazo de entrega da Declaração Anual do Imposto de Renda Pessoa Física (IRPF) 2026, ano-calendário 2025, começa nesta segunda-feira, 23 de março, e segue até o próximo dia 29 de maio, às 23h59. Pessoas físicas que receberam rendimentos tributáveis acima de R$ 35.584,00 assim como aquelas que obtiveram receita bruta da atividade rural acima de R$ 177.920,00, são obrigadas a declarar.

A declaração pré-preenchida já estará plenamente disponível no início do prazo de entrega da declaração, com novos dados incluídos em relação ao ano passado, informações do e-Social relativas aos empregados domésticos, dados do Imposto de Renda Retido na Fonte sobre a renda variável e recuperação das informações de pagamento (DARFs). Todas as regras estão presentes na Instrução Normativa RFB nº 2.312/2026 , publicada no Diário Oficial da União desta segunda-feira, 16/3.

A declaração pré-preenchida virá com as seguintes informações:

  • Informações da declaração anterior do contribuinte: identificação, endereço
  • Rendimentos e pagamentos da Dirf, Dimob, DMED e Carnê-Leão
  • Rendimentos isentos em função de moléstia grave e códigos de juros
  • Rendimentos de restituição recebidas no ano-calendário
  • Contribuições de previdência privada
  • Atualização do saldo de conta bancária e poupança
  • Atualização do saldo de Fundos de investimento
  • Imóveis adquiridos no ano-calendário
  • Doações efetuadas no ano-calendário
  • Informação de Criptoativos
  • Conta bancária/poupança ainda não declarada
  • Fundo de investimento ainda não declarado
  • Contas bancárias no exterior

RENDIMENTOS NO EXTERIOR — A partir deste ano, os dados de contas bancárias no exterior foram incluídos na declaração pré-preenchida, após a legislação determinar a tributação de offshores (empresas de investimentos em outros países) e rendimentos no exterior. Por causa da lei que antecipou a cobrança de Imposto de Renda sobre Fundos Exclusivos e tributou as offshores, os rendimentos no exterior passaram a ser tributados de forma definitiva na declaração de ajuste anual, com alíquota de 15%. Até 2023, o pagamento era feito mensalmente, mas passou a ser feito anualmente. Na declaração, os bens que representem investimentos no exterior passam a permitir a informação do rendimento e do imposto pago, tanto no Brasil como no exterior.

OUTRAS MUDANÇAS — A declaração terá poucas mudanças em relação à do ano passado. As principais são as situações em que o contribuinte está obrigado a entregar o documento, por causa do reajuste da faixa de isenção no ano passado.

Em relação às obrigatoriedades, as mudanças foram as seguintes:

  • Valor de rendimentos tributáveis anuais que obrigam a entrega da declaração subiu de R$ 33.888,00 para R$ 35.584,00
  • Limite da receita bruta de obrigatoriedade para atividade rural subiu de R$ 169.440,00 para R$ 177.920,00
  • Quem atualizou valor de bens imóveis e pagou ganho de capital diferenciado em dezembro de 2025 terá de preencher a declaração
  • Quem apurou rendimentos no exterior de aplicações financeiras e de lucros e dividendos passou a declarar anualmente
  • As demais obrigatoriedades foram mantidas.

Outra mudança é a maior prioridade para quem simultaneamente utilizou a declaração pré-preenchida e optou pelo recebimento da restituição via Pix. Até o ano passado, a prioridade era definida apenas com base na utilização de uma das duas ferramentas.

Estão, portanto, isentas da declaração as pessoas que receberam até dois salários-mínimos mensais durante 2025, salvo se se enquadrarem em outro critério de obrigatoriedade. Os demais critérios de obrigatoriedade mantiveram-se os mesmos. Dentre os principais, destacam-se aqueles aplicáveis aos contribuintes que:

  • receberam rendimentos isentos, não tributáveis ou tributados exclusivamente na fonte superior a R$ 200 mil;
  • alienaram em bolsas de valores, de mercadorias, de futuros e assemelhadas valores em soma superior a R$ 40 mil ou com ganhos líquidos sujeitas à incidência do imposto;
  • tiveram, em 31 de dezembro de 2025, a posse ou a propriedade de bens ou direitos, inclusive terra nua, de valor total superior a R$ 800 mil;
  • passaram à condição de residente no Brasil em qualquer mês e estava nesta condição no fim de 2025.

MULTA — Quem enviar a declaração fora do prazo deverá pagar multa de 1% sobre imposto devido, com valor mínimo de R$ 165,74, ou de 20% do valor devido, prevalecendo o maior valor.

Reinstituções

A Receita Federal pretende antecipar o pagamento da restituição do Imposto de Renda este ano. A previsão é que 80% dos contribuintes que tenham direito à restituição recebam os valores até o dia 30 de junho. A maior agilidade no processamento possibilitará a redução da quantidade de lotes este ano, que passarão de cinco para quatro. O primeiro lote será pago no dia 29 de maio, com os subsequentes ocorrendo nos dias 30/6, 31/7 e 31/8. Confira a ordem de prioridades nas restituições:

1º) Idade igual ou superior a 80 anos;

2º) Idade igual ou superior a 60 anos, deficientes e portadores de moléstia grave;

3º) Pessoa que tenha maior fonte de renda vinda do magistério;

4º) Quem utilizou conjuntamente a declaração pré-preenchida e optou pela restituição no Pix;

5º) Quem utilizou exclusivamente a declaração pré-preenchida ou optou pela restituição no Pix; e

6º) Demais contribuintes

Restituição Automática – ano-calendário 2024

Outra novidade anunciada na coletiva foi o pagamento de um lote especial de restituição para os contribuintes que não entregaram a declaração de Imposto de Renda em 2025 por não estarem obrigados, mas tinham direito à restituição por fatos ocorridos em 2024. Esta situação pode acontecer, por exemplo, com um empregado que teve imposto de renda retido na fonte por ter recebido salário no primeiro trimestre de 2024, mas ficou desempregado posteriormente e não obteve renda no restante do ano para se encaixar nos critérios de obrigatoriedade de entrega da declaração. A parcela de imposto que foi retida dá a ele direito à restituição, que será realizada através de uma declaração automática elaborada pela própria Receita Federal a partir de 15 de junho deste ano, com o crédito a partir de 15 de julho.

Segundo a Receita Federal, cerca de 4 milhões de contribuintes se encaixam nesta situação, com um valor médio de R$ 125 em restituições devidas, totalizando um montante de R$ 500 milhões.

A declaração automática será elaborada para contribuintes que tem direito à restituição de até R$ 1 mil, com CPF regular e chave Pix vinculada ao CPF. O pagamento será feito de maneira automática. A partir do dia 15 de junho, o contribuinte poderá verificar se teve sua declaração automaticamente gerada na página da Receita Federal, e poderá realizar retificações na declaração se assim o desejar.

"Este é um importante mecanismo de Justiça Fiscal, no qual a Receita Federal passa a devolver valores que o cidadão tem direito, mas não pleiteou, ou por falta de conhecimento ou por falta de recursos para fazer a sua declaração", explicou o responsável pelo programa do Imposto de Renda 2026, José Carlos da Fonseca.

A Receita Federal recomenda que os declarantes utilizem a pré-preenchida, que insere automaticamente dados como rendimentos recebidos e despesas médicas efetuadas. Ao minimizar a possibilidade de erros, a declaração pré-preenchida evita que o contribuinte seja retido na malha fiscal, popularmente conhecida como “malha fina”. É importante destacar, porém, que os dados da declaração são enviados por terceiros como empresas e planos de saúde, e é responsabilidade do contribuinte ver se eles estão corretos.

Além do Programa Gerador da Declaração, o contribuinte também pode utilizar o sistema "Meu Imposto de Renda", solução online para celulares e tablets. O acesso ao Meu Imposto de Renda exige autenticação via Plataforma GOV.BR (níveis ouro ou prata), com acesso por meio da página gov.br/receitafederal, pelo centro virtual de atendimento ao contribuinte (Portal e-Cac) ou pelo aplicativo da Receita Federal.

O sistema "Meu Imposto de Renda" recebeu várias melhorias em relação ao ano passado. A interface de ajuda está mais amigável e o sistema agora emite alertas para erros comuns, tais como pagamentos para dependentes sem a declaração de rendimentos e despesas médicas elevadas. "Outro alerta é quando o contribuinte informa uma chave PIX vinculada ao CPF que não existe. O objetivo é evitar erros e estabelecer um diálogo com o cidadão através do próprio programa", explicou José Carlos da Fonseca. O sistema também foi otimizado para recuperar automaticamente informações de dependentes que estejam cadastrados regularmente no sistema CPF e tenham sido declarados como tal nas declarações dos últimos três anos, sem necessidade de autorização específica para a recuperação de dados.

Referência

Gov.BR

Feito!

O Linux foi banido no Brasil?

O texto da Lei nº 15.211/2025 (ECA Digital), o decreto regulamentador de março de 2026 e a repercussão técnica que gerou esse pânico digital.

Vou direto ao ponto: Dizer que o Linux foi "banido" no Brasil é Fake News. Não existe qualquer artigo na lei que proíba o uso, a distribuição ou a posse do sistema operacional Linux. O que existe é um desafio de conformidade técnica que foi interpretado de forma sensacionalista.

Abaixo, apresento o parecer jurídico e técnico sobre a situação:

  1. O que a Lei realmente diz?
  2. O ECA Digital (Lei 15.211/2025) foca na proteção de menores contra conteúdos inadequados e coleta predatória de dados. No seu Artigo 12, ela estabelece obrigações para:

    Provedores de redes sociais;

    Lojas de aplicativos (como Play Store ou Apple Store);

    Sistemas operacionais de terminais.

    A lei exige que esses entes ofereçam mecanismos de verificação de idade (proibindo a autodeclaração simples) e ferramentas de controle parental.

  3. Por que surgiu o rumor do "Banimento"?
  4. O problema não é uma proibição, mas a responsabilidade civil e financeira.

    Projetos de software livre, como o Arch Linux 32 ou o MidnightBSD, são mantidos por voluntários e não possuem CNPJ ou recursos para implementar APIs caras de verificação de identidade (como as que exigem biometria ou checagem de documentos).

    Temendo multas que podem chegar a R$ 50 milhões por infração, alguns projetos menores decidiram, por conta própria, bloquear o acesso de IPs brasileiros aos seus sites de download como medida preventiva de "segurança jurídica". Foi uma decisão dos desenvolvedores estrangeiros, e não uma ordem do governo brasileiro.

  5. O Linux vai parar de funcionar?
  6. Absolutamente não.

Grandes Distribuições: Empresas como a Canonical (Ubuntu) e a Red Hat possuem corpo jurídico e financeiro para se adequar ou negociar termos com a ANPD (Autoridade Nacional de Proteção de Dados).

Infraestrutura Nacional: O próprio Governo Brasileiro é um dos maiores usuários de Linux (em servidores, urnas eletrônicas e datacenters). Banir o Linux seria paralisar o Estado brasileiro e a internet nacional, o que é juridicamente e logicamente impossível.

Uso Pessoal: Você pode continuar usando a sua distro Linux preferida normalmente. A lei regula o fornecedor do serviço, não pune o usuário final por ter o sistema instalado.

Títulos Sensacionalistas no YouTube

Os títulos "Linux banido" são exemplos clássicos de clickbait. Eles pegam um fato real (a dificuldade técnica de pequenos projetos de código aberto em cumprir uma lei de verificação de idade) e o transformam em uma catástrofe inexistente para gerar visualizações.

Resumo do Parecer

Aspecto Analisado Realidade Jurídica (Pós-Regulamentação 2026)
O Linux foi proibido? Não. O sistema continua legal. A lei foca em mecanismos de proteção de menores, não na proibição de kernels ou arquiteturas de software livre.
Por que há bloqueios? Auto-bloqueio preventivo. Alguns projetos internacionais (sem representação no Brasil) bloquearam IPs brasileiros para evitar multas de até R$ 50 milhões, por não possuírem infraestrutura de verificação de idade.
Uso em Servidores e Urnas Garantido. O Linux é a base da infraestrutura crítica do Estado Brasileiro. Bani-lo seria tecnicamente impossível e juridicamente nulo por ferir a continuidade do serviço público.
Risco ao Usuário Final Zero. As sanções do ECA Digital são administrativas e direcionadas aos fornecedores e distribuidores que não implementarem controle parental, nunca ao cidadão que utiliza o sistema.
Veredito sobre os Rumores Fake News / Clickbait. Títulos que afirmam "Linux Banido" distorcem um desafio de compliance técnico transformando-o em uma proibição estatal inexistente.

Considerações finais

Não há motivo para pânico. O Linux continua sendo legal e amplamente utilizado no Brasil. O que estamos presenciando é o "atrito" entre uma legislação nova e o modelo de desenvolvimento descentralizado do software livre, algo que será ajustado via regulamentação administrativa nos próximos meses.

Para quem deseja se aprofundar e evitar cair em armadilhas de engajamento, a recomendação é uma só: leia o texto da regulamentação na íntegra. Ao analisar o documento oficial, fica evidente que os vídeos no YouTube com títulos como "Linux banido no Brasil" ou similares são puramente sensacionalistas e clickbait. Eles exploram o medo da comunidade técnica para gerar visualizações, distorcendo um desafio de conformidade em uma proibição que nunca existiu.

Referência

Governo do Brasil

Guia Offical

Feito!

quarta-feira, 11 de março de 2026

Maven vs Gradle em projetos Java: Qual escolher?

No ecossistema Java, ferramentas de build automation são fundamentais para compilar código, gerenciar dependências, executar testes e gerar artefatos como JAR ou WAR. As duas ferramentas mais utilizadas são Apache Maven e Gradle.

Ambas resolvem o mesmo problema, automatizar o ciclo de build de aplicações Java, porém utilizam abordagens diferentes.

No presente artigo vamos analisar:

  • O que são Maven e Gradle
  • Como cada um funciona
  • Prós e contras
  • Quando usar cada ferramenta em projetos Java

O que é Maven?

Apache Maven é uma ferramenta de build criada pela Apache Software Foundation e lançada em 2004.

Seu principal objetivo é padronizar o processo de build em projetos Java.

Ele utiliza um arquivo chamado pom.xml (Project Object Model) onde são declarados:

  • dependências
  • plugins
  • versão do projeto
  • configuração de build
  • repositórios

Exemplo do arquivo pom.xml para o projeto Spring Framework 7 com Java 21 + JUnit + cobertura mínima de 80%

pom.xml

O Maven segue o princípio Convention over Configuration, ou seja, ele já possui uma estrutura padrão:


src/main/java
src/main/resources
src/test/java
src/test/resources

Essa padronização facilita a colaboração entre equipes.

O que é Gradle?

Gradle surgiu em 2012 como uma alternativa mais flexível e performática ao Maven.

Ele utiliza uma DSL baseada em Groovy ou Kotlin para definir o build.

Exemplo de arquivo build.gradle para o projeto Spring Framework 7 e Java 21 + JUnit + cobertura mínima de 80%:

build.gradle

O Gradle foi projetado para:

  • builds mais rápidos
  • maior flexibilidade
  • melhor suporte a projetos complexos

Hoje ele é amplamente usado em projetos modernos, incluindo o build padrão do Android Studio.

Diferenças conceituais

Característica Maven Gradle
Configuração XML (pom.xml) DSL baseada em Groovy ou Kotlin
Filosofia Convention over Configuration Alta flexibilidade e customização
Performance Mais lento em builds grandes Mais rápido com incremental build e cache
Curva de aprendizado Mais simples para iniciantes Maior devido à DSL programável
Customização Limitada via plugins Muito alta, com scripts programáveis

Prós do Maven

  1. Padronização
  2. O Maven impõe uma estrutura padrão para projetos.

    Isso facilita:

    onboarding de novos desenvolvedores

    manutenção de projetos

    integração entre equipes

  3. Ecossistema maduro
  4. O Maven possui milhares de plugins prontos.

    Exemplos:

    compilação

    geração de documentação

    análise de código

    empacotamento

  5. Simplicidade conceitual
  6. Apesar do XML ser verboso, o modelo é simples:

    
    clean
    compile
    test
    package
    install
    deploy
    
    

    Esse ciclo é chamado de build lifecycle.

  7. Alta adoção corporativa
  8. Muitas empresas utilizam Maven em aplicações enterprise, especialmente em projetos baseados em:

    • Spring Framework
    • Spring Boot
    • aplicações legadas Java

Contras do Maven

  1. XML verboso
  2. Configurações simples podem virar arquivos grandes.

    Exemplo comum: pom.xml com centenas de linhas.

  3. Customização limitada
  4. Criar pipelines complexos pode ser difícil.

  5. Performance menor
  6. Comparado ao Gradle, o Maven:

    • recompila mais coisas
    • possui menos otimizações

Prós do Gradle

  1. Build mais rápido
  2. Gradle implementa várias otimizações:

    • incremental build
    • build cache
    • execução paralela

    Isso reduz bastante o tempo de build em projetos grandes.

  3. DSL mais expressiva
  4. A configuração é escrita em Groovy ou Kotlin, permitindo:

    • lógica condicional
    • loops
    • funções
    • scripts reutilizáveis
  5. Melhor para projetos grandes
  6. Gradle funciona muito bem com:

    • monorepos
    • microservices
    • builds multi-módulo
  7. Flexibilidade extrema
  8. É possível construir praticamente qualquer pipeline de build.

Contras do Gradle

  1. Curva de aprendizado maior
  2. Desenvolvedores precisam entender:

    • Groovy ou Kotlin
    • conceitos de tasks
    • lifecycle do Gradle
  3. Menos padronização
  4. Como tudo pode ser customizado, projetos podem ficar inconsistentes entre equipes.

  5. Debug de build mais complexo
  6. Scripts muito dinâmicos podem dificultar troubleshooting.

Maven vs Gradle em projetos reais

Na prática, a escolha depende do tipo de projeto.

Use Maven quando:

  • o projeto é corporativo tradicional
  • a equipe prefere padronização
  • builds não são extremamente complexos
  • onboarding rápido é importante

Use Gradle quando:

  • o projeto é grande ou modular
  • erformance de build é crítica
  • pipelines precisam de customização
  • o projeto envolve Android

Tendências do ecossistema Java

Nos últimos anos, Gradle tem crescido bastante, especialmente em projetos modernos.

Entretanto, Maven ainda domina grande parte do mercado corporativo devido à sua estabilidade e padronização.

Ou seja:

  • Maven -> estabilidade e padrão
  • Gradle -> flexibilidade e performance

Considerações finais

Tanto Apache Maven quanto Gradle são excelentes ferramentas de build para projetos Java.

A escolha correta depende de fatores como:

  • complexidade do projeto
  • tamanho da equipe
  • necessidade de customização
  • tempo de build

Em termos simples:

  • Maven é previsível e padronizado
  • Gradle é poderoso e flexível

Um engenheiro de software moderno deve conhecer ambos, pois cada um continua sendo amplamente utilizado nas empresas.

Feito!

sexta-feira, 27 de fevereiro de 2026

Entendendo o git worktree na prática

No dia a dia de engenharia de software, especialmente em projetos com múltiplas features, hotfixes e revisões paralelas, é comum enfrentar um problema recorrente: alternar entre branches sem quebrar o estado do workspace. Tradicionalmente, isso envolve stash, commits temporários ou até múltiplos clones do mesmo repositório. O git worktree resolve esse problema de forma elegante e eficiente.

No presente artigo, vamos entender o conceito, os benefícios arquiteturais no fluxo de trabalho e um exemplo prático que conecta teoria e prática.

O que é git worktree

git worktree é um recurso do Git que permite ter múltiplos diretórios de trabalho (working directories) associados ao mesmo repositório local. Cada diretório pode estar ligado a uma branch diferente, compartilhando o mesmo histórico e objetos Git.

Em termos técnicos:

  • Um único repositório .git
  • Vários diretórios de trabalho independentes
  • Cada diretório com sua própria branch ativa

Isso elimina a necessidade de:

  • Fazer checkout constante
  • Clonar o repositório várias vezes
  • Usar stash com frequência

O problema que o worktree resolve

Imagine um cenário comum em equipes de desenvolvimento.

Você está trabalhando em:

  • feature nova
  • correção de bug urgente
  • revisão de Pull Request

Sem worktree, o fluxo geralmente é:

  1. Commit parcial ou stash
  2. Checkout de outra branch
  3. Resolver a tarefa
  4. Voltar para a branch original
  5. Aplicar stash
  6. Resolver conflitos eventuais

Isso gera:

  • perda de foco
  • risco de conflitos
  • overhead mental
  • contexto misturado

Em projetos grandes (monorepos, microsserviços, projetos com CI/CD pesado), isso impacta diretamente a produtividade.

Benefícios do git worktree

  1. Paralelismo no desenvolvimento
  2. Você pode trabalhar em múltiplas branches ao mesmo tempo.

    Exemplo:

    
    repo/
     ├── main-workspace
     ├── feature-pagamentos
     ├── hotfix-producao
     
    

    Cada diretório tem sua branch ativa.

  3. Redução de conflitos e erros
  4. Ao evitar stash frequente e mudanças de branch no mesmo diretório, diminui:

    • arquivos modificados esquecidos
    • conflitos inesperados
    • commits acidentais
  5. Ideal para revisão de código
  6. Você pode abrir uma branch de PR sem interromper o trabalho atual.

  7. Excelente para testes de versões
  8. Muito útil quando você precisa rodar duas versões do sistema:

    • versão atual
    • nova feature

    Exemplo típico em backend:

    • API executando versão estável
    • nova implementação em paralelo
  9. Performance melhor que múltiplos clones
  10. Porque:

    • objetos Git são compartilhados
    • apenas o workspace muda

    Isso economiza:

    • disco
    • tempo de clone
    • download de dependências

Estrutura interna (como o Git organiza isso)

Quando você cria um worktree, o Git registra internamente:

.git/worktrees/

Cada worktree tem:

  • referência da branch
  • HEAD independente
  • index próprio

Mas todos compartilham:

  • histórico
  • objetos
  • commits

Isso torna o mecanismo extremamente eficiente.

Quando usar git worktree na prática

Situações ideais:

Desenvolvimento paralelo de features

Quando duas tarefas estão em andamento ao mesmo tempo.

Hotfix urgente

Você não quer interromper sua feature atual.

Revisão de Pull Requests

Abrir o PR localmente sem bagunçar o ambiente atual.

Testes de refatoração grande

Manter uma branch estável rodando.

Monorepos grandes

Especialmente em projetos com build pesado.

Exemplo prático (teoria -> prática)

Vamos simular um cenário real de desenvolvimento.

Projeto:

API backend com duas tarefas:

  • feature: sistema de notificações
  • hotfix: correção de autenticação

Branch atual:

develop

Estrutura inicial:

finance-api/

Passo 1: Criar uma nova feature com worktree

Criando um diretório para a feature:

git worktree add ../feature-notificacoes -b feature/notificacoes

O que aconteceu aqui:

  • Criou um novo diretório
  • Criou uma nova branch
  • Ligou a branch ao novo workspace

Agora temos:

finance-api/
feature-notificacoes/

Cada um com uma branch diferente.

Passo 2: Trabalhando em paralelo

Workspace 1:

finance-api
branch: develop

Workspace 2:

feature-notificacoes
branch: feature/notificacoes

Passo 3: Hotfix urgente

Bug em produção.

Criando outro worktree:

git worktree add ../hotfix-auth -b hotfix/auth

Estrutura final:

finance-api/
feature-notificacoes/
hotfix-auth/

Agora você tem três contextos isolados.

Passo 4: Fluxo real de desenvolvimento

No diretório hotfix

cd ../hotfix-auth

Corrige o problema:

git commit -m "fix: corrige validação do token"
git push origin hotfix/auth

Merge realizado.

Enquanto isso, a feature continua intacta

Sem stash.

Sem conflitos.

Sem troca de branch.

Listando worktrees existentes

git worktree list

Saída típica:

/home/reginaldo/projetos/finance-api develop
/home/reginaldo/projetos/feature-notificacoes feature/notificacoes
/home/reginaldo/projetos/hotfix-auth hotfix/auth

Isso ajuda muito em repositórios grandes.

Removendo um worktree

Após merge da feature:

git worktree remove ../feature-notificacoes

Ou manual:

rm -rf ../feature-notificacoes
git worktree prune

Boas práticas usando git worktree

  1. Criar um diretório padrão
  2. Exemplo:

    worktrees/

    Estrutura recomendada:

    
    repo/
    worktrees/
       feature-x
       hotfix-y
    
    
  3. Nomear worktrees por contexto
  4. Evite nomes genéricos:

    Errado:

    
    test
    dev2
    branch2
    
    

    Melhor:

    
    feature-pagamentos
    refactor-auth
    hotfix-prod
    
    
  5. Usar em conjunto com PR workflow
  6. Fluxo eficiente:

    1. Criar branch
    2. Criar worktree
    3. Desenvolver
    4. Commit
    5. Push
    6. PR
    7. Remover worktree
  7. Automatizar com script
  8. Exemplo simples:

    new-feature.sh

    
    #!/bin/bash
    
    branch=$1
    
    git worktree add ../wt-$branch -b $branch
    cd ../wt-$branch
    
    

    Uso:

    ./new-feature.sh feature/pix

    Isso acelera bastante o fluxo de trabalho.

Comparação: workflow tradicional vs worktree

Sem worktree

Fluxo:


stash
checkout
pull
resolver conflito
stash pop

Problemas:

risco de erro

perda de contexto

lentidão

Com worktree

Fluxo:


novo diretório
nova branch isolada
desenvolver

Resultado:

workflow limpo

paralelismo

mais produtividade

Uso avançado em times experientes

Equipes maduras usam git worktree para:

QA paralelo

Ambiente para teste de PR local.

Refatoração grande

Manter branch estável rodando.

Testar migração de framework

Exemplo real:

Migrar:

  • Spring Boot
  • Angular
  • React

Sem quebrar a base principal.

Integração com ferramentas modernas

Funciona muito bem com:

VSCode

Docker

Dev Containers

Monorepos

CI local

Exemplo prático com Docker:

Cada worktree pode subir um container diferente.

docker compose up

Com variáveis diferentes.

Quando não usar git worktree

Casos raros:

  • projetos muito pequenos
  • repositórios descartáveis
  • scripts simples

Mas na maioria dos casos profissionais, vale a pena.

Considerações finais

git worktree é um recurso subestimado do Git, mas extremamente poderoso para engenheiros de software que trabalham com múltiplos contextos de desenvolvimento.

Ele melhora:

  • organização
  • foco
  • produtividade
  • segurança no workflow

E reduz drasticamente problemas comuns como:

  • stash excessivo
  • conflitos inesperados
  • troca constante de branches

Em equipes que trabalham com:

  • microserviços
  • APIs
  • sistemas corporativos
  • projetos com CI/CD

O uso de git worktree pode se tornar um diferencial real no fluxo da engenharia de software.

Feito!

quarta-feira, 18 de fevereiro de 2026

O lado obscuro do Vibe Coding

O movimento Vibe Coding transformou a maneira como criamos software. A promessa é sedutora: você descreve sua ideia em linguagem natural, e uma plataforma de IA (Bolt.new, Lovable, Abacus) que são ferramentas especializadas para gerar um aplicativo full-stack funcional em minutos.

No entanto, há um perigo silencioso nesse fluxo de trabalho. Muitas dessas ferramentas utilizam o Supabase como backend padrão. Se você não for específico no seu prompt, pode acabar com uma aplicação onde qualquer pessoa na internet consegue ler, alterar ou deletar os dados de todos os seus usuários.

O Contexto Histórico: Da Rebeldia de Karpathy ao Mainstream

O termo Vibe Coding não nasceu em um laboratório de engenharia tradicional, mas sim de uma observação provocativa de Andrej Karpathy (cofundador da OpenAI) em fevereiro de 2025. Ao descrever um fluxo de trabalho onde a sintaxe é irrelevante e a "vibe" (a intenção e o feedback visual) é tudo, Karpathy deu nome a um movimento que o lendário produtor Rick Rubin comparou ao "Punk Rock do Software".

Em 2025, o termo foi eleito a palavra do ano pelo dicionário Collins, consolidando a ideia de que qualquer pessoa com uma boa ideia e um prompt pode ser um desenvolvedor. No entanto, essa origem focada na velocidade e na expressão criativa trouxe um efeito colateral: a negligência com fundamentos invisíveis, como o RLS, que agora, em 2026, define a fronteira entre um protótipo amador e um app profissional seguro.

No presente artigo, vamos entender a vulnerabilidade de RLS (Row Level Security) desabilitado e como corrigi-la com uma simples mudança na sua instrução inicial.

O que é Vibe Coding e por que o Supabase?

Vibe Coding é o termo cunhado para descrever o desenvolvimento de software focado na intenção e na iteração rápida através de prompts de IA, onde o desenvolvedor atua mais como um "maestro" do que como um digitador de sintaxe.

Para que essa "mágica" aconteça, a IA precisa de um backend que seja fácil de configurar programaticamente. O Supabase é a escolha ideal por ser um "Firebase Open Source" baseado em PostgreSQL, oferecendo banco de dados, autenticação e armazenamento de forma instantânea.

O problema surge na configuração padrão.

O Perigo: A Chave Anon e o RLS Desabilitado

Quando uma plataforma (Bolt.new, Lovable, Abacus) cria um app Supabase para você, ela gera um arquivo de configuração (geralmente .env) contendo a SUPABASE_URL e a SUPABASE_ANON_KEY.

Diferente de backends tradicionais onde a chave do banco de dados fica escondida no servidor, no modelo de arquitetura moderna (PostgREST), a chave anon é pública e fica exposta no navegador do usuário.

O que é RLS (Row Level Security)?

RLS significa Row Level Security (Segurança em Nível de Linha). É um recurso do banco de dados PostgreSQL que permite definir regras granulares para quem pode ver ou modificar cada linha em uma tabela.

Sem RLS: Se você tem a chave anon, você tem acesso total às tabelas.

Com RLS: Mesmo com a chave anon, o banco de dados pergunta: "Quem é este usuário e ele tem permissão para ver esta linha específica?"

A Anatomia da Vulnerabilidade

Imagine que você pediu na plataforma (Bolt.new, Lovable, Abacus):

"Crie um app de gestão de clientes para minha agência".

A plataforma (Bolt.new, Lovable, Abacus) cria uma tabela chamada clientes. Por padrão, para facilitar o desenvolvimento e garantir que o app "funcione de primeira" (a famosa "vibe"), muitas ferramentas de geração de código criam as tabelas sem habilitar o RLS.

O Cenário de Desastre

  1. O hacker acessa seu site.
  2. Abre o console do desenvolvedor (F12) e encontra sua SUPABASE_ANON_KEY.
  3. Utiliza uma ferramenta simples ou até o próprio terminal para fazer uma requisição à API do seu Supabase:
  4. curl 'https://seu-projeto.supabase.co/rest/v1/clientes?select=*' \
    -H "apikey: SUA_CHAVE_ANON" \
    -H "Authorization: Bearer SUA_CHAVE_ANON"

O resultado? O invasor recebe um JSON com todos os dados de todos os clientes, e-mails, faturamentos e notas administrativas. Se o RLS estiver desabilitado, a chave "Anônima" tem poderes de administrador sobre os dados públicos.

A Solução: Ajustando o seu Prompt

A boa notícia é que a IA é obediente. O erro não está na tecnologia, mas na omissão da segurança no prompt inicial. Para garantir que seu app seja seguro desde o "dia zero", você deve incluir instruções explícitas de segurança.

O "Prompt Seguro"

Sempre que iniciar um projeto de Vibe Coding, adicione este parágrafo ao seu comando:

"Habilite o Row Level Security (RLS) em todas as tabelas criadas no Supabase. Crie políticas de segurança para que usuários autenticados possam ler e escrever apenas seus próprios dados, e garanta que dados administrativos não sejam acessíveis via chave anon sem as devidas permissões."

Ao fazer isso, a IA na plataforma (Bolt.new, Lovable, Abacus) gerará o SQL necessário para proteger seu banco, parecido com este:

-- Exemplo do que a IA deve gerar nos bastidores
ALTER TABLE clientes ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Usuários só vêem seus próprios clientes"
ON clientes FOR SELECT

USING (auth.uid() = user_id);

Tabela Comparativa: Sem RLS vs. Com RLS

Recurso Sem RLS (Padrão Vibe) Com RLS (Prompt Seguro)
Visibilidade da Chave Exposta no Browser (Normal) Exposta no Browser (Normal)
Acesso a dados alheios Livre (Risco Total) Bloqueado pelo Banco
Privacidade Inexistente Garantida por UID
Escalabilidade Perigosa Segura para Produção

Considerações finais

O Vibe Coding é o futuro, mas a segurança não pode ser deixada para depois. Ao entender que o Supabase delega a segurança para o nível da linha (RLS), você assume o controle da integridade dos dados dos seus usuários.

Não deixe que a agilidade de um prompt comprometa a confiança dos seus clientes. Segurança também faz parte da "vibe".

Feito!

quinta-feira, 12 de fevereiro de 2026

Executando o Ollama no ambiente Docker

Executar o Ollama no Docker é a maneira mais prática de executar modelos de linguagem (LLMs) localmente, garantindo isolamento do sistema operacional e fácil gerenciamento.

O presente howto explica passo a passo para configurar o Ollama com Docker e instalar modelos, tanto com CPU quanto com GPU.

  1. Pré-requisitos
  2. A premissa é ter o Docker e Docker-Compose instalados, caso ainda não tenha, verifique Instalando Docker e Docker Compose no Linux (qualquer distro) ou Instalando Docker no Windows 10

    Nvidia Container Toolkit (Para GPU): Se você tem uma GPU Nvidia e quer aceleração, instale o Nvidia Container Toolkit para o Docker reconhecer sua placa.

  3. Executar o Ollama no Docker
  4. Abra o seu terminal e utilize os comandos abaixo:

    A. Apenas CPU

    -d: Roda o contêiner em segundo plano (detached mode).

    -v ollama:/root/.ollama:

    Cria um volume chamado ollama para garantir que seus modelos baixados não sejam apagados quando o contêiner for reiniciado.

    -p 11434:11434:

    Mapeia a porta padrão do Ollama.

    B. Com GPU NVIDIA (Aceleração) docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama --gpus=all:

    Permite que o contêiner acesse a GPU.

  5. Instalar e Rodar Modelos Abertos (Ollama Pull/Run)
  6. Com o contêiner rodando, você pode "entrar" nele e baixar os modelos através da CLI (Interface de Linha de Comando).

    Download de um modelo (ex: Llama 3.2):

    docker exec -it ollama ollama pull llama3.2

    Executar o modelo e interagir:

    docker exec -it ollama ollama run llama3.2

    Agora você pode conversar com o modelo diretamente no terminal.

    Outros modelos populares:

    docker exec -it ollama ollama run gemma2

    docker exec -it ollama ollama run deepseek-r1

    docker exec -it ollama ollama run qwen2.5
  7. Como ver os modelos instalados e gerenciar
  8. Para listar os modelos que você já baixou dentro do contêiner Docker, use:

    docker exec -it ollama ollama list

    Para remover um modelo:

    docker exec -it ollama ollama rm nome_do_modelo
  9. Dica Pro: Interface Web (Open WebUI)
  10. Para ter uma experiência tipo "ChatGPT" com o Ollama no Docker, a melhor opção é o Open WebUI.

    Use o docker-compose para rodar o Ollama e a interface gráfica juntos:

    Crie um arquivo docker-compose.yml:

    
    services:
      ollama:
        volumes:
          - ollama:/root/.ollama
        container_name: ollama
        image: ollama/ollama
        ports:
          - "11434:11434"
        networks:
          - ollama-net
        restart: always
    
      open-webui:
        image: ghcr.io/open-webui/open-webui:main
        container_name: open-webui
        volumes:
          - open-webui:/app/backend/data
        ports:
          - "3000:8080"
        environment:
          - OLLAMA_BASE_URL=http://ollama:11434
        networks:
          - ollama-net
        restart: always
    
    networks:
      ollama-net:
    
    volumes:
      ollama:
      open-webui:
    
    

    Execute: docker-compose up -d

    Acesse http://localhost:3000 no seu navegador.

Feito!

quarta-feira, 11 de fevereiro de 2026

Fazendo o Deploy do site com GitHub Actions

Configurar um site com GitHub Actions para fazer o deploy automático via FTP transforma seu fluxo de trabalho: você faz o git push e o GitHub cuida do resto.

O presente howto explica como fazer o deploy do seu site com GitHub Actions via FTP, comum em hospedagem compartilhada.

Segue os procedimentos:

  1. Salve suas credenciais com segurança
  2. Nunca coloque senhas diretamente no código. No seu repositório no GitHub:

    Vá em Settings > Secrets and variables > Actions.

    Clique em New repository secret e adicione:

    FTP_SERVER: O endereço ou nome de domínio do seu servidor.

    FTP_USERNAME: Seu usuário de FTP.

    FTP_PASSWORD: Sua senha de FTP.

  3. Crie o arquivo de Workflow
  4. No seu projeto local, crie a pasta .github/workflows/ e, dentro dela, um arquivo chamado main.yml. Cole o conteúdo abaixo:

    Se o site foi desenvolvido apenas com HTML, CSS e JS

    No seu projeto local, crie o diretório .github/workflows/ e, dentro dela, um arquivo chamado main.yml. Segue:

    .github/workflows/main.yml

    Se o site foi desenvolvido com React

    Diferente de um site estático simples (HTML/CSS/JS), o navegador não entende diretamente seu código React (JSX). O GitHub Actions precisa rodar o comando de compilação para criar a pasta final com os arquivos otimizados.

    No seu arquivo .github/workflows/main.yml, use esta estrutura

    .github/workflows/main.yml

  5. Suba as alterações
  6. Agora basta commitar e enviar para o GitHub:

    git add .

    git commit -m "Configurando deploy automático"

    git push origin main

    Você pode acompanhar o progresso em tempo real na aba Actions do seu repositório. Se tudo estiver certo, seu site será atualizado em poucos segundos!

Pontos importantes para React:

Diretório Local (local-dir): Se você usa Vite (o padrão atual), a pasta de saída é a dist/. Se usa o antigo Create React App, é a build/.

Roteamento (SPA): Se o seu site usa react-router-dom, lembre-se de configurar um arquivo .htaccess no seu servidor para redirecionar todas as rotas para o index.html, caso contrário, você receberá erro 404 ao atualizar a página.

Variáveis de Ambiente: Se o seu React usa .env, você precisará cadastrar essas variáveis nos Secrets do GitHub e injetá-las no passo de build.

Caso criou o projeto React com Vite, precisa adicionar uma configuração.

O segredo aqui é que o GitHub Actions vai criar um "computador virtual", instalar o Node.js, baixar suas bibliotecas e transformar seu código JSX em arquivos que qualquer servidor entende.

Dica de Ouro: O arquivo .htaccess

Para sites React (Single Page Applications), se você não configurar o servidor, as rotas (ex: ://seusite.com) darão erro 404 ao atualizar a página. Crie um arquivo chamado .htaccess na sua pasta public do projeto com este conteúdo:



  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]


ATENÇÃO

  1. Verifique se o nome da pasta de saída no seu projeto é realmente dist (padrão do Vite) ou build.
  2. Certifique-se de que as Secrets (FTP_SERVER, FTP_USERNAME, FTP_PASSWORD) foram adicionadas corretamente no GitHub.
  3. Faça o git push e acompanhe a "mágica" na aba Actions.

Feito!