A Web Esquecida do Lado do Cliente: Por que Ninguém se Importa com Tempos de Carregamento Lento?

2025-08-23

Este artigo aborda a questão frequentemente ignorada das más experiências na web do lado do cliente. Embora os problemas do lado do servidor frequentemente dominem as discussões, o autor destaca a negligência consistente de tempos de carregamento lentos, interfaces de usuário desajeitadas e outras frustrações do lado do cliente. Usando a atualização recente do Github como exemplo, muitos usuários relatam baixo desempenho, mas os operadores de sites priorizam as preocupações do lado do servidor. O autor argumenta que os sites detêm poder significativo, deixando os usuários com boicotes como seu único recurso, que são amplamente ineficazes. Os sites geralmente carecem de medição eficaz da rotatividade de usuários, contribuindo para sua apatia em relação às experiências do lado do cliente. Por fim, o autor admite ter tomado decisões editoriais que podem afetar negativamente os usuários, mas as enquadra como um compromisso necessário.

Leia mais
Desenvolvimento lado do cliente

Replicando o pflog do OpenBSD no Linux: nftables e ulogd2

2025-08-16

Este artigo detalha como replicar a conveniente funcionalidade pflog do OpenBSD e FreeBSD no Linux usando nftables e ulogd2 para registro e análise de pacotes de rede. Ao adicionar instruções 'log group' às regras do nftables e encaminhar logs para diferentes sockets netlink, você pode usar o tcpdump para monitoramento ao vivo e o ulogd2 para registro em disco. O artigo descreve a configuração do ulogd2, o registro em arquivos pcap e observa as limitações e alternativas ao ulogd2.

Leia mais
Desenvolvimento

A Persistência Inesperada de Servidores de Login Unix Tradicionais

2025-08-03

O autor explora o uso contínuo surpreendente de servidores de login Unix tradicionais em uma reconstrução hipotética de seu ambiente de computação como um desenvolvimento moderno e de campo aberto. Apesar da prevalência da virtualização de contêineres, eles mantêm dois tipos: um servidor de uso geral com limites de CPU e RAM, e servidores de computação que oferecem acesso a recursos irrestritos. Embora o uso tenha diminuído, esses servidores permanecem surpreendentemente relevantes, particularmente para SSH em máquinas internas ou para executar backends para ambientes de desenvolvimento como VSCode. O autor também observa o uso de servidores de login para trabalhos cron e o motivo pelo qual os usuários armazenam código em servidores de arquivos, o que está intimamente ligado ao uso de seu cluster SLURM e servidores de computação. A falta de um modelo de suporte robusto dificulta o rastreamento do uso exato.

Leia mais

Parsers de descida recursiva: simplicidade vence a complexidade?

2025-07-28

O autor explora abordagens para analisar linguagens de computador, comparando especificamente analisadores descendentes recursivos com geradores de analisadores LR. Embora os geradores de analisadores LR manipulem gramáticas mais complexas, o autor prefere analisadores descendentes recursivos devido à sua facilidade de uso, à falta de dependência de ferramentas externas e à capacidade de serem escritos diretamente na linguagem de destino, minimizando assim a curva de aprendizado e os desafios de depuração. Para desenvolvedores que ocasionalmente precisam construir analisadores para pequenas linguagens, a simplicidade e a facilidade de uso dos analisadores descendentes recursivos superam suas limitações no tratamento de gramáticas complexas.

Leia mais

Depurando scripts Bash: Lidando graciosamente com erros de `set -e`

2025-07-27

Este artigo apresenta uma boa técnica para lidar graciosamente com erros acionados por `set -e` em scripts Bash. Usando `trap 'echo "Exit status $? at line $LINENO from: $BASH_COMMAND"' ERR`, você pode imprimir informações como o número da linha de erro, o comando com falha e o status de saída quando o script encontra um erro, facilitando a depuração. Isso utiliza recursos específicos do Bash: as variáveis de ambiente `$LINENO`, `$BASH_COMMAND` e a condição de trap `ERR`. Outros shells como sh podem se comportar de forma diferente e podem não suportar totalmente esta funcionalidade.

