Está-se a meio de uma alteração e chega uma correção urgente noutro ramo. As respostas habituais são três: guardar na pilha, fazer um commit a meio, ou clonar o repositório outra vez. Há uma quarta, e resolve melhor do que as três. git worktree add ../projeto-correcao main Uma segunda pasta de traba…
Ler o artigo→O certificado renova-se sozinho durante dois anos. Depois falha num sábado, e descobre-se porque alguém não conseguiu abrir o site — não porque algum aviso tenha chegado. A renovação automática é uma tarefa agendada cuja saída ninguém lê. Funciona enquanto funciona, e o silêncio é igual nos dois cas…
Ler o artigo→Há um tipo neste projeto que paga sozinho o preço de aprender isto: export type Sondagem = NonNullable<Awaited<ReturnType<typeof lerSondagem>>>; Lê-se de dentro para fora: o que a função devolve, retirado de dentro da promise , com o null removido. Três utilitários encadeados, uma linha, e zero manu…
Ler o artigo→Há uma linha no CSS deste site que resume o que mudou no CSS da última década: --cor-tag: oklch(0.45 0.13 var(--tom-tag, 144)); Uma propriedade personalizada a servir de argumento a uma função de cor. Não é um valor com nome — é uma entrada num cálculo que o browser faz. 1. O que aquela linha resolv…
Ler o artigo→Um segredo chega a um processo em produção por uma de três vias: uma variável de ambiente, um ficheiro montado, ou um cofre consultado no arranque. As três funcionam. O que as distingue é como falham , e é por aí que se escolhe. 1. Variáveis de ambiente A via mais simples, e a mais usada. O preço é …
Ler o artigo→O git stash é uma pilha, não um ramo. Guarda o que está alterado, devolve a árvore ao estado do último commit , e fica à espera. É cómodo, e é o comando com que mais trabalho se perde — por três razões que não são óbvias. 1. Os ficheiros novos não vão lá dentro Esta é a que custa trabalho a sério. O…
Ler o artigo→Entre o pedido da página e a letra chegar há um intervalo, e o browser tem de decidir o que mostrar nesse intervalo. Há duas respostas possíveis, as duas feias, e os nomes delas são a primeira coisa que convém saber para escolher. 1. FOIT e FOUT FOIT — flash of invisible text . O browser esconde o t…
Ler o artigo→A discussão costuma ser entre inteiro e UUID, e costuma ser decidida pelo tamanho — 4 bytes contra 16. O tamanho é a parte menos interessante. O que custa a sério é outra coisa, e quase nunca aparece na conversa. 1. O custo que ninguém mede: onde a linha aterra no índice Uma chave primária é um índi…
Ler o artigo→Num servidor pessoal não vai haver observabilidade. Não há tempo, não há necessidade, e montar três contentores de métricas para um blogue é um passatempo — legítimo, mas é um passatempo e não monitorização. O objetivo é mais modesto e mais útil: saber antes de quem visita . E isso cabe em três perg…
Ler o artigo→O npm audit diz dezassete vulnerabilidades, três críticas. Ninguém lê, e há uma razão legítima para isso: o número está quase sempre a medir uma coisa diferente daquela que interessa. 1. Porque é que o número é inútil assim Duas razões, e as duas são estruturais. A primeira: o relatório cobre a árvo…
Ler o artigo→O strict: true não é uma opção. São oito, ligadas de uma vez, e tratá-las como um interruptor só é a razão por que tanta gente não consegue ligá-lo num projeto que já existe. Também não é o fim da linha: há meia dúzia de verificações que o strict não liga, e é lá que estão os erros que sobram depois…
Ler o artigo→O browser já sabe validar um formulário. Faz isso sem uma linha de JavaScript, na língua de quem visita, com mensagens que um leitor de ecrã anuncia e com o foco a ir para o campo errado. É de graça, e metade da web reescreve isso à mão por cima. Vale a pena saber exactamente até onde isso chega — e…
Ler o artigo→Uma ligação ao Postgres não é um objeto: é um processo do lado do servidor, com a sua memória. Daí o preço, e daí a conta que quase ninguém faz antes de a base começar a recusar trabalho. E o erro não aparece onde se espera. A base não fica lenta — fica a dizer que já tem clientes suficientes, enqua…
Ler o artigo→A regra é uma só, e explica toda a confusão que vem a seguir: o .gitignore só se aplica a ficheiros que o Git ainda não está a seguir. A partir do momento em que um ficheiro foi comitado uma vez, está dentro — e a linha que o manda ignorar passa a ser, ela própria, ignorada. 1. Como é que isto se no…
Ler o artigo→Começo pela parte honesta, que é a que falta em quase tudo o que está escrito sobre isto: um docker compose up -d para o contentor antigo e arranca o novo . Há um intervalo. São segundos, mas existem, e chamar-lhe «sem interrupção» é mentira. O que um guião de deploy bem feito compra não é um interv…
Ler o artigo→Escapar à saída é a primeira linha de defesa contra o XSS, e é a que resolve o problema. O Content-Security-Policy é a segunda: serve para o dia em que uma coisa escapou, e o script injetado já está na página a tentar correr. Não impede o furo — impede que o furo sirva para alguma coisa. É também o …
Ler o artigo→Uma imagem mal servida custa duas coisas diferentes, e só uma delas se mede em quilobytes. A outra é o salto que a página dá quando ela finalmente chega — e essa quem a sofre é quem já estava a ler. 1. Os formatos, em três linhas AVIF para fotografia, quando se pode gerar: poupa à volta de metade do…
Ler o artigo→O Context resolve um problema: entregar um valor a um componente fundo na árvore sem o passar à mão por todos os que estão pelo caminho. Não é mais do que isso — e sobretudo não é gestão de estado. É dessa confusão que vem quase tudo o que corre mal com ele. O estado continua a viver num useState ac…
Ler o artigo→Apagar uma linha é definitivo, e por isso quase ninguém apaga. Acrescenta-se uma coluna: um booleano, um valor por omissão, uma migração de uma linha. A decisão parece barata — e é, naquele dia. A conta vem depois, e vem em cada consulta que se escrever a partir dali. Este site passou por isto em se…
Ler o artigo→