<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Luiz Kowalski :: dev blog</title><description>Notes and findings from a Ruby developer</description><link>https://luizkowalski.net/</link><item><title>Deploying Spring Cloud Netflix apps on Kubernetes</title><link>https://luizkowalski.net/blog/deploying-spring-cloud-netflix-apps-on-kubernetes/</link><guid isPermaLink="true">https://luizkowalski.net/blog/deploying-spring-cloud-netflix-apps-on-kubernetes/</guid><description>A walkthrough of deploying a Eureka server, a Hystrix dashboard with Turbine, and a microservice to a Kubernetes cluster. Covers Dockerizing each Spring Cloud Netflix component, exposing them with kubectl, and verifying the circuit breaker under load with siege.</description><pubDate>Mon, 30 Oct 2017 09:19:03 GMT</pubDate></item><item><title>Double-click to submit form pattern with Stimulus (revisited)</title><link>https://luizkowalski.net/blog/double-click-to-submit-form-pattern-with-stimulus-revisited/</link><guid isPermaLink="true">https://luizkowalski.net/blog/double-click-to-submit-form-pattern-with-stimulus-revisited/</guid><description>A follow-up on the double-click-to-confirm button component, now rebuilt as a ViewComponent with a Stimulus sidecar controller. Shows how overlapping text with CSS grid keeps the button width stable during the confirm animation, plus a caveat about long confirmation strings.</description><pubDate>Tue, 01 Apr 2025 15:07:22 GMT</pubDate></item><item><title>&quot;Double-click to submit&quot; pattern with Stimulus</title><link>https://luizkowalski.net/blog/double-click-to-submit-pattern-with-stimulus/</link><guid isPermaLink="true">https://luizkowalski.net/blog/double-click-to-submit-pattern-with-stimulus/</guid><description>Inspired by a confirm-by-double-clicking pattern seen in CasaOS, this post recreates it with a small Stimulus controller. It swaps the button text on first click and submits on the second, then adds stimulus-use&apos;s clickOutside to cancel the pending confirmation.</description><pubDate>Wed, 25 Sep 2024 13:50:07 GMT</pubDate></item><item><title>Encapsulation in Ruby on Rails</title><link>https://luizkowalski.net/blog/encapsulation-in-ruby-on-rails/</link><guid isPermaLink="true">https://luizkowalski.net/blog/encapsulation-in-ruby-on-rails/</guid><description>Argues that ActiveRecord getters/setters aren&apos;t real encapsulation, since callers still need to know about an object&apos;s internal fields to mutate it. Proposes using DDD&apos;s Aggregate pattern so that all state changes happen through the owning model instead of leaking into other classes.</description><pubDate>Fri, 26 Oct 2018 14:18:20 GMT</pubDate></item><item><title>A simple solution to scalability problems: Event Sourcing</title><link>https://luizkowalski.net/blog/event-sourcing-with-spring-boot-and-kotlin/</link><guid isPermaLink="true">https://luizkowalski.net/blog/event-sourcing-with-spring-boot-and-kotlin/</guid><description>Building an Untappd clone in Kotlin and Spring to explore event sourcing and CQRS. Covers organizing code into independent domains connected only through events, dispatching events via AbstractAggregateRoot, and the eventual-consistency trade-offs that come with async listeners.</description><pubDate>Mon, 30 Jul 2018 12:04:54 GMT</pubDate></item><item><title>Netflix OSS: A beginner&apos;s guide [pt1]</title><link>https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt1/</link><guid isPermaLink="true">https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt1/</guid><description>First part of a series introducing the Netflix OSS microservices stack, starting with Eureka, the service registry. Walks through generating a Spring Boot project, configuring application.yml, and enabling the server with @EnableEurekaServer.</description><pubDate>Tue, 07 Jun 2016 19:51:33 GMT</pubDate></item><item><title>Netflix OSS: A beginner&apos;s guide [pt2]</title><link>https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt2/</link><guid isPermaLink="true">https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt2/</guid><description>Second part of the Netflix OSS series: registering a microservice with the Eureka server built in part one. Covers the @EnableDiscoveryClient annotation, the client-side eureka.client configuration, and confirming the service shows up in Eureka&apos;s dashboard.</description><pubDate>Tue, 21 Jun 2016 20:20:26 GMT</pubDate></item><item><title>Netflix OSS: A beginner&apos;s guide [pt3]</title><link>https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt3/</link><guid isPermaLink="true">https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt3/</guid><description>Third part of the Netflix OSS series, adding Zuul as an edge server to route and load-balance requests across microservice instances. Shows the Zuul route configuration and tests it with curl against a scaled-out contacts-service.</description><pubDate>Mon, 10 Oct 2016 20:09:31 GMT</pubDate></item><item><title>Netflix OSS: A beginner&apos;s guide [pt4]</title><link>https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt4/</link><guid isPermaLink="true">https://luizkowalski.net/blog/netflix-oss-a-beginners-guide-pt4/</guid><description>Fourth part of the Netflix OSS series, adding Hystrix circuit breakers to a microservice and aggregating their streams with Turbine. Wires up a combined Hystrix Dashboard/Turbine app and watches the circuit state change as instances scale up.</description><pubDate>Thu, 24 Nov 2016 13:53:11 GMT</pubDate></item><item><title>Production-Grade (ish) Rails deployment on Hetzner with Kamal</title><link>https://luizkowalski.net/blog/production-grade-ish-deployment-on-hetzner-with-kamal/</link><guid isPermaLink="true">https://luizkowalski.net/blog/production-grade-ish-deployment-on-hetzner-with-kamal/</guid><description>A two-server Kamal deployment on Hetzner: one exposed web server, one locked-down accessories server for Postgres, Redis, and backups, reachable only via SSH jump host. Covers the Terraform setup for provisioning, splitting background jobs by priority, and configuring Traefik for automatic SSL.</description><pubDate>Sun, 21 Jan 2024 20:47:52 GMT</pubDate></item><item><title>Refactoring legacy Ruby on Rails apps</title><link>https://luizkowalski.net/blog/refactoring-legacy-ruby-on-rails-apps/</link><guid isPermaLink="true">https://luizkowalski.net/blog/refactoring-legacy-ruby-on-rails-apps/</guid><description>Refactoring a bloated login controller in a Rails side project (Chathub) by extracting single-purpose Command classes and a Service object to tie them together. Discusses the resulting testability gains and the coupling issues still left to fix.</description><pubDate>Thu, 24 Nov 2016 18:37:13 GMT</pubDate></item><item><title>Taming complex Service Objects with dry-rb</title><link>https://luizkowalski.net/blog/taming-complex-service-objects-with-dry/</link><guid isPermaLink="true">https://luizkowalski.net/blog/taming-complex-service-objects-with-dry/</guid><description>Uses dry-validation to turn a Service Object&apos;s loose params hash into an explicit, self-documenting contract with typed, required/optional fields and business rules. Also covers custom dry-types, coercion, and how this compares to Sorbet.</description><pubDate>Sun, 07 Aug 2022 21:50:52 GMT</pubDate></item><item><title>Traefik with Kamal: Tips and Tricks</title><link>https://luizkowalski.net/blog/traefik-with-kamal-tips-and-tricks/</link><guid isPermaLink="true">https://luizkowalski.net/blog/traefik-with-kamal-tips-and-tricks/</guid><description>Clears up a common Traefik misconception: you don&apos;t need new entrypoints to expose extra services like Grafana on a subdomain, just new routers and services. Walks through enabling the internal API dashboard and the routing rules that connect a Host rule to a Docker service.</description><pubDate>Sat, 10 Feb 2024 15:48:15 GMT</pubDate></item><item><title>Using concurrent-ruby in a Rails application</title><link>https://luizkowalski.net/blog/using-concurrent-ruby-in-a-rails-application/</link><guid isPermaLink="true">https://luizkowalski.net/blog/using-concurrent-ruby-in-a-rails-application/</guid><description>Explains how the GVL still allows I/O-bound work to run in parallel via concurrent-ruby&apos;s Future, and how to safely combine it with Rails&apos; Executor. Covers wrapping threads in executor.wrap and using permit_concurrent_loads to avoid autoloading deadlocks.</description><pubDate>Sun, 18 Apr 2021 17:37:31 GMT</pubDate></item><item><title>Validating Mandrill webhook signature on Ruby on Rails</title><link>https://luizkowalski.net/blog/validating-mandrill-webhook-signatures-on-rails/</link><guid isPermaLink="true">https://luizkowalski.net/blog/validating-mandrill-webhook-signatures-on-rails/</guid><description>How to verify Mandrill&apos;s X-Mandrill-Signature header in a Rails controller by HMAC-SHA1 signing the webhook URL and raw POST params. The key gotcha: you must use request.request_parameters, not Rails&apos; parsed params, since Mandrill signs the raw mandrill_events string.</description><pubDate>Fri, 24 Apr 2020 16:44:42 GMT</pubDate></item></channel></rss>