Leia mais
Desenvolvimento depuração de scripts

A Limitação Curiosa do errno(3) no Linux

2025-07-04

A página de manual do errno(3) do Linux revela uma limitação peculiar: errno pode ser modificado mesmo em chamadas de função bem-sucedidas, e nunca é definido como zero por nenhuma chamada de sistema ou função de biblioteca. Isso decorre do design tradicional do Unix, onde as chamadas de sistema geralmente retornam errno apenas em caso de falha, deixando-o inalterado em caso de sucesso. Funções de biblioteca C podem fazer várias chamadas de sistema, algumas das quais podem falhar sem afetar o sucesso geral da função de biblioteca, deixando errno com o valor de falha. ANSI C e POSIX herdaram esse comportamento, exigindo que errno seja significativo apenas quando uma função falha e sua documentação especifica a definição de errno.

Leia mais
Desenvolvimento

A Ascensão Inesperada dos Terminais X: Não Fazia Parte do Design Inicial do X

2025-06-23

O X não foi inicialmente projetado para uso com terminais X. Os sistemas X iniciais rodavam em estações de trabalho completas; mesmo as sem disco, embora dependessem de servidores para tarefas pesadas, ainda tinham um ambiente Unix local completo. Os terminais X chegaram muito mais tarde, somente após o sucesso do X como um sistema de janelas Unix multi-fornecedor. A NCD, possivelmente entre as primeiras a produzir terminais X, foi fundada em 1987, mas provavelmente não lançou um produto até 1989. Isso é ainda mais comprovado pela chegada tardia do XDM (X Display Manager), lançado com o X11R3 em outubro de 1988. Embora tecnicamente possível usar terminais X sem o XDM, sua presença simplificou muito o processo, indicando que a adoção de terminais X atrasou em relação à maturação do próprio X.

Leia mais
Tecnologia Terminais X

Rebelião de mantenedores de código aberto: o único mantenedor do libxml2 não mais prioriza problemas de segurança

2025-06-19

O único mantenedor do libxml2 anunciou que não mais tratará problemas de segurança de forma diferente de bugs, gerando debates na comunidade de código aberto. O autor argumenta que isso reflete o crescente descontentamento entre os mantenedores com relação à exploração corporativa de software de código aberto. Uma distinção é feita entre o código aberto pessoal e cooperativo (por exemplo, Debian, BSD) e o uso corporativo de código aberto para fins lucrativos. O autor prevê um futuro em que a comunidade de código aberto enfatizará cada vez mais essa distinção, potencialmente alterando as interações com as corporações.

Leia mais
Desenvolvimento manutenção da comunidade

WireGuard: Saturação de Banda de 1 Gbps Alcançada

2025-06-17

O autor sempre achou que a criptografia era muito lenta para atingir a saturação da rede, mesmo em Gigabit Ethernet. No entanto, testes recentes revelaram que o WireGuard, rodando em servidores comuns (Xeon E-2226G), facilmente saturou uma rede de 1 Gbps sem ajustes especiais, exibindo baixo uso da CPU. Isso desafiou as suposições do autor sobre a velocidade de criptografia, sugerindo que muitos métodos poderiam teoricamente saturar um link de 1 Gbps, e destacando a necessidade de ajuste de desempenho para servidores VPN existentes.

Leia mais

Limitação de Aninhamento de Grupos Mutuamente Exclusivos do Argparse: Um Enigma Frustrado

2025-06-14

