{{toastMessage}}

{{loginTitle}}

Se esse e-mail tiver uma conta, mandamos um link de redefinição pra ele agora. Confira sua caixa de entrada (e o spam).

Digite seu e-mail de login e mandamos um link pra você escolher uma senha nova.

{{loginError}}
Não tem conta?
{{registerPasswordLabel}}
{{chk.label}}
{{registerError}}
Já tem conta?

Confirmando seu e-mail…

E-mail confirmado!

Já pode comentar nos posts.

Link inválido

{{verifyError}}

Meu perfil

Foto de perfil
Salva na hora
{{profileAvatarNode}} {{profileAvatarInitials}}
JPEG, PNG, WEBP ou GIF · até 6MB
{{avatarError}}
Dados da conta
Precisa salvar
{{profileError}}
Dados atualizados.
Você tem alterações não salvas.
Notificações
Salva na hora
Trocar senha
Precisa salvar
{{passwordError}}
Senha alterada.
Zona de risco

Excluir sua conta apaga permanentemente seu cadastro, seus comentários, curtidas e estrelas. Não tem como desfazer.

Tem certeza? Isso é permanente. Digite sua senha atual pra confirmar.

{{deleteAccountError}}

Escolher nova senha

Senha alterada. Já pode entrar com ela.

{{resetError}}
joaomarcelo.blog

Notas sobre minha vivencia como programador e um pouco do que eu tô aprendendo

Escrito por João Marcelo Detomini.

Todos os tópicos
Fixado {{t}} post de estreia

{{heroPost.title}}

{{heroPost.excerpt}}

{{heroPost.dateLabel}} · {{heroPost.readTime}} min de leitura
{{secondPost.coverNode}}
Fixado {{t}} post de estreia

{{secondPost.title}}

{{secondPost.excerpt}}

{{secondPost.authorAvatarNode}} {{secondPost.authorAvatarInitials}}
{{secondPost.dateLabel}} · {{secondPost.readTime}} min de leitura {{secondPost.starCount}}
{{post.coverNode}}
Fixado {{t}} post de estreia

{{post.title}}

{{post.excerpt}}

{{post.authorAvatarNode}} {{post.authorAvatarInitials}}
{{post.dateLabel}} · {{post.readTime}} min de leitura {{post.starCount}}
Nenhum post nesse tópico ainda.
{{activePost.coverNode}}
Imagem retirada de {{activePost.coverSource}}{{activePost.coverSource}}
{{t}}

{{activePost.title}}

{{activePost.authorAvatarNode}} {{activePost.authorAvatarInitials}}
{{activePost.authorLine}} {{activePost.dateLabel}} · {{activePost.readTime}} min de leitura
editado
{{historyHeaderLabel}}
Carregando…
{{historyError}}
Esse post ainda não tem versões antigas guardadas.
{{historyDiffHeaderOld}}
{{historyDiffHeaderNew}}
{{historyDiffHeaderStat}}
···
{{ln.marker}}
{{ln.content}}

{{b.text}}

{{b.text}}

{{b.text}}

{{b.text}}
{{b.cite}}
{{b.codeNode}}
  • {{li}}
{{cell.val}}
{{s.value}}
{{s.label}}
{{b.imageNode}}
Imagem retirada de {{b.source}}{{b.source}}
{{b.fileExtLabel}}
{{b.fileName}}
{{b.fileSizeLabel}}
Carregando…
{{b.filePreviewError}}
{{b.filePreviewNode}}
{{f.fileExtLabel}}
{{f.fileName}}
{{f.fileSizeLabel}}
Carregando…
{{f.filePreviewError}}
{{f.filePreviewNode}}

{{fileSelectionLabel}}
Compartilhar
{{commentsCountLabel}}
{{deleteError}}
{{c.avatarNode}} {{c.avatarInitials}}
{{c.authorName}} autor · {{c.dateLabel}}
{{c.body}}
{{replyError}}
{{r.avatarNode}} {{r.avatarInitials}}
{{r.authorName}} autor · {{r.dateLabel}}
{{r.body}}

Nenhum comentário ainda.

{{commentError}}
Confirme seu e-mail pra poder comentar.

Sobre

{{authorAvatarNode}} {{authorAvatarInitials}}

Sou o João Marcelo Detomini. Trabalho como SDE II na EDB, onde passo boa parte do tempo dentro do PostgreSQL, não usando, abrindo o capô.

Antes disso, passei uma temporada como estagiário de suporte técnico na TOTVS e trabalhei como freelancer em arquitetura de sistemas fintech pela Workana. Formado em Engenharia da Computação na Unaerp, em Ribeirão Preto.

