"É preciso escrever testes" é um conselho inútil sem a segunda metade: quais . Escrever os errados custa tempo, dá falsa confiança e trava as alterações que devia proteger. 1. Os três andares Unitários — uma função, sem base de dados nem rede. Milissegundos. É onde se testam as regras: cálculos, val…
Ler o artigo→Duas técnicas para o mesmo problema — um evento que dispara vezes de mais — e que resolvem casos diferentes. Trocá-las dá sempre uma sensação estranha na interface. Debounce: espera que pare . Só executa quando as coisas acalmam. Throttle: executa durante , mas no máximo uma vez a cada X. 1. Debounc…
Ler o artigo→Um formulário de upload é um convite para pôr ficheiros no seu servidor. Vale a pena aceitar com regras. 1. A extensão não prova nada Mudar virus.php para foto.jpg demora um segundo. O que se verifica é o conteúdo : os primeiros bytes de um ficheiro dizem o que ele é. // Assinaturas: os primeiros by…
Ler o artigo→Há um reflexo antigo em JavaScript: precisa de formatar uma data, instala uma biblioteca. Só que o objeto Intl está no browser e no Node há anos, sabe o que é o português europeu, e não pesa um byte no bundle. 1. Datas const data = new Date('2026-04-07T15:30:00'); new Intl.DateTimeFormat('pt-PT').fo…
Ler o artigo→A ligação está lenta, a pessoa carrega em "Pagar", não acontece nada visível, e carrega outra vez. Ou o telemóvel perde a rede a meio e a aplicação repete o pedido sozinha. Em qualquer dos casos, o servidor recebe dois pedidos iguais — e a pergunta é se isso faz duas encomendas. 1. O que a palavra q…
Ler o artigo→Escreve-se um LEFT JOIN precisamente para incluir as linhas que não têm par do outro lado. E depois acrescenta-se uma condição no WHERE que as deita todas fora, sem uma palavra de aviso. 1. O que se queria -- Todos os artigos, com o número de comentários aprovados SELECT a.titulo, count(c.id) AS com…
Ler o artigo→A paginação por OFFSET é a primeira que se aprende e a que está em quase todo o lado. Funciona bem — e degrada-se de uma forma que só se nota quando a tabela cresce. 1. O problema SELECT * FROM artigos ORDER BY publicado_em DESC LIMIT 20 OFFSET 10000; A base não salta 10 000 linhas: lê-as e deita-as…
Ler o artigo→O CSS sempre soube descer: escolher os filhos de um elemento, os irmãos a seguir, os descendentes. Nunca soube subir — não havia forma de dizer "o cartão que tem uma imagem lá dentro". O :has() resolve isso, e está em todos os browsers atuais. 1. Ler ao contrário /* Um cartão que tenha imagem fica c…
Ler o artigo→Os registos servem para responder a uma pergunta que se faz sempre tarde: o que é que aconteceu às 3 da manhã? Um registo que não responde a isso é papel; um que responde de mais é um problema legal. 1. Níveis, e o que cabe em cada um error — falhou e alguém tem de saber. Uma exceção, uma gravação r…
Ler o artigo→O async/await tornou o código assíncrono legível como se fosse sequencial. E é precisamente por parecer sequencial que se cometem estes quatro erros — todos eles passam despercebidos em desenvolvimento. 1. Esperar por coisas que não dependem umas das outras // 900 ms: três esperas de 300 ms, uma atr…
Ler o artigo→As expressões regulares têm fama de ilegíveis, e a culpa é de quem as usa para o que não devem. Com meia dúzia de construções resolve-se a esmagadora maioria dos casos do dia-a-dia. 1. Classes: que caracteres /[aeiou]/ // um destes /[^aeiou]/ // qualquer um menos estes /[a-z0-9]/ // intervalos /\d/ …
Ler o artigo→Durante anos, pôr um modal numa página significava escolher uma biblioteca — ou reescrever à mão o mesmo conjunto de problemas: o fundo escurecido, o foco preso lá dentro, o Escape a fechar, o scroll da página por trás. O elemento <dialog> traz isso tudo de origem, e está em todos os browsers atuais…
Ler o artigo→Uma cópia de segurança à noite, uma limpeza ao domingo, um relatório às segundas. Há duas formas de agendar isto num servidor Linux, e a escolha tem menos a ver com gosto do que parece. 1. Cron: cinco campos e está feito crontab -e # minuto hora dia mês dia-da-semana 0 3 * * * /opt/scripts/backup.sh…
Ler o artigo→O código faz-se voltar atrás com um git revert . O esquema da base, não. É a assimetria que explica todas as regras que se seguem. 1. Repor a imagem anterior não repõe o esquema Num deploy típico, as migrações correm no arranque e o código novo entra a seguir. Se algo correr mal e a imagem for rever…
Ler o artigo→Um servidor com autenticação por password na porta 22 recebe milhares de tentativas por dia, todos os dias, de robôs que não sabem que ele existe — encontram-no a varrer a internet. As chaves resolvem isso e ainda são mais cómodas. 1. Criar o par ssh-keygen -t ed25519 -C "portatil-do-francisco" Fica…
Ler o artigo→Ao criar uma chave estrangeira, há uma decisão que muita gente deixa passar em branco: o que fazer aos filhos quando o pai é apagado. O silêncio também é uma escolha — e nem sempre a certa. 1. As três respostas -- Recusa apagar o pai enquanto houver filhos (a predefinição) ON DELETE RESTRICT -- Apag…
Ler o artigo→Um certificado custava dinheiro, chegava por email e renovava-se à mão uma vez por ano — normalmente no dia seguinte a ter expirado. Hoje é gratuito e automático, e vale a pena saber o que se passa por baixo. 1. Para que serve, ao certo Cifra o que vai e vem, para ninguém pelo caminho ler nem altera…
Ler o artigo→É uma das decisões mais baratas de tomar no início e mais caras de corrigir depois: em que fuso horário é que as datas ficam guardadas. A resposta é sempre UTC , e converte-se para o fuso de quem lê no último momento possível — na altura de mostrar. 1. Porque é que o fuso local não serve O servidor …
Ler o artigo→Escreve-se um endereço e a página aparece. Pelo meio há uma cadeia de perguntas que vale a pena conhecer — nem que seja para saber onde olhar quando um site "não abre só para si". 1. A cadeia O browser precisa de um número — 185.199.108.153 — e só tem um nome. Para o descobrir, pergunta a um resolve…
Ler o artigo→Aparece num site antigo, numa importação de CSV, num email. E não é um caractere estranho — é a mesma letra , lida com a tabela errada. 1. O que se passa Em UTF-8, o "ç" não cabe num byte: são dois, 0xC3 e 0xA7 . Se alguém ler esses dois bytes como se fossem Latin-1 — uma tabela onde cada byte é uma…
Ler o artigo→