O módulo argparse do Python, embora ofereça recursos convenientes para lidar com argumentos de linha de comando, incluindo grupos mutuamente exclusivos, possui uma limitação frustrante quando se trata de aninhamento. Considere um programa com várias configurações de tempo limite em que os usuários podem ajustar tempos limite individuais ou desativá-los completamente. O argparse não suporta aninhar uma opção 'sem tempo limite' dentro de um grupo de opções de tempo limite individuais, tornando a configuração complicada. Embora você possa aninhar um grupo mutuamente exclusivo dentro de um grupo regular, o inverso não é suportado, e a documentação oficial afirma explicitamente essa limitação. Isso obriga os desenvolvedores a verificar manualmente se determinadas opções foram usadas, adicionando complexidade.

Leia mais
Desenvolvimento

Inode 0 do Unix: Um canto esquecido

2025-06-02

Este artigo explora as limitações dos números de inode em sistemas Unix antigos e o caso especial do inode 0. O autor descobriu que, embora o padrão POSIX não proíba explicitamente o uso do inode 0, muitos sistemas e programas podem depender de números de inode diferentes de zero na prática. Usar o inode 0 pode levar a comportamentos inesperados, pois alguns programas podem interpretá-lo como um sinal de 'arquivo não encontrado'. Embora seja possível experimentar com o inode 0 usando sistemas de arquivos no espaço do usuário, isso não é recomendado devido a potenciais problemas de compatibilidade e resultados imprevisíveis.

Leia mais
Desenvolvimento

Corrida Armamentista de Prova de Trabalho em JavaScript Contra LLMs

2025-05-28

Sites estão cada vez mais usando sistemas de prova de trabalho baseados em JavaScript, como o Anubis da Xe Iaso, para combater LLMs e raspadores da web agressivos. No entanto, os LLMs podem usar máquinas comprometidas para obter uma grande quantidade de poder de CPU para resolver esses desafios. O problema é que os LLMs operam em um ambiente hostil, tornando difícil distinguir uma prova de trabalho genuína de JavaScript malicioso. Isso expõe os LLMs à mineração de CPU ou outros ataques. Tentar identificar sistemas de prova de trabalho é um jogo perdido para os LLMs, pois atores maliciosos têm um incentivo para imitá-los. Isso cria uma corrida armamentista entre sites e LLMs, cada um tentando otimizar o uso de recursos enquanto protege seus interesses.

Leia mais
Desenvolvimento

A Evolução dos Limites de Tamanho de Nome de Arquivo do Unix

2025-05-25

As versões iniciais do Unix tinham limites de tamanho de nome de arquivo surpreendentemente curtos: inicialmente apenas 8 bytes, depois aumentando para 14. Isso estava ligado ao design simples da estrutura de diretórios do Unix. O artigo mergulha nas estruturas de diretórios do Unix V4 e anteriores, explicando os motivos por trás da evolução do limite de tamanho de nome de arquivo e como as entradas de diretório de 16 bytes se encaixam melhor em blocos de disco de 512 bytes. Também aborda o número limitado de inodos no Unix inicial, refletindo algumas das limitações codificadas de sistemas antigos.

Leia mais
Desenvolvimento história do Unix

Os Perigos de Ordenar Endereços IPv6 com Ferramentas Unix

2025-05-19

Este artigo explora os desafios de ordenar endereços IPv6 usando ferramentas de linha de comando Unix padrão, como 'sort'. As complexidades surgem da representação hexadecimal do IPv6, zeros iniciais ausentes e a notação abreviada '::'. O autor argumenta que uma solução direta requer transformar endereços IPv6 em sua forma completa e expandida ou usar uma linguagem de programação como Perl ou Python para classificação eficaz, pois os utilitários Unix existentes são mal equipados para lidar diretamente com as nuances da formatação de endereços IPv6.

Leia mais

Arquitetura de Processo Único: Uma Solução Elegante para o Desenvolvimento Web Moderno

2025-04-21

Ao atualizar o software de seu blog, o autor descobriu que uma arquitetura de processo único é mais simples do que sua abordagem baseada em CGI para lidar com as complexidades da web moderna. Um único processo permite acesso fácil ao estado compartilhado, simplificando tarefas como detecção de tráfego malicioso, limitação de taxa de solicitações e implementação de cache. Embora o uso de memória e CPU sejam preocupações, a facilidade de implementação torna uma arquitetura de processo único vantajosa ao lidar com várias formas de abuso, especialmente aquelas imprevisíveis. O autor acredita que, à medida que o abuso na web aumenta, as arquiteturas de processo único se tornarão cada vez mais importantes.

