O TypeScript segue raciocínios simples sozinho. Um if que elimina o null faz com que, da chaveta para dentro, o valor deixe de ser nulo — e isso chama-se estreitamento. function saudar(nome: string | null) { if (nome === null) return; // aqui dentro, nome é string — sem ninguém o dizer return nome.t…
Ler o artigo→Há uma ideia generalizada de que pôr um valor numa variável de ambiente é pô-lo em segurança. Não é — é só tirá-lo do código. São coisas diferentes, e a diferença dá disgostos. 1. O caso que mais custa: o que é lido na construção Este site tem duas variáveis que parecem iguais a todas as outras e nã…
Ler o artigo→O programa funciona na máquina de quem o escreveu. Falta decidir quem o mantém de pé num servidor — e há três respostas comuns, cada uma com um custo diferente. 1. O que é preciso resolver A pergunta não é «qual é o melhor», é «o que é que isto tem de garantir». São sempre as mesmas cinco coisas: Vo…
Ler o artigo→A explicação habitual é que o package-lock.json serve para fixar versões. Está certa e é a menos importante — as versões já estão no package.json , e quem quiser fixá-las pode simplesmente tirar o ^ . O que ele faz de facto são três coisas, e nenhuma delas se consegue de outra maneira. 1. Fixa a árv…
Ler o artigo→Arranca-se um processo demorado por SSH, fecha-se a ligação, e no dia seguinte não há sinal dele. Acrescentar um & no fim não resolve — e perceber porquê explica todo o resto. 1. Porque é que o & não chega O & manda o processo para segundo plano, mas ele continua a pertencer àquela sessão. Quando a …
Ler o artigo→«O servidor está lento» é a queixa mais inútil que existe, porque pode ser meia dúzia de coisas completamente diferentes. O que serve é uma ordem fixa para as excluir, e cinco comandos chegam. 1. Há carga? uptime # 14:03:11 up 32 days, load average: 8.42, 6.15, 3.90 Os três números são a média de um…
Ler o artigo→O programa funciona. Falta pô-lo a correr no servidor, e a primeira tentativa é quase sempre esta: nohup node servidor.js & Aguenta-se até à primeira coisa a correr mal. Se o processo morrer, ninguém o levanta. Se a máquina reiniciar, ele não volta. A saída vai para um nohup.out que cresce sem limit…
Ler o artigo→A pergunta aparece sempre à mesma altura: chegou o momento de testar o código que fala com a base, e há que decidir contra o quê. As respostas habituais são três — uma base em memória, um duplo escrito à mão, ou a coisa a sério num contentor. 1. O argumento que decide É este, e resolve a maior parte…
Ler o artigo→Para um contentor só, o compose parece um docker run com mais passos. E, escrito dessa maneira, é mesmo — um ficheiro a mais para dizer o que um comando já dizia. O que o torna útil é outra coisa: deixa de ser a forma de arrancar alguma coisa e passa a ser o registo de como ela corre . Rede, polític…
Ler o artigo→Um teste que falha de vez em quando parece um mal menor: corre-se outra vez e passa. O custo real não é o tempo perdido — é o que ele ensina. Ao fim de duas semanas, a equipa aprendeu que o vermelho não quer dizer nada , e a partir daí a bateria de testes deixou de ser um sinal para passar a ser ruí…
Ler o artigo→O docker ps diz Up 4 hours e o site não responde. As duas coisas não se contradizem: «Up» só quer dizer que o processo número um ainda não morreu . Se ele estiver encravado à espera de uma ligação que nunca chega, continua vivo, e o Docker continua a dizer que está tudo bem. É para esse vão que exis…
Ler o artigo→Naquele docker build . que toda a gente escreve, o ponto final não quer dizer «o Dockerfile está aqui». Quer dizer: empacota esta pasta inteira e envia-a . Acontece antes de o Docker ler uma única linha do Dockerfile. Contei os ficheiros deste projeto para ver o que isso significa: node_modules 54 0…
Ler o artigo→Um mock serve para cortar uma dependência que não se pode ou não se deve tocar num teste: a rede, o relógio, o fornecedor de pagamentos. Dito assim parece só conveniência. É uma troca — e vale a pena saber o que se dá em troca de quê. 1. O que um mock é, de facto É uma suposição escrita em código . …
Ler o artigo→O docker ps não o mostra. O docker ps -a mostra, e diz Exited (127) 2 seconds ago . A partir daqui há uma ordem de perguntas que resolve quase todos os casos — e quase nenhuma delas começa por mexer no Dockerfile. 1. Primeiro, o que ele disse docker ps -a docker logs --tail 50 o-meu-contentor Um por…
Ler o artigo→Quando uma consulta fica lenta, a tentação é adivinhar: acrescentar um índice, reescrever o join , trocar o IN por um EXISTS . O Postgres tem uma forma de responder em vez de se adivinhar — basta pedir-lhe o plano. Os exemplos que se seguem saíram da base deste site, com os números reais que ela dev…
Ler o artigo→A key não existe para o React ser rápido. Existe para ele responder a uma pergunta: este elemento é o mesmo de antes, ou é outro? Entre dois renders há duas listas, e a key é a única coisa que liga os elementos de uma aos da outra. Quando se usa o índice como key , o que se está a dizer é «o terceir…
Ler o artigo→Há uma ideia errada sobre genéricos que explica quase todo o mau uso deles: a de que servem para aceitar qualquer coisa . Não servem. Para aceitar qualquer coisa há o unknown , e é mais honesto. Um genérico serve para ligar tipos uns aos outros — dizer que a saída desta função depende do que lhe ent…
Ler o artigo→Um dia actualiza-se uma dependência, corre-se o projeto, e aparece isto: Error [ERR_REQUIRE_ESM]: require() of ES Module /app/node_modules/chalk/source/index.js from /app/script.js not supported. A biblioteca passou a ser só ESM, e o projeto ainda usa require . É o ponto em que muita gente descobre …
Ler o artigo→O servidor pára, a aplicação começa a dar No space left on device , e o df confirma: 100%. Faz-se então a conta ao que lá está — e a conta não bate certo. O du soma metade do que o df diz estar ocupado. Há três razões possíveis para essa diferença, e nenhuma delas é óbvia. 1. Primeiro, o trivial: on…
Ler o artigo→Um teste normal dá uma entrada e espera uma saída. Serve para quase tudo, e tem um limite claro: só apanha aquilo que alguém se lembrou de verificar. Há outro género, que se vê pouco escrito e que resolve um problema diferente — guardar uma regra que não vive dentro de nenhuma função . Uma decisão d…
Ler o artigo→