Na EDB, trabalho direto no código do Barman, o gerenciador de backup e recovery de Postgres que a empresa mantém. Entre as coisas que já mexi: suporte a criptografia de chave pra backups no S3, melhorias na esteira de arquivamento de WAL na nuvem, e um comando de diagnóstico pra DBA validar a integridade do archive de WAL sem precisar investigar tudo na mão.

Fora do trabalho, gosto de construir coisas que não têm nada a ver com backup de banco: já fiz um simulador de dinâmica dos fluidos que roda no navegador, resolvendo as equações de Navier-Stokes de verdade, e um app de mapeamento de acessibilidade urbana como projeto acadêmico. É meio que o mesmo instinto: entender como a coisa funciona por dentro antes de confiar nela.

Esse blog nasceu de anotações de bancada: bancos de teste, benchmarks que rodei mais de uma vez porque não confiei no resultado da primeira, e código que só faz sentido depois que ele quebra. Escrevo sobre Postgres, Kubernetes, IA aplicada e o que acontece quando essas coisas colidem.

Falei na PGConfBR 2026 sobre usar o PostgreSQL como motor de inferência. O primeiro post daqui é essa palestra, por escrito.

Extra, pra quem gosta de bisbilhotar código: já contribuí pro gRPC, pro etcd, pro CloudNativePG e pro empacotamento pgdg-rpms da comunidade PostgreSQL, além do Barman, que é onde trabalho de fato hoje na EDB.

joaomarcelo.det@gmail.com LinkedIn GitHub Email de trabalho (EDB)

Política de Privacidade

Última atualização em 29 de setembro de 2026.

1. Esta Política de Privacidade ("Política") disciplina a coleta, o tratamento, o armazenamento e a eventual eliminação de dados pessoais de usuários do sítio eletrônico joaomarcelo.blog ("Sítio"), de titularidade e operação de João Marcelo Detomini, pessoa física, na qualidade de controlador de dados, nos termos do art. 5º, VI, da Lei nº 13.709, de 14 de agosto de 2018 (Lei Geral de Proteção de Dados Pessoais, doravante "LGPD"), bem como da Lei nº 12.965, de 23 de abril de 2014 (Marco Civil da Internet).

2. O acesso e a utilização do Sítio implicam a aceitação integral desta Política. Caso o usuário não concorde com os termos aqui expostos, deverá abster-se de fornecer dados pessoais adicionais aos estritamente necessários à navegação, observado o disposto na cláusula 4.

3. Definições

3.1. "Dado pessoal" é a informação relacionada a pessoa natural identificada ou identificável, nos termos do art. 5º, I, da LGPD.

3.2. "Tratamento" compreende toda operação realizada com dados pessoais, incluindo coleta, armazenamento, uso e eliminação, nos termos do art. 5º, X, da LGPD.

3.3. "Titular" é a pessoa natural a quem se referem os dados pessoais objeto de tratamento, nos termos do art. 5º, V, da LGPD.

4. Dados coletados por meio de estatísticas de acesso (analytics)

4.1. O Sítio utiliza sistema próprio e de titularidade exclusiva do controlador para a produção de estatísticas agregadas de acesso, hospedado na mesma infraestrutura do Sítio, sem intermediação de serviços de terceiros, tais como Google Analytics ou ferramentas assemelhadas.

4.2. Ao acessar qualquer página do Sítio, o navegador do usuário gera, de forma automática, um identificador único e aleatório (Universally Unique Identifier, "UUID"), armazenado exclusivamente no mecanismo de armazenamento local do navegador (localStorage), sem uso de cookies para essa finalidade e sem sincronização entre dispositivos ou navegadores distintos.

4.3. São objeto de registro, a cada visualização de página: (i) o identificador de que trata a cláusula 4.2; (ii) o caminho da página acessada; e (iii) o domínio de origem, quando o acesso decorrer de sítio eletrônico externo, hipótese em que referências internas de navegação são desconsideradas.

4.4. Não são objeto de coleta ou de armazenamento: o endereço de protocolo de internet (IP) do usuário e a cadeia de identificação completa do agente de usuário (user agent) do navegador.

4.5. Nos termos do art. 45 do Marco Civil da Internet, é dado efeito ao sinal de preferência "Do Not Track" eventualmente emitido pelo navegador do usuário, hipótese em que o registro da visualização é integralmente suprimido. São igualmente excluídos do registro os acessos originados de sessão administrativa autenticada e o tráfego identificado como automatizado (bots e rastreadores).

4.6. Os dados de que trata esta cláusula são tratados exclusivamente em sua forma agregada e estatística, para a finalidade de aferição de audiência e de desempenho do Sítio, restrita ao controlador, vedada sua utilização para fins publicitários, comerciais ou de perfilização individual, e vedada sua cessão a terceiros.

