<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Notas de engenharia — Vinicius Pereira</title>
    <link>https://ovini.site/blog/pt/</link>
    <atom:link href="https://ovini.site/feed.pt.xml" rel="self" type="application/rss+xml" />
    <description>Artigos sobre Rails por dentro, PostgreSQL em escala, sistemas distribuídos e engenharia com IA.</description>
    <language>pt-BR</language>
    <lastBuildDate>Thu, 13 Aug 2026 12:00:00 GMT</lastBuildDate>
    <item>
      <title>Como um agente de código realmente opera num repositório</title>
      <link>https://ovini.site/blog/pt/how-a-coding-agent-operates-on-a-repository.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/how-a-coding-agent-operates-on-a-repository.html</guid>
      <pubDate>Thu, 13 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ai</category>
      <description>Não é autocomplete nem mágica: é um loop de ler, planejar, editar, verificar, rodando contra um filesystem de verdade. Traçado numa mudança real feita neste site, incluindo a parte que ele errou.</description>
    </item>
    <item>
      <title>O que realmente acontece entre a WebView e a shell nativa</title>
      <link>https://ovini.site/blog/pt/hotwire-native-webview-bridge.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/hotwire-native-webview-bridge.html</guid>
      <pubDate>Thu, 06 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>hotwire</category>
      <description>Hotwire Native não é um wrapper de site. É um app nativo que delega telas, e no momento que você entende quem é dono da back stack, metade da confusão some.</description>
    </item>
    <item>
      <title>Connection pooling: por que seu banco fica sem conexões</title>
      <link>https://ovini.site/blog/pt/connection-pooling-why-your-database-runs-out-of-connections.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/connection-pooling-why-your-database-runs-out-of-connections.html</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>Rails abre uma conexão por thread, o Postgres cobra ~10MB por conexão, e ninguém percebe até a concorrência explodir. PgBouncer, tamanho de pool e a conta que realmente importa.</description>
    </item>
    <item>
      <title>Você não entende Machine Learning até implementar do zero</title>
      <link>https://ovini.site/blog/pt/you-don-t-understand-machine-learning-until-you-implement-it-from-scratch.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/you-don-t-understand-machine-learning-until-you-implement-it-from-scratch.html</guid>
      <pubDate>Thu, 14 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ml</category>
      <description>Chamar sklearn.fit() não é entender. Construir perceptron, regressão logística e uma rede que resolve XOR em Ruby é. ML é álgebra e otimização — não mágica.</description>
    </item>
    <item>
      <title>Gradient descent explicado visualmente</title>
      <link>https://ovini.site/blog/pt/gradient-descent-visually-explained.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/gradient-descent-visually-explained.html</guid>
      <pubDate>Thu, 07 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ml</category>
      <description>Função de custo é uma superfície. Derivada é inclinação. θ = θ − α·∇J(θ). Toda rede neural que você já ouviu falar é essa regra, repetida.</description>
    </item>
    <item>
      <title>epoll e io_uring explicados visualmente</title>
      <link>https://ovini.site/blog/pt/epoll-and-io-uring-explained-visually.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/epoll-and-io-uring-explained-visually.html</guid>
      <pubDate>Thu, 30 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>infra</category>
      <description>Blocking IO → select → poll → epoll → io_uring. Cada degrau existe porque o anterior travava. Async não é feature de linguagem, é feature de kernel.</description>
    </item>
    <item>
      <title>Como o kernel Linux recebe uma request HTTP</title>
      <link>https://ovini.site/blog/pt/how-the-linux-kernel-actually-receives-an-http-request.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/how-the-linux-kernel-actually-receives-an-http-request.html</guid>
      <pubDate>Thu, 23 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>infra</category>
      <description>NIC → driver → IRQ → softirq → IP → TCP → socket buffer → accept queue → Puma. Seu framework é os últimos 5% do request. O resto é kernel.</description>
    </item>
    <item>
      <title>O mito do &quot;exactly once&quot;</title>
      <link>https://ovini.site/blog/pt/the-exactly-once-myth.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/the-exactly-once-myth.html</guid>
      <pubDate>Thu, 16 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>distributed</category>
      <description>Exactly-once não existe na rede. O que existe é at-least-once com idempotência. Pare de perseguir mito de marketing — projete para a realidade e durma à noite.</description>
    </item>
    <item>
      <title>Como evitar retry storms em background jobs</title>
      <link>https://ovini.site/blog/pt/how-to-avoid-retry-storms-in-background-jobs.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/how-to-avoid-retry-storms-in-background-jobs.html</guid>
      <pubDate>Thu, 09 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>distributed</category>
      <description>API externa caiu. 100k jobs no Sidekiq decidem tentar de novo ao mesmo tempo. Jitter, circuit breaker, DLQ — retry não é fix, é estratégia de adiamento.</description>
    </item>
    <item>
      <title>Idempotência em sistemas reais</title>
      <link>https://ovini.site/blog/pt/idempotency-in-real-systems.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/idempotency-in-real-systems.html</guid>
      <pubDate>Thu, 02 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>distributed</category>
      <description>At-least-once é a realidade. Unique constraint é a única garantia de verdade. Idempotency-Key, dedupe table — sobrevivência em sistemas distribuídos.</description>
    </item>
    <item>
      <title>Lock contention: o assassino silencioso do Postgres</title>
      <link>https://ovini.site/blog/pt/lock-contention-the-silent-killer-in-postgresql.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/lock-contention-the-silent-killer-in-postgresql.html</guid>
      <pubDate>Thu, 26 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>Migração de 10ms que congela produção por 40 minutos. ALTER TABLE pegando ACCESS EXCLUSIVE. pg_locks + pg_stat_activity. Locks são invisíveis até não serem mais.</description>
    </item>
    <item>
      <title>O que VACUUM realmente faz no Postgres</title>
      <link>https://ovini.site/blog/pt/what-vacuum-actually-does-in-postgresql.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/what-vacuum-actually-does-in-postgresql.html</guid>
      <pubDate>Thu, 19 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>MVCC, dead tuples, bloat, autovacuum, transaction wraparound. VACUUM não é faxina — é parte de como o Postgres funciona. Ignorar é acordar 3h da manhã.</description>
    </item>
    <item>
      <title>EXPLAIN ANALYZE deveria ser obrigatório</title>
      <link>https://ovini.site/blog/pt/explain-analyze-should-be-mandatory.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/explain-analyze-should-be-mandatory.html</guid>
      <pubDate>Thu, 12 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>Junior roda a query. Senior roda o plano da query. Seq Scan, Index Scan, Bitmap Heap, estimativa vs real, BUFFERS — olhar o plano não é luxo, é o trabalho.</description>
    </item>
    <item>
      <title>Você NÃO entende Rails até entender o ciclo completo de uma Request</title>
      <link>https://ovini.site/blog/pt/you-don-t-understand-rails-until-you-understand-the-full-request-cycle.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/you-don-t-understand-rails-until-you-understand-the-full-request-cycle.html</guid>
      <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>rails</category>
      <description>Rails não é mágico. Rails é Rack, TCP, Threads, Middleware, SQL e objetos Ruby na heap. Entenda o que acontece antes e depois do seu controller.</description>
    </item>
    <item>
      <title>Refatorar monólito sem detonar produção</title>
      <link>https://ovini.site/blog/pt/refactoring-a-monolith-without-blowing-up-production.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/refactoring-a-monolith-without-blowing-up-production.html</guid>
      <pubDate>Thu, 26 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>architecture</category>
      <description>Microsserviço não é a solução. Refatorar monólito é uma arte — strangler fig, feature flag, migração de schema em passos. O que ninguém te conta sobre o processo.</description>
    </item>
    <item>
      <title>Como identificar gargalo de performance em minutos</title>
      <link>https://ovini.site/blog/pt/how-to-identify-a-performance-bottleneck-in-minutes.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/how-to-identify-a-performance-bottleneck-in-minutes.html</guid>
      <pubDate>Thu, 19 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>performance</category>
      <description>Toda app lenta tem UM gargalo dominante. Achismo não resolve. Aprenda a hierarquia de suspeitos, as ferramentas certas e o fluxo que vai direto na causa.</description>
    </item>
    <item>
      <title>Debuggar memory leak em Ruby sem chorar</title>
      <link>https://ovini.site/blog/pt/debugging-memory-leaks-in-ruby-without-crying.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/debugging-memory-leaks-in-ruby-without-crying.html</guid>
      <pubDate>Thu, 12 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>performance</category>
      <description>Ruby tem GC. Então leak clássico não existe. O que existe é bloat — e a diferença entre os dois é o que separa o senior do junior nesse assunto.</description>
    </item>
    <item>
      <title>Escrever uma DSL simples do zero em Ruby</title>
      <link>https://ovini.site/blog/pt/writing-a-simple-dsl-from-scratch-in-ruby.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/writing-a-simple-dsl-from-scratch-in-ruby.html</guid>
      <pubDate>Thu, 05 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>Rails, RSpec, Sidekiq, Devise — toda gem famosa é uma DSL. E nenhuma é mágica. São truques simples de metaprogramação que você replica em uma tarde.</description>
    </item>
    <item>
      <title>Como ActiveRecord monta SQL por baixo dos panos</title>
      <link>https://ovini.site/blog/pt/how-activerecord-builds-sql-under-the-hood.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/how-activerecord-builds-sql-under-the-hood.html</guid>
      <pubDate>Thu, 29 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>rails</category>
      <description>Você não está montando SQL. Está montando uma árvore. Entenda Arel, bind parameters, lazy evaluation e a diferença real entre includes, preload e eager_load.</description>
    </item>
    <item>
      <title>Ancestors chain: como Ruby resolve métodos de verdade</title>
      <link>https://ovini.site/blog/pt/ancestors-chain-how-ruby-actually-resolves-methods.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/ancestors-chain-how-ruby-actually-resolves-methods.html</guid>
      <pubDate>Thu, 22 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>Pergunta de entrevista preferida pra separar Rubyist de pessoa que escreve Ruby. Include, prepend, singleton classes — toda dúvida tem a mesma resposta.</description>
    </item>
    <item>
      <title>Como Ruby resolve métodos internamente</title>
      <link>https://ovini.site/blog/pt/how-ruby-resolves-methods-internally.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/how-ruby-resolves-methods-internally.html</guid>
      <pubDate>Thu, 15 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>Quando você chama user.name, Ruby faz um ritual. Method lookup, inline cache, method_missing, singleton classes — a mecânica real por trás de uma chamada simples.</description>
    </item>
    <item>
      <title>GIL: o lock que todo Rubyist precisa entender</title>
      <link>https://ovini.site/blog/pt/gil-the-lock-every-rubyist-needs-to-understand.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/gil-the-lock-every-rubyist-needs-to-understand.html</guid>
      <pubDate>Thu, 08 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>Ruby não tem paralelismo real por causa do GIL — meia-verdade dita com confiança. Entenda o GVL de verdade, quando threads ajudam e quando viram armadilha.</description>
    </item>
    <item>
      <title>Entender o runtime do Ruby (não só a linguagem)</title>
      <link>https://ovini.site/blog/pt/understanding-ruby-s-runtime-not-just-the-language.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/pt/understanding-ruby-s-runtime-not-just-the-language.html</guid>
      <pubDate>Thu, 01 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>A maioria conhece a linguagem. Quase nenhum conhece o runtime. YARV, heap, GC, GVL, inline cache — onde a engenharia mora e onde os bugs de produção nascem.</description>
    </item>
  </channel>
</rss>
