O sintoma aparece sempre da mesma maneira. O contentor escreve numa pasta montada, vai-se ver ao anfitrião, e os ficheiros pertencem a um número em vez de a uma pessoa: ls -l dados/ # -rw-r--r-- 1 999 999 8192 Sep 13 10:14 base.db Ou então o contrário: a pasta é sua, tem as permissões certas, e o co…
Ler o artigo→Um hook do Git é um executável que o Git corre num momento da vida dele: antes de gravar um commit, depois de mudar de ramo, antes de enviar para o servidor. Vivem em .git/hooks — e é aí que começa o problema, porque a pasta .git não vai no repositório. Um hook escrito por si fica só na sua máquina.…
Ler o artigo→Um formulário em React era, durante anos, um useState por campo, um onChange por campo, e um onSubmit que fazia preventDefault e um fetch . Muito código para o que o HTML já sabia fazer sozinho desde 1995. O formulário de comentários deste site é o exemplo que vou usar até ao fim — e não tem um únic…
Ler o artigo→Os exemplos deste artigo são todos deste site — código que está a correr enquanto o lê, e não casos inventados para a ocasião. A ideia é uma só: no App Router do Next, um componente corre no servidor por omissão e nunca chega ao browser . Não é uma afinação de desempenho; muda o que se pode escrever…
Ler o artigo→Há duas formas de usar mal estes dois hooks, e são opostas. Uma é nunca lhes tocar e ter uma aplicação a arrastar-se. A outra — muito mais comum — é embrulhar tudo neles por precaução, e ficar com um código mais difícil de ler que continua exatamente igual de rápido. 1. O que fazem, em duas linhas /…
Ler o artigo→O useRef costuma ser apresentado como «a forma de chegar a um elemento do DOM». É um dos usos, e provavelmente nem é o mais frequente. O que um ref é, na verdade, é mais simples do que isso e explica tudo o resto: uma caixa que sobrevive aos renders e cuja alteração não provoca nenhum . 1. O estado …
Ler o artigo→Há um padrão que aparece em quase todos os projetos React com mais de um ano: um useEffect que observa um valor e escreve outro. Funciona — e é quase sempre a forma mais cara e mais frágil de fazer aquilo que se queria. Uma pergunta só resolve a maior parte destes casos: isto tem de acontecer porque…
Ler o artigo→O React 19 saiu em dezembro de 2024, e tem uma particularidade: a lista do que parte é tão interessante como a das novidades. A maior parte das aplicações atualiza sem drama — e as que não atualizam sem drama falham quase sempre pelas mesmas cinco razões. 1. O ref passa a ser uma prop como as outras…
Ler o artigo→Um ramo pode funcionar perfeitamente e continuar a ser mau de rever. Cinco commits chamados wip , wip2 , corrige typo e agora vai fazem exatamente o mesmo que três commits com uma ideia cada — só que custam o dobro a quem os lê. O git rebase -i serve para isso: arrumar antes de mostrar. Fica dito um…
Ler o artigo→Há um reflexo que quase toda a gente já teve pelo menos uma vez: alguma coisa não funciona por causa de permissões, escreve-se chmod 777 , e passa a funcionar. Resolveu — e é precisamente por resolver que o hábito pega. Vale a pena perceber o que os três números dizem, porque depois disso o 777 deix…
Ler o artigo→Os decorators são aquela sintaxe com @ por cima de uma classe ou de um método. Quem já usou Angular, NestJS ou TypeORM viu-os às dezenas — e quem nunca usou nenhum desses provavelmente nunca precisou de escrever um. Há uma confusão a arrumar primeiro: existem dois sistemas de decorators , incompatív…
Ler o artigo→Acontece a toda a gente. Um .env que escapou ao .gitignore , uma chave colada num ficheiro de configuração "só para testar", um token numa mensagem de commit. E há uma reação instintiva que é a errada. 1. A ordem certa é esta A primeira coisa não é limpar o histórico. É rodar o segredo . A partir do…
Ler o artigo→Há um padrão que qualquer pessoa que trabalhe com promessas já escreveu: criar uma promessa e guardar o resolve numa variável de fora, para a resolver mais tarde, a partir de outro sítio do código. Escrevia-se assim, e não era bonito: let resolver; let rejeitar; const promessa = new Promise((resolve…
Ler o artigo→A Temporal API é a nova especificação oficial do JavaScript (incorporada no ECMAScript 2026 depois de alcançar o Stage 4 em março de 2026), criada para substituir de vez o antigo e problemático objeto Date . Porque é que a Temporal API é revolucionária? Imutabilidade: qualquer alteração num objeto (…
Ler o artigo→O Set no JavaScript é um objeto global nativo que permite guardar valores únicos de qualquer tipo, sejam eles valores primitivos ou referências de objetos. Impede automaticamente a existência de elementos duplicados na coleção. Novas funcionalidades de conjuntos (Set) Aqui estão as novas operações n…
Ler o artigo→Não é para passar em entrevistas. É para responder à pergunta que aparece sempre: funcionava bem com cem registos, porque é que com dez mil demora meio minuto? 1. As quatro que aparecem mesmo O(1) — o tempo não depende do tamanho. Ir buscar a um Map , ler array[5] . O(n) — percorre tudo uma vez. Um …
Ler o artigo→A forma mais comum de os tipos e o código se afastarem é a duplicação. Escreve-se a forma de um artigo no modelo, e escreve-se outra vez — quase igual — no formulário, no pedido, na resposta. Depois acrescenta-se um campo num sítio e esquece-se nos outros. Os tipos utilitários do TypeScript existem …
Ler o artigo→As Core Web Vitals são três números que tentam responder a três perguntas de quem visita: já apareceu? , parou quieto? , responde quando toco? 1. LCP — já apareceu? Mede quanto tempo demora a desenhar o maior elemento visível: quase sempre a imagem de topo ou o título. O bom é 2,5 segundos . O que o…
Ler o artigo→São dois comandos parecidos com um propósito diferente, e trocá-los é a causa daquele clássico: "na minha máquina funciona" . 1. O que cada um faz ao lockfile npm install lê o package.json , resolve o que couber nos intervalos de versões, instala — e reescreve o package-lock.json se encontrar algo m…
Ler o artigo→Um pedido que já ninguém quer continua a ocupar ligação, a gastar bateria, e a chegar atrasado para escrever por cima de um resultado mais recente. O AbortController é a forma padrão de o cortar a meio — e não serve só para o fetch . 1. O básico const controlador = new AbortController(); fetch('/api…
Ler o artigo→