5. Dados coletados no cadastro de usuário e na interação com conteúdo

5.1. A leitura do conteúdo publicado no Sítio prescinde de cadastro. O cadastro é exigido unicamente para o exercício das funcionalidades de comentário, curtida de comentário e sinalização de destaque ("estrela") em publicações.

5.2. No ato do cadastro, são coletados: endereço de correio eletrônico, nome de exibição e senha de acesso. A senha é armazenada exclusivamente sob a forma de resumo criptográfico irreversível (hash bcrypt), não sendo mantido, em qualquer hipótese, registro de sua forma legível pelo controlador.

5.3. Caso o usuário opte pelo envio de imagem de perfil, é armazenado unicamente o caminho de referência do arquivo no sistema de arquivos, e não seu conteúdo binário na base de dados relacional. Tokens de confirmação de correio eletrônico e de redefinição de senha são armazenados sob a forma de resumo criptográfico, dotados de prazo de validade e de uso único.

5.4. Comentários publicados pelo usuário são vinculados à respectiva conta, não se lhes atribuindo caráter anônimo, e são exibidos publicamente na página da publicação correspondente, juntamente com o nome de exibição e a imagem de perfil do titular. Curtidas e sinalizações de destaque são igualmente vinculadas à conta do usuário, sendo, contudo, exibidas a terceiros unicamente sob a forma de contagem agregada, sem identificação individual do titular.

5.5. A manutenção da sessão de acesso autenticado é realizada por meio de cookie de sessão (jm_blog_session), configurado com os atributos HttpOnly, que impede seu acesso por meio de programação em JavaScript, e Secure, que restringe sua transmissão a conexões cifradas (HTTPS), com prazo de validade de 30 (trinta) dias. Referido cookie destina-se exclusivamente à autenticação do usuário, não sendo utilizado para fins de rastreamento ou de produção de estatísticas.

6. Finalidade e base legal do tratamento

6.1. Os dados referidos na cláusula 4 são tratados com fundamento no legítimo interesse do controlador, nos termos do art. 7º, IX, e do art. 10 da LGPD, para a finalidade de manutenção, segurança e aprimoramento do Sítio, observada a adoção das salvaguardas técnicas descritas nas cláusulas 4.2 a 4.5.

6.2. Os dados referidos na cláusula 5 são tratados com fundamento na execução de contrato ou de procedimentos preliminares a ele relacionados, nos termos do art. 7º, V, da LGPD, e no consentimento do titular, nos termos do art. 7º, I, e do art. 8º da LGPD, para a finalidade de viabilizar a autenticação, a publicação de comentários e o envio das comunicações descritas na cláusula 7.

7. Comunicações por correio eletrônico

7.1. Mediante prévia habilitação da preferência correspondente no perfil do usuário, ativada por padrão e passível de desativação a qualquer tempo, o controlador poderá enviar mensagem eletrônica ao usuário em razão de (i) resposta a comentário de sua autoria; ou (ii) publicação de novo conteúdo no Sítio. O endereço de correio eletrônico não é utilizado para finalidade diversa das descritas nesta cláusula, não é objeto de cessão a terceiros e não integra lista de distribuição de conteúdo promocional.

8. Compartilhamento de dados

8.1. O controlador não realiza a venda, a cessão ou o compartilhamento de dados pessoais com terceiros para fins publicitários ou comerciais. Não são utilizados serviços de terceiros para rastreamento de usuários, tais como pixels de conversão ou ferramentas de publicidade direcionada. O tratamento de dados descrito nesta Política é realizado integralmente em infraestrutura própria do controlador.

9. Retenção e eliminação de dados

9.1. Os dados de cadastro e os conteúdos gerados pelo usuário são mantidos enquanto subsistir a conta ativa, ou pelo prazo adicional que se faça necessário ao cumprimento de obrigação legal ou regulatória, nos termos do art. 16 da LGPD.

9.2. O identificador de que trata a cláusula 4.2 é mantido unicamente no navegador do usuário, cabendo a este, mediante a limpeza dos dados de navegação do Sítio ou a utilização de modo de navegação privada, promover sua eliminação a qualquer tempo, sem necessidade de requerimento ao controlador.

10. Direitos do titular

10.1. Nos termos do art. 18 da LGPD, é assegurado ao titular o direito de, mediante requisição dirigida ao controlador na forma da cláusula 11: (i) confirmar a existência de tratamento; (ii) acessar os dados; (iii) corrigir dados incompletos, inexatos ou desatualizados; (iv) requerer a anonimização, o bloqueio ou a eliminação de dados desnecessários, excessivos ou tratados em desconformidade com a LGPD; (v) requerer a portabilidade dos dados; (vi) requerer a eliminação dos dados pessoais tratados com base no consentimento; (vii) obter informação sobre entidades públicas e privadas com as quais o controlador tenha realizado uso compartilhado de dados; e (viii) revogar o consentimento anteriormente prestado.

