Blog
Blog
Uma lista de artigos com notas técnicas e aprendizados de desenvolvimento.
Tags do blog- Política básica ao implementar um servidor API com Golang
Organizei minhas próprias políticas básicas ao escrever um servidor API em Go, incluindo binário único + cobra, foco na operação, separação HTTP/CLI, tratamento seguro de erros e desligamento normal.
- Guia de arquitetura para criar um app de autocontrole no iOS com a Screen Time API
Das armadilhas do NEDNSProxyProvider ao design com FamilyControls + ManagedSettings, passando pelas duas Shield Extensions, pelo handoff de desbloqueio com App Group e pelas limitações do Personal Team. Este artigo resume a visão completa de um app iOS de bloqueio usando a Screen Time API.
- Músicas K-POP que engenheiros de TI devem ouvir
5 faixas K-POP recomendadas com termos de TI e conceitos cibernéticos. O metaverso da aespa, o glitch do NCT DREAM, o "GPT" do STAYC e mais — música onde você sente a tecnologia através dos visuais e do som.
- TypeScript Monorepo Organizando a solução ideal edição 2026
Organizamos as funções do espaço de trabalho pnpm, Turborepo, TypeScript Project References, Biome e WXT e resumimos a solução simples de uso geral e a solução prática com uma estrutura de 4 pacotes.
- Implementar o handoff de desbloqueio da Shield Extension para o app principal via App Group
Não é possível iniciar o app principal diretamente a partir de ShieldActionDelegate. Este texto organiza um padrão de handoff em que a extensão grava um pedido de desbloqueio no armazenamento compartilhado do App Group e o app lê depois.
- Projete blocos autolimitantes para iOS com FamilyControls + ManagedSettings
Como os três elementos AuthorizationCenter, FamilyActivityPicker e ManagedSettings são combinados. Organizamos as razões pelas quais um design baseado em token deve ser usado em vez da entrada de domínio de texto livre e a estrutura de sua implementação.
- Não selecione NEDNSProxyProvider ao criar um bloco de site no iOS
Registramos uma investigação sobre os problemas técnicos e políticos do uso do NEDNSProxyProvider em aplicativos iOS de autocontrole distribuídos na App Store, levando à decisão de migrar para a API Screen Time.
- Com Personal Team, não dá para testar Family Controls em dispositivo real
Uma conta gratuita de Personal Team não consegue obter a entitlement Family Controls Development. Este texto organiza por que a adesão ao Apple Developer Program vira pré-requisito para testes em dispositivo real e o que mais é afetado.
- A interface Shield no iOS precisa de duas extensions, não de uma
A tela Shield exibida pelo ManagedSettings é composta por dois targets separados: uma Action Extension e uma Configuration Extension. Este artigo organiza os NSExtensionPointIdentifier corretos e as principal classes.
- Publiquei as boas práticas de SolidJS como skill no skills.sh
Registro de como usei a funcionalidade de skills do Claude Code para publicar boas práticas de SolidJS no skills.sh. Escrevi sobre como a precisão da description determina a precisão do trigger e sobre o processo de verificar diferenças com testes with/without.
- Setup do M4 Mac mini
Encontrei um M4 Mac mini bem mais barato em uma promoção estranha da Amazon, usei meus pontos acumulados para reduzir ainda mais o preço e acabei comprando. Este é o registro da configuração, já pensando em uma futura gestão baseada em NixOS.
- Tudo que bloqueou ao publicar @hsblabs/web-stream-extras no npm
Um relato cronológico das falhas ao migrar de publicação manual para GitHub Actions + npm Trusted Publisher. O 422 de provenance, ordem de tags e versões, e validação antes da publicação.
- Lançando @hsblabs/web-stream-extras
Uma pequena biblioteca utilitária em TypeScript para trabalhar com ReadableStream<Uint8Array> no navegador e no Node.js, cobrindo helpers de conversão de bytes, transform streams e criptografia de streams com a Web Crypto API.
- Criptografando byte streams no navegador com Web Crypto
A Web Crypto oferece primitivas criptográficas fortes, mas não uma interface orientada a streams. Veja como criptografar um ReadableStream<Uint8Array> com o subcaminho encryption de @hsblabs/web-stream-extras — incluindo criptografia de arquivos, gestão de chaves por stream e composição em pipelines.
- Cansei de continuar escrevendo o mesmo boilerplate de Web Streams
Por que reuni utilitários recorrentes de ReadableStream<Uint8Array> em @hsblabs/web-stream-extras. Os três padrões que eu repetia sempre, a classe base ByteTransformStream e a criptografia de stream com Web Crypto.
- Falha no VPC Peering AWS Cross-Region
Travado configurando VPC peering entre Osaka e Tóquio. Esqueci o --peer-region, ficou em estado failed, não consegui deletar.
- Minhas notas sobre `Cache-Control: max-age=3, must-revalidate`
Uma organização do comportamento por trás de uma configuração de Cache-Control conhecida como micro-caching. Este artigo explica o que a combinação `max-age=3` com `must-revalidate` faz na prática, sua linha do tempo de funcionamento e casos de uso concretos.
- Implementando um Editor Live Exclusivo para Desenvolvimento em Projetos Astro
Como implementar um editor baseado em navegador limitado ao modo de desenvolvimento no Astro. Usando middleware Vite e React para tornar o gerenciamento de conteúdo durante o desenvolvimento confortável sem afetar os builds de produção.
- Configuração de aplicativos móveis do ponto de vista de um engenheiro web: abordagem de recuperação de metadados na inicialização
Organização dos desafios de gerenciamento de domínio e versionamento de aplicativos móveis a partir da experiência de frontend web e infraestrutura. Proposta de uma abordagem de recuperação de metadados na inicialização usando CloudFront e S3, com comparações com soluções existentes como Firebase Remote Config.
- Por que /blog retorna 404 no Astro + bun dev e como corrigir
Um fluxo prático de troubleshooting para 404 em /blog com Astro + bun dev, da verificação de links à inspeção de rotas e caminho de entrega. Inclui a correção de colisão de nome de diretório.
- Como resolver quando o mise não fixa versões no Codex Cloud
mise install bun funciona mas bun retorna command not found no Codex Cloud. Causa e solução usando setup.sh com mise use -g e mise activate.
- Procedimento de adoção do lefthook: executar Biome automaticamente em pre-commit e pre-push
Procedimento prático para configurar lefthook e automatizar formatação e lint do Biome no commit e no push. O fluxo cobre ADR, configuração, instalação e validação.
- Analisar dependências incluídas em artefatos de build
Binários compilados com Go incorporam metadados sobre dependências e configurações de build.
- Criei o personality-analyzer, um skill de análise de personalidade para Claude
Registro de desenvolvimento de um skill que produz pontuações HEXACO e MBTI em YAML a partir de conversas com Claude. Uma tentativa de quantificar traços de personalidade a partir de chats com IA.
- Automatizando backups criptografados por diretório com age e tar
Um script shell que combina age e tar para criar arquivos criptografados por subdiretório. Ele mantém compatibilidade com CLI mesmo quando há nomes de diretório em japonês.
- Guia de implementação UUID v7: Crie com JavaScript, Go e Shell
A estrutura de bits do UUID v7, configurações de bits de versão/variante, implementação mínima em JavaScript, Go e Shell, itens de verificação durante a implementação e referências RFC são organizadas em uma página. Um guia prático que resume os pontos a serem verificados na lógica de geração para desenvolvedores que desejam introduzir IDs com segurança e fáceis de classificar em séries temporais. Pode ser usado para confirmação antes da implementação.
- Organizando a diferença entre Glossary e Dictionary
Uma comparação entre Glossary e Dictionary do ponto de vista de escopo, objetivo, termos incluídos e autoria.
- Remover comentários de licença do JS gerado com esbuild/Vite
Como reduzir um pouco o tamanho do bundle removendo comentários de licença dos arquivos gerados por esbuild ou Vite.
- Como ativar o React Compiler no WXT
Passo a passo para ativar o React Compiler no framework WXT. Inclui a instalação do babel-plugin-react-compiler e sua configuração.
- Como configurar o roteamento de subdiretórios com Cloudflare Workers
Etapas de configuração para implantar um projeto Astro em um subdiretório com Cloudflare Workers. Organizado como ajustar wrangler.json e astro.config.
- Comportamento de sh -c e regras para leitura de arquivos de configuração zsh
Organizou o comportamento do comando sh -c, as regras de herança de variáveis de ambiente, a validade do shebang e como os arquivos de configuração zsh (.zshrc, .zshenv, etc.) são lidos quando os scripts são executados.
- Implementando hash CRC32 em TypeScript
Etapas para implementar o algoritmo de hash CRC32 em TypeScript. Organiza técnicas de aceleração usando tabelas de pesquisa e exemplos reais de uso.
- Desativar avisos de variáveis não usadas do Biome em arquivos Astro/Vue/Svelte
Como desativar os avisos do Biome para imports e variáveis não usados em arquivos Astro, Vue e Svelte usando overrides.
- Notas de configuração de Go: framework web e ferramentas de desenvolvimento
Notas sobre framework web e ferramentas de desenvolvimento que pesquisei ao montar um ambiente Go. Um resumo rápido de Echo e Air.
- Converter imagens para AVIF com libavif
Como instalar o libavif com Homebrew e converter JPEG/PNG para AVIF. Serve tanto para conversão única quanto para processamento em lote.
- Execute um script de execução periódica com macOS Launchd
Como construir um script que seja executado a cada minuto como o Cron no macOS Launchd. Instruções de configuração que evitam problemas de variáveis de ambiente e incluem gerenciamento de logs.
- Começando com expansão de abreviações no shell usando zabrze: uma alternativa mais simples ao zsh-abbr
Instalação e uso do zabrze, ferramenta de expansão de abreviações no shell. Uma alternativa mais simples ao zsh-abbr para digitar comandos com mais eficiência.
- Implementando divisão de texto por linha com TransformStream: LineSplitTransform
Uma implementação de TransformStream que divide dados binários recebidos de um fluxo em linhas. Útil para processamento incremental de logs e arquivos de texto.
- Implementando processamento de imagem com OffscreenCanvas e Web Worker
Como processar imagens com Web Worker e OffscreenCanvas sem bloquear a thread principal. Este artigo organiza um exemplo concreto de conversão para WebP.
- Função utilitária em TypeScript para converter valores em ReadableStream
Uma função utilitária que converte strings, objetos e outros valores em ReadableStream. Uma forma de lidar com streams tipados sem passar por Blob.
- Implementando a determinação de endereços IP do intervalo CIDR com TypeScript
Para ambientes onde módulos externos, como o CloudFront Function, não podem ser usados, implementamos nossa própria determinação de endereço IP dentro do intervalo CIDR. Organizou a implementação da sintaxe da classe usando operações bit a bit.
- Como executar um servidor API construído com Bun+Hono no AWS Lambda
Etapas para executar o servidor Hono API no AWS Lambda com tempo de execução Bun. Explica a configuração para compilar como executável de arquivo único e executá-lo com o Lambda Web Adaptor.
- Reimplementando generate-project-summary.py com Bun + TypeScript
Uma reimplementação em Bun + TypeScript de um script Python para resumir projetos. O texto cobre a motivação e a implementação de um binário portátil para dar um repositório inteiro a um LLM.
- Implementação em TypeScript para ordenar arquivos de mídia por resolução
Uma implementação TypeScript enxuta para ordenar vídeos ou imagens por resolução (largura × altura). Útil para variantes de mídia do Twitter.
- Um script de deploy para servir uma SPA com CloudFront + S3
Um script de deploy prático para servir uma SPA hospedada em S3 atrás do CloudFront. Este artigo organiza as configurações de cache-control, uma estrutura de deploy no estilo blue-green e o procedimento de rollback.
- Como excluir um banco de dados não vazio no AWS Athena
O que fazer quando a exclusão de um banco de dados não vazio no AWS Athena falha. Uma nota rápida sobre o uso de DROP DATABASE CASCADE.
- Gerar números da Lotto 6 e Lotto 7 em TypeScript
Uma implementação em TypeScript que gera números da Lotto 6 e Lotto 7 usando o Mersenne Twister. Um exemplo prático de gerador pseudoaleatório.
- Implementação em TypeScript para chamar um API Gateway protegido por IAM
Passo a passo para enviar, a partir do ambiente local, uma requisição em TypeScript para um API Gateway com autenticação IAM usando SigV4 do AWS SDK para JavaScript.
- Sincronizando Markdown com o Confluence usando markdown-confluence CLI
Como adotar e operar o `@markdown-confluence/cli` para sincronizar documentos Markdown de um repositório Git com o Confluence. Este artigo organiza um fluxo para compartilhar ADRs e outros documentos pelo Confluence.
- Vue Composable para gerenciar o estado global sem Pinia
Um método de implementação leve para obter gerenciamento de estado global usando reativo e toRefs do Vue sem usar Pinia.
- Considere padrões de estratégia quando as ramificações v-if aumentam no Vue
Quando houver três ou mais padrões de ramificação condicional usando v-if, considere implementar um padrão de estratégia para alternar componentes dinamicamente. Melhor legibilidade e capacidade de manutenção.
- Implementação TypeScript para gerar imagens de HTMLVideoElement
Uma implementação TypeScript que usa Canvas e VideoElement para extrair o quadro atual de um vídeo como uma imagem. Organizou o método de geração de blobs baseado em promessas.
- Criar jobs Cron com PM2: como alternativa ao launchd
Como criar jobs periódicos com PM2 no macOS em vez de launchd. Um resumo do arquivo de configuração e de um exemplo de execução agendada com Bun.
- Minha primeira implementação de plugin Vite: gerar metadados de build automaticamente
Como encaixar lógica personalizada no ciclo de build do Vite com a Plugin API. Um exemplo usando um plugin que gera versão semântica baseada em tempo.
- Altere o destino da cópia do Vault para root com o plugin starlight-obsidian
Como alterar o comportamento padrão do plugin starlight-obsidian e copiar o Obsidian Vault diretamente em src/content/docs. Implementação organizada para resolver diferenças na estrutura hierárquica da barra lateral.
- Implementação TypeScript de esteganografia usando seletores de variantes
Uma implementação TypeScript de um método de esteganografia que aproveita o seletor de variantes do Unicode para incorporar strings ocultas e invisíveis no texto.
- Implementação em TypeScript para extrair tamanho de URLs de vídeo do Twitter
Uma implementação em TypeScript que extrai a resolução presente em URLs de vídeo do Twitter (X) com expressão regular. Resumo do padrão da URL e da forma de obter o tamanho.
- Notas sobre tentativas fracassadas de recuperar arquivos WOFF do Google Fonts no navegador
Um registro de tentativa e erro ao tentar obter arquivos ttf/otf/woff do Google Fonts no lado do cliente e usá-los com @vercel/satori. Resolvemos as limitações do cabeçalho do User-Agent e os problemas de incompatibilidade do woff2.
- Configuração para rodar Yarn v4 (modo PnP) no Bitbucket Pipelines
Como fazer build de um projeto que usa Yarn v4 em modo PnP no Bitbucket Pipelines. Um resumo da configuração de cache e da ativação do corepack.
- Por que a busca com Pagefind quebrou no Cloudflare Pages: o culpado era o Rocket Loader
Causa raiz e solução para uma busca com Astro + Pagefind que funcionava localmente, mas falhava depois do deploy no Cloudflare Pages.
- O que senti após adquirir o aplicativo de gerenciamento de imagens Eagle
Razões para adquirir o Eagle, um aplicativo único de gerenciamento de imagens e avaliações. Apresentando compatibilidade Mac/Win, gerenciamento de biblioteca e usabilidade de extensões de navegador.
- Criando uma web app avançada no Google Apps Script com Svelte
Como combinar a publicação de web apps do Google Apps Script com Svelte para construir uma SPA rica usando uma planilha como banco de dados.
hsb.horse