#​563 — July 29, 2021

Read on the Web

Ruby Weekly

Rails Mini Profiler: Performance Profiling for Rails, Made Simple — Rails Mini Profiler provides detailed information about your requests to help you figure out why certain requests perform poorly. Inspired by rack-mini-profiler which you can use more generically on Ruby web apps and APIs.

Hans-Jörg Schnedlitz

Building an HTTP Server in Ruby 3 with Fibers and Ractors — This is part of a broader series about building an HTTP server in Ruby ‘from the ground up.’ Here, Dmitry shows the difference between approaches involving single and multi threads, fibers, and ractors (though it’s still very early days there).

Dmitry Ishkov

Learn, Grow and Empower Your Engineering Team — Grow your leadership skills and build a healthy team culture that delivers business results. Our Leadership Hub, Workshops, and Tech Leadership Coaching help new and experienced managers anticipate and overcome everyday challenges.

Blackmill sponsor

RubyMine 2021.2 Released — RubyMine is a popular (but commercial) Ruby IDE offering refactoring, debugging, code assistance, and numerous other conveniences out of the box. This new version can lean on Ruby 3’s RBS signatures to provide even better code completion.

JetBrains

Making Rails Run Just a Few Tests Faster — Jorge created a (now merged) pull request to Rails that only enables parallel testing if the number of tests is above a threshold that justifies the overhead.

Jorge Manrubia (Basecamp)

IN BRIEF:

Jobs

Backend Engineer | Remote Within CET (-2/+2 Hours) | Full-Time — Join us as a Backend Engineer to create the finance solution all businesses love - Tailor made remote policy or relocation package.
Qonto

Senior Software Engineer (Remote in the US) — Snapdocs is now a Unicorn with a $1.5B+ valuation. We’re a SaaS product disrupting the mortgage and real-estate industry. Join our growing distributed team. ROR, Go, Postgres, React, AWS.
Snapdocs

Find Ruby Jobs with Hired — Create a profile on Hired to connect with hiring managers at growing startups and Fortune 500 companies. It's free for job-seekers.
Hired

📕 Articles & Tutorials

All You Need to Know About Netcat (nc) — This isn’t about Ruby specifically but if you’re on a POSIX-compliant OS you almost certainly have nc available and it’s well worth knowing how to use the “TCP/IP / networking swiss army knife.”

Michael Ikua

Webpack All the Assets? — With the release of Rails 6, Webpack was introduced as the default JavaScript bundler but what about using it to handle all the assets in an app?

Ariel Juodziukynas

A Quick Way to Run a Ruby Script in Kubernetes — Need to run a quick Ruby script on a live Kubernetes cluster? It’s possible to do without creating a custom container.

Kir Shatrov

Ruby Ractor Experiments: Safe Async Communication — It’s a few months old, but the example implementation of a buffered queue monitored by the sender to avoid memory exhaustion is still worth a study.

Ivo Anjo

Crunchy Bridge: Fully Managed Multi-Cloud Postgres

Crunchy Bridge sponsor

How to Ignore 'Bullet' in RSpec TestsBullet is a tool for monitoring your app’s queries to find inefficiencies you can resolve in your code. But in testing it can sometimes have false positives you need to silence.

Tony Osbourn

Getting Partial AWS Account IDs for any Cloudfront Website with Ruby — Not sure this is very useful but it’s an interesting parlor trick.

Arkadiy Tetelman

Rails 7 Adds Change Tracking Methods for belongs_to Associations — It’s a minor change but reads better.

Swaathi Kakarla

▶  Discussing Observability with Charity Majors — Charity Majors, the co-founder and CTO of the Honeycomb observability platform, Co-founder and CTO of Honeycomb, an observability platform, digs deep into observability, its importance on a project, and how to do it right.

The Bike Shed Podcast podcast

🛠 Code & Tools

GoodJob: Multithreaded, Postgres-Based, ActiveJob Backend for Rails — Complete support for async, queues, delays, priorities, timeouts, and retries with near-zero configuration. Some recently added features include a cron-esque replacement for recurring jobs and improved concurrency controls.

Ben Sheldon

Ruby 2D: A Simple Cross Platform 2D App Library — We first mentioned this four years ago but progress has chugged along for this modest framework for building apps with graphics, audio, and input device support. GitHub repo.

Tom Black et al.

JetBrains RubyMine: A Cross-Platform Ruby & Rails IDE — Learn about the new features RubyMine 2021.2 brings for working with Ruby and RBS.

JetBrains sponsor

Potassium: A Suspenders-Inspired Rails Application Generator — Brings in things like dotenv, Yarn, Pry, FactoryBot, Puma, Rack Timeout, Faker, and more out of the box.

Platanus

RailsAdmin 2.2: An Engine That Provides a Backend Admin Interface — A Rails engine that gives you an easy interface for basic CRUD manipulation of data of your choice. Check out the live demo.

Erik Berlin

redis-rb 4.4: The Ruby Client Library for Redis — The official Ruby client for the Redis data structure server. 4.4 adds support for XAUTOCLAIM and ZINTER, plus a few bug fixes.

Redis

💡 Tip of the Week

Ancestors in Ruby

Ruby's object model is fascinating! In the next few tips following this one, we'll look at different ways of using code from a module in a class: include, extend and prepend.

In order to set ourselves up to understand the nuances behind each approach, we need to first understand Ruby's concept of ancestors, and how they are used. We'll use a small empty Example class to start:

class Example
end

Now let's call #to_s on an instance of a Example:

Example.new.to_s
=> "#<Example:0x00007fcc5997ec30>"

How did this happen? We never defined Example#to_s. Ancestors are an ordered array of classes or modules that are included or prepended in a given module or class. Let's break that down. In this case, we can see Example#ancestors:

Example.ancestors
=> [Example, Object, Kernel, BasicObject]

When Ruby is looking for a method defined on an object, it will traverse these ancestors in order looking for the method. So in our example, Ruby will not see #to_s defined on Example, and will traverse to look for it defined on Object. It is defined on Object, so Ruby uses that!

If we, however, do define it within Example:

class Example
  def to_s
    "We created this!"
  end
end

Example.new.to_s
=> "We created this!"

We can confirm it will use our definition of #to_s within Example before defering to looking for #to_s later in the ancestors chain. Check out next week's tip to see how ancestors are relevant to include!

This week’s tip was written by Jemma Issroff.