10.2. O controlador prestará as informações solicitadas no prazo razoável e na forma prevista no art. 19 da LGPD, ressalvada a hipótese de os dados objeto do pedido, por sua natureza, não se encontrarem associados ao requerente, tal como descrito na cláusula 9.2.

10.3. A eliminação da conta e dos dados a que se refere o inciso (iv) da cláusula 10.1 pode ser realizada diretamente pelo titular, a qualquer tempo, por meio da funcionalidade correspondente disponível na página de perfil do usuário logado, sem necessidade de requisição prévia ao controlador.

11. Encarregado e canal de contato

11.1. As funções de encarregado pelo tratamento de dados pessoais (art. 5º, VIII, e art. 41 da LGPD) são exercidas pelo próprio controlador, João Marcelo Detomini, podendo o titular exercer os direitos descritos na cláusula 10 e formular quaisquer questionamentos relativos a esta Política por meio do endereço eletrônico indicado ao final desta página.

12. Alterações desta Política

12.1. Esta Política poderá ser alterada a qualquer tempo, mediante publicação de nova versão nesta mesma página, com indicação da respectiva data de atualização, recomendando-se ao usuário a sua consulta periódica.

Contato para exercício de direitos ou esclarecimento de dúvidas:

no-reply@joaomarcelo.blog

RSS

Feed de verdade, gerado a partir dos posts do blog — sem tracking, sem newsletter, só as entradas na ordem de publicação. Cole a URL abaixo no seu leitor de RSS preferido.

https://joaomarcelo.blog/feed.xml
<item>
<title>{{entry.title}}</title>
<pubDate>{{entry.date}}</pubDate>
<topics>{{entry.topicsStr}}</topics>
</item>

Estatísticas

Carregando…

{{analyticsError}}

Pageviews hoje
{{statPageviewsToday}}
Pageviews 7d
{{statPageviews7d}}
{{statPageviewsDeltaLabel7d}}
Pageviews 30d
{{statPageviews30d}}
{{statPageviewsDeltaLabel30d}}
Visitantes hoje
{{statVisitorsToday}}
Visitantes 7d
{{statVisitors7d}}
{{statVisitorsDeltaLabel7d}}
Visitantes 30d
{{statVisitors30d}}
{{statVisitorsDeltaLabel30d}}
Tendência
pageviews
visitantes
{{dot.title}}
{{tk.label}}
Páginas mais vistas · 30 dias
{{p.label}} {{p.count}}
Origem do tráfego · 30 dias
visitantes únicos por origem, não cliques
{{r.referrer}} {{r.count}}

Nenhum acesso vindo de fora ainda.

Dispositivo · 30 dias
{{seg.label}} {{seg.pct}}%

Ainda sem dados de dispositivo.

Quando o blog é mais lido · 30 dias
{{row.dayLabel}}
{{ht.label}}

Ainda sem dados suficientes.

Engajamento por post · 30 dias
{{e.label}} {{e.scrollPct}}% lido{{e.timeLabel}}

Ainda sem dados suficientes de leitura (precisa de pelo menos 3 leituras medidas por post).

Novos vs. recorrentes · 30 dias
{{statNewCount}}
novos ({{statNewPct}}%)
{{statReturningCount}}
recorrentes ({{statReturningPct}}%)
Retenção D7
{{statRetentionPct}}%
de {{statRetentionCohortSize}} visitante(s) que chegaram há 7 dias voltaram desde então

Ainda não há dados suficientes (nenhum visitante chegou há exatos 7 dias).

{{editorError}}
~{{draftReadTime}} min de leitura
{{slugFixError}}
{{previewCoverNode}}

{{b.text}}

{{b.text}}

{{b.text}}

{{b.text}}
{{b.codeNode}}
  • {{li}}
{{cell.val}}
{{s.value}}
{{s.label}}
{{b.imageNode}}
Imagem retirada de {{b.source}}{{b.source}}
{{b.fileExtLabel}}
{{b.fileName}}
{{b.fileSizeLabel}}
Carregando…
{{b.filePreviewError}}
{{b.filePreviewNode}}
{{f.fileExtLabel}}
{{f.fileName}}
{{f.fileSizeLabel}}
Carregando…
{{f.filePreviewError}}
{{f.filePreviewNode}}

{{b.typeLabel}}
·
ou
{{b.imageUploadError}}
{{b.thumbNode}}
{{b.fileName}}
{{b.fileExtLabel}} · {{b.fileSizeLabel}}
{{b.fileUploadError}}