Leia mais

Paradoxo de Compressão ZFS: Blocos Lógicos vs. Blocos Físicos

2025-04-17

Um arquivo zero de 256 KB criado com `dd` em um sistema de arquivos ZFS com compressão habilitada exibe um comportamento intrigante: `ls -l` mostra seu tamanho como 256 KB, mas `ls -s` e `ls -slh` mostram um tamanho muito menor, quase zero. Isso se deve à compressão eficiente do ZFS, resultando em um número mínimo de blocos físicos. O artigo explora três maneiras de medir o tamanho do arquivo: tamanho lógico (em bytes), contagem de blocos físicos e contagem de blocos lógicos. Ele destaca que o campo `st_blocks` do POSIX não especifica qual tamanho relatar, levando a mudanças potenciais no valor de `st_blocks` ao mover arquivos entre sistemas de arquivos, e até mesmo a uma possível expansão do tamanho do arquivo excedendo a capacidade do novo sistema de arquivos.

Leia mais
Desenvolvimento

Uma Abordagem Pessoal para Gerenciamento de Pacotes Unix

2025-04-13

O autor compartilha um método inteligente para gerenciar pacotes de software pessoais em sistemas Unix. Ele usa uma árvore de diretórios `~/lib/` para armazenar software para diferentes arquiteturas, com cada programa instalado em um subdiretório separado e versionado (por exemplo, `emacs-30.1`). Um diretório `~/bin/bin.` contém links simbólicos ou scripts de wrapper apontando para esses programas, permitindo a troca fácil entre versões. Para ferramentas como pipx e Cargo, o autor mantém seus locais de instalação padrão, mas cria links em `~/bin/bin.` para evitar conflitos de caminho. Essa configuração não é perfeita, mas é muito útil para gerenciar software indisponível por meio do gerenciador de pacotes do sistema ou que seja muito antigo.

Leia mais
Desenvolvimento gerenciamento de software

Bug misterioso de desativação de senha SSH no Ubuntu 24.04

2025-04-06

Desativar o acesso por senha SSH na internet, enquanto permitia na LAN local, em um servidor Ubuntu 24.04, parecia simples usando o sshd_config. No entanto, um arquivo de configuração personalizado em /etc/ssh/sshd_config.d/ foi ignorado após a reinicialização do daemon SSH. O culpado foi a regra de configuração 'o primeiro que chega é o primeiro que serve' do sshd_config, e um arquivo '50-cloud-init.conf' gerado pelo sistema contendo 'PasswordAuthentication yes', que foi carregado antes do arquivo personalizado. Renomear o arquivo de configuração personalizado para '10-no-passwords.conf' resolveu o problema, garantindo que ele fosse carregado primeiro.

Leia mais
Desenvolvimento Configuração do servidor

Superdimensionamento de Fibra: É Melhor Prevenir do que remediar

2025-03-25

Ao planejar cabeamento de fibra entre salas ou edifícios, seja cauteloso e instale mais fibra do que você precisa inicialmente. Expansões futuras, atualizações de largura de banda e novos protocolos exigem capacidade extra. Além disso, falhas de fibra acontecem — às vezes inexplicavelmente — e ter pares de reserva permite uma recuperação rápida. Embora fibras monomodo e multimodo tenham aplicações diferentes, ter redundância suficiente é crucial para minimizar o tempo de inatividade e os custos.

Leia mais

Metadados estruturados do Loki: Um pesadelo logístico

2025-03-19

O Grafana Loki, muitas vezes chamado de 'Prometheus para logs', inicialmente adotou um modelo de dados semelhante ao Prometheus. No entanto, isso se mostrou desastroso para logs do sistema (syslog ou systemd journal). Ao contrário do Prometheus, o Loki armazena cada conjunto de valores de rótulo separadamente e não compacta o armazenamento de logs, levando a explosões de cardinalidade. Para resolver isso, o Loki introduziu 'metadados estruturados', mas a partir da versão 3.0.0, ele permanece subdesenvolvido. Os rótulos de metadados estruturados não são tratados como rótulos Loki regulares, exigindo sintaxe de consulta diferente. A migração de rótulos existentes é complexa e potencialmente desastrosa, com o risco de criar inadvertidamente rótulos de alta cardinalidade. A atualização requer cuidado, a migração de dados existentes é incrivelmente cara e uma consideração cuidadosa é crucial antes de usá-lo em novos projetos.

Leia mais
Desenvolvimento logs logs do sistema

JSON: Uma escolha prática para saída legível por máquina no Unix

2025-02-24

O autor defende o uso de JSON como formato de saída legível por máquina, baseado em sua experiência ao excluir emails de uma fila de correio Postfix. Embora não seja perfeito, o JSON oferece várias vantagens práticas em sistemas Unix: clareza, ampla compatibilidade, suporte abrangente de ferramentas e fácil conversão para outros formatos. Para novos programas, o autor sugere que usar apenas JSON é a abordagem mais simples, evitando as complexidades de projetar formatos personalizados e promovendo a interoperabilidade entre programas Unix.

Leia mais

Caches Gigantes Ocultos: Por que seu espaço em disco está desaparecendo?

2025-02-08

Muitos programas Unix armazenam dados em cache em diretórios ocultos `.cache` e `.local`, dificultando para os usuários encontrarem e limparem esses arquivos de cache grandes que consomem espaço significativo em disco. O autor testemunhou em primeira mão como estudantes de pós-graduação em um ambiente de servidor de arquivos compartilhado ficaram perplexos com esses caches ocultos, com centenas de GB de espaço em disco sendo consumidos sem que eles soubessem. O artigo apela para que os desenvolvedores armazenem caches em diretórios visíveis e sugere que as ferramentas de uso de espaço em disco mostrem explicitamente o conteúdo desses diretórios ocultos para ajudar no gerenciamento do espaço em disco do usuário.

Leia mais

Ataque de phishing sofisticado usa acesso VPN

2025-01-29

O departamento de Ciência da Computação da Universidade de Toronto foi atingido por um ataque de phishing altamente sofisticado. O atacante falsificou um endereço de e-mail do departamento, obtendo com sucesso a senha de um usuário. O que é alarmante é que o atacante usou as credenciais roubadas para rapidamente registrar o usuário na VPN do departamento e, em seguida, usou o gateway SMTP interno para enviar spam. Isso demonstra o reconhecimento pré-ataque do ambiente de VPN e e-mail do alvo, destacando técnicas de ataque cada vez mais avançadas e a necessidade de defesas de segurança cibernética robustas.

Leia mais
Tecnologia exploração de VPN

Desabilitando a autenticação por senha para SSH com acesso à Internet: aumento de segurança ou exagero?

2025-01-18

Este artigo analisa os prós e contras de desabilitar a autenticação por senha para SSH com acesso à Internet. Embora senhas fortes ofereçam proteção contra ataques de força bruta, o autor argumenta que desabilitar a autenticação por senha fornece camadas extras de segurança contra credenciais roubadas, vulnerabilidades do servidor SSH e ataques direcionados a contas padrão. No entanto, isso também introduz inconvenientes, como a incapacidade de fazer login sem um par de chaves. O autor sugere uma consideração cuidadosa das compensações com base nas circunstâncias individuais.

Leia mais

/etc/glob: A história não contada do globbing de shell no Unix antigo

2025-01-13

Este artigo investiga a história e a função de `/etc/glob` em sistemas Unix antigos. Antes do V7 Bourne Shell, a expansão de caracteres curinga (globbing) no shell Unix não era gerenciada pelo próprio shell, mas sim delegada ao programa externo `/etc/glob`. O `/etc/glob` recebia o comando e os argumentos, expandia os caracteres curinga e, em seguida, executava o comando. O artigo detalha como o `/etc/glob` funcionava em diferentes versões do Unix, incluindo o tratamento de caracteres escapados e a justificativa para o uso de um programa externo — provavelmente devido a restrições de recursos em sistemas antigos.

Leia mais
Desenvolvimento História do Unix

Complexidade da Configuração do WireGuard: Do Simples ao Avançado

2025-01-05

Esta postagem de blog explora várias complexidades de configuração do WireGuard, variando da mais simples, com espaços de endereço IP interno completamente isolados, à configuração de 'VPN' mais desafiadora, onde alguns endpoints são acessíveis dentro e fora do túnel WireGuard. O autor detalha a dificuldade e os problemas potenciais de cada configuração, como conflitos de roteamento e roteamento recursivo. O artigo enfatiza a importância do planejamento antecipado e sugere optar por configurações mais simples para evitar roteamento complexo ao projetar um ambiente WireGuard.

Leia mais
Desenvolvimento Configuração de Rede

Problema em potencial com importação/exportação zpool no Linux OpenZFS

2024-12-26

Existe um problema potencial nas versões Linux OpenZFS (a partir da 2.3.0) em relação à importação e exportação de pools ZFS. Mesmo que nenhum sistema de arquivos dentro de um pool ZFS tenha a propriedade 'sharenfs' definida, `zpool import` e `zpool export` ainda executam `exportfs -ra`. Isso pode apagar exportações NFS adicionadas ou modificadas manualmente, afetando ambientes como sistemas de alta disponibilidade que usam configurações de exportação NFS personalizadas. O problema decorre do OpenZFS executar cegamente `exportfs -ra`, independentemente de as exportações NFS precisarem ser alteradas.

Leia mais
Desenvolvimento

Falha na reinicialização do servidor: Reinicialização com resfriamento resolve travamento do kernel

2024-12-25

O autor encontrou dois servidores idênticos com travamentos do kernel que não podiam ser resolvidos com uma simples reinicialização. Durante a falha, os servidores imprimiram uma série de erros de exceção de verificação de máquina na fase do firmware do sistema, apontando para problemas de hardware da CPU. Um período de resfriamento de alguns minutos após desligar, seguido de uma reinicialização, resolveu o problema. Isso demonstra que mesmo uma breve interrupção de energia pode não redefinir completamente certos componentes do sistema x86, exigindo um período de resfriamento para recuperação completa.

Leia mais

Segunda vida de um servidor de arquivos de uma década: solução de armazenamento de baixo custo

2024-12-17

Uma empresa ainda está executando em produção uma máquina, um servidor de arquivos com mais de uma década de idade. Embora desatualizado, com um BMC que requer Java para KVM-over-IP, seus 16 compartimentos de disco e portas Ethernet de 10G o tornam ideal para reaproveitamento. Usado como um servidor de armazenamento de baixo custo com disco próprio, ele atende à necessidade de armazenamento de alta capacidade e baixo desempenho, apesar da sua idade e RAM limitada. Isso destaca o valor do reaproveitamento de hardware antigo quando os requisitos se alinham.

Leia mais

Reinicializações Agendadas: Uma Abordagem Preventiva

2024-12-13

Uma equipe de pesquisa universitária enfrentou um problema desafiador de administração de sistemas: seus servidores estavam funcionando há muito tempo e precisavam ser reinicializados, mas reinicializações frequentes interrompem a experiência do usuário. Seu padrão era evitar reinicializações, mas uma reinicialização em larga escala recente devido ao tempo de atividade prolongado forçou uma mudança. Para evitar problemas semelhantes, eles decidiram um cronograma de reinicialização anual — pelo menos três vezes por ano, alinhando-se com o cronograma de ensino da universidade — equilibrando a manutenção preventiva com a experiência do usuário.

Leia mais