Poker addon explained: strategy lessons for smarter slot playA poker add-on is an optional tournament purchase that gives a player extra chips after a rebuy period or at a defined stage of play. Understanding when that…Versioning A Grails Database With LiquibaseA Grails application can change quickly while its database remains shared by developers, test environments, staging servers and production systems. Without a…Managing Grails Database Migrations With FlywayA database schema is part of a Grails application’s source code, even when it lives in a separate PostgreSQL, MySQL, or MariaDB server. Tables, indexes,…Localising Grails views with message bundlesA Grails view often begins with English in headings, labels, paragraphs, and validation messages. That is fine for one audience, but changing wording or adding…Validating Grails Forms with Command ObjectsHTML form data is untrusted input, even when the browser has required fields and the page looks correct. Grails provides a useful boundary between transport…Using Groovy Traits for Cross-Cutting Concerns in Grails ServicesGrails services often end up carrying the same handful of responsibilities regardless of the domain they sit in. Logging who did what, checking whether a…Automating Grails Build with Gradle Composite BuildsA Grails application often begins as a single project, with domain classes, services, controllers and configuration living in one repository. As the codebase…Building Geb Page Objects for Reliable Grails End-to-End TestsGeb is a browser automation library that sits comfortably on top of WebDriver and reads almost like ordinary Groovy. For Grails teams, the real payoff comes…Using Spock Data Tables to Test Grails ControllersGrails controllers often contain a deceptively large number of decisions. A request may be accepted for one HTTP method, rejected for another, redirected when…Securing Grails applications with JWT access tokensJSON Web Tokens (JWTs) give a Grails application a compact way to represent an authenticated user between requests. After a successful login, the server issues…