---
title: "GitHub's engineers move to the cloud for day-to-day development"
publication: "Ruby Weekly"
issue: 565
published_at: "2021-08-12"
canonical_url: "https://rubyweekly.com/issues/565"
---

Plus Opal 1.2, a dig into JITs, and continuing to implement a programming language in Ruby. |        

#​565 — August 12, 2021 

[Read on the Web](https://rubyweekly.com/issues/565)    

✍️ I wouldn't normally do this, but [last week's issue](https://rubyweekly.com/issues/564) was so strong that if you missed it, you should step back and check it out :-) We covered stuff like Stripe's Ruby compiler, the Fukuoka Ruby Award, Ruby's future debugger, and even a new Nokogiri release. This week is somewhat quiet in comparison! :-)
__
_Peter Cooper, editor_  

Ruby Weekly 

[![\](https://res.cloudinary.com/cpress/image/upload/w_1280,e_sharpen:60/vamqtjwzbdoh0st6ofme.jpg)](https://opalrb.com/blog/2021/08/09/opal-1-2/)  

[Opal 1.2: The Ruby to JavaScript Compiler Goes Ruby 3.0](https://opalrb.com/blog/2021/08/09/opal-1-2/) — Well, _almost._ Opal is a long standing and interesting project that lets you build front-end experiences for the Web in the language you already know and love. This is a significant release. Want to play? [Try it live here.](https://opalrb.com/try/) 

Opal Team   

[Ruby's Hidden Gems: Bullet](https://blog.appsignal.com/2021/08/11/ruby-hidden-gems-bullet-and-how-it-integrates-with-appsignal.html) — [Bullet](https://github.com/flyerhzm/bullet) provides a way to monitor your app’s database queries to find inefficiencies (N+1 queries, unused eager loading..) you can resolve. 

Fabio Perrella   [![\](https://copm.s3.amazonaws.com/d16dbd96.png)](https://www.datadoghq.com/dg/apm/ruby-troubleshooting/?utm_source=Advertisement&utm_medium=CooperPress&utm_campaign=CooperPress-RubyWeeklyTroubleshootP) 

[Troubleshoot Ruby App Performance with End‑To‑End Tracing](https://www.datadoghq.com/dg/apm/ruby-troubleshooting/?utm_source=Advertisement&utm_medium=CooperPress&utm_campaign=CooperPress-RubyWeeklyTroubleshootP) — Datadog’s APM generates detailed flame graphs to help you identify bottlenecks and latency. Navigate seamlessly between Ruby app traces, logs and metrics to troubleshoot application performance issues fast. Try Datadog APM free. 

Datadog APM sponsor   

**QUICK BITS:** 

- Gift Egwuenu shares [the latest monthly update for the RubyGems project](https://blog.rubygems.org/2021/08/11/july-rubygems-updates.html).
- GitHub has made its _Codespaces_ cloud-based IDE feature [more generally available](https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/) and is, apparently, using it in-house for much of its development work: _"Over the past months, we’ve left our macOS model behind and moved to Codespaces for the majority of GitHub.com development"._
- In other GitHub news, go to any GitHub repo and press `.`   

▶[Discussing Ruby JIT and MJIT](https://devchat.tv/ruby-rogues/ruby-jit-and-mjit-ft-takashi-kokubun-ruby-510/) — Curious about how just-in-time compilation factor into the future Ruby performance story? Takashi Kokubun (aka k0kubun) has [spent a lot of time in the JIT weeds](https://k0kubun.medium.com/ruby-3-jit-can-make-rails-faster-756310f235a) and joins the Rogues to explain the ups and downs. 

Ruby Rogues Podcast podcast   

▶[Hotwire Turbo Replacing Rails UJS](https://www.driftingruby.com/episodes/hotwire-turbo-replacing-rails-ujs) — Rails UJS wasn’t the most-loved part of the framework, but it did supply some cool interactions out of the box, so wouldn’t it be nice to use the new hot(wire)ness to get the same results? 

Drifting Ruby     

Jobs  

[Full Stack Engineer (Rails, New York)](https://angel.co/company/dovetale/jobs/483906-full-stack-engineer-rails) — Dovetale helps Shopify merchants like KontrolFreek and Italic grow their creator community. Built in NYC and backed by Uber founders. 
Dovetale   

[Principal Software Engineer (Remote in the US)](https://www.decisiv.com/working-with-decisiv/) — Join our creative, remote-first team to help design & build a platform that is revolutionizing the commercial asset service industry. 
Decisiv   

[Find Ruby Jobs Through Hired](https://hired.com/join/?utm_source=newsletter&utm_medium=sponsor&utm_campaign=%28b2c%29%28l-all%29%28r-all%29%28cooper-rubyweekly%29&utm_content=find-your-next-job) — 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  

[Kubernetes & Rails: A Definitive Guide](https://kubernetes-rails.com/) — A production-focused guide that covers domain names, secrets, logging, background and cron jobs, migrations, and other topics that will start you down the path to Kubernetes deployments. 

Marco Colli   

[Building a Programming Language in Ruby: Part 2](https://www.honeybadger.io/blog/stoffle-interpreter-2/) — In this second part of a three-post series ([here’s part one again](https://www.honeybadger.io/blog/building-interpreter-ruby/)), the ‘Stoffle’ programming language is completed to a runnable (but simple) stage where functions, loops, variable scope, and other concepts are put into the code. 

Alex Braha Stoll   

[A Guide for Preloading Associations in Rails](https://bhserna.com/guide-for-preloading-associations-in-rails.html) — While Benito does cover the basics, he also explains many of the more esoteric methods to preload nested and other associations. 

Benito Serna   

[React on Rails: Building a Simple App](https://www.honeybadger.io/blog/react-rails/?utm_source=rubyweekly&utm_medium=email&utm_campaign=ruby) — Learn how to create a React app from scratch and integrate it with a Rails back-end via webpacker. 

Honeybadger sponsor   

[An Object-Oriented Example](https://noelrappin.com/blog/2021/07/an-object-oriented-example/) — Noel wants to push OO patterns and design so he creates and defends a class abstraction that results in more, but cleaner, code. 

Noel Rappin   

[Five Turbo Lessons I Learned the Hard Way](https://www.viget.com/articles/five-turbo-lessons-i-learned-the-hard-way/) — Turbo is hot out of the oven, which means parts of it (and its docs) may be a bit ‘raw.’ 

David Eisnger   

▶[Object Modeling and Testing Techniques with Lee McAlilly](https://railswithjason.simplecast.com/episodes/107-object-modeling-and-testing-techniques-with-lee-mcalilly-3qhl9y7g) — A discussion on how to decide where to put your code, the benefits of good naming conventions, and how testing can help you figure out what to do and how to do it. 

Rails with Jason Podcast podcast   

▶[Load Testing Rails Apps with JMeter ft. Milap Neupane](https://devchat.tv/ruby-rogues/load-testing-rails-apps-with-jmeter-ft-milap-neupane-ruby-509/) — There’s [a blog test on the topic](https://www.honeybadger.io/blog/rails-load-testing-jmeter/) if you prefer. [Apache JMeter](https://jmeter.apache.org/) is an open source Java(!)-based app for load testing of functional behavior in apps. 

Ruby Rogues Podcast podcast  

🛠 Code & Tools 

[![\](https://res.cloudinary.com/cpress/image/upload/w_1280,e_sharpen:60/eiorx9vu0vemxrbjkpp7.jpg)](https://github.com/sdsykes/fastimage)  

[FastImage: Find the Size or Type of an Image From Its URL, Quickly](https://github.com/sdsykes/fastimage) — Somehow it’s been six years since we linked this, but it’s still getting releases. The idea is it uses small byte range scoped HTTP requests to grab as little of an image to figure things out. 

Stephen Sykes   

[Resque 2.1.0: The Redis-Backed Ruby Background Job Library](https://github.com/resque/resque) — It’s the one that isn’t Sidekiq, and this is its first release since 2018. 

Resque   

[Send Logs from Your Ruby and Ruby on Rails Applications to LogDNA](https://docs.logdna.com/docs/ruby) 

LogDNA sponsor   

[Statesman 9.0: A State Machine Library](https://github.com/gocardless/statesman) — Takes a different approach to most other state machine libraries by having you define state behavior in separate classes that are then instantiated from within your other classes. This week’s release adds Ruby 3 support. 

GoCardless   

[pusher-fake: A Fake Pusher Server for Development and Testing](https://github.com/tristandunn/pusher-fake) — If you’re using [Pusher](https://pusher.com/) to add real-time mechanisms to your app, this may come in handy during development. 

Tristan Dunn   

[Elasticsearch Integrations for ActiveModel/Record and Rails](https://github.com/elastic/elasticsearch-rails) — [v7.2.0](https://github.com/elastic/elasticsearch-rails/releases/tag/v7.2.0) just dropped. 

Elastic       

💡**Tip of the Week** 

    

## `prepend` 

We'll continue our brief _Tip Of Week_ series around using code from a module by learning about [`prepend`](https://ruby-doc.org/core-3.0.1/Module.html#method-i-prepend). [Last week](https://rubyweekly.com/issues/564), we learned about [include](https://ruby-doc.org/core-3.0.2/Module.html#method-i-include), and how it inserts a module into the ancestors chain directly after the class which includes it. 

`prepend` uses the same syntax as `include` but works differently - it inserts a module into the ancestors chain directly _before_ the class which includes it. Let's take a look: 

```
module ExampleModule
  def example_method
    "This is defined in the module we're prepending"
  end
end

class ExampleClass
  prepend ExampleModule
end

ExampleClass.new.example_method
=> "This is defined in the module we're prepending"
``` 

Now if we look at the ancestors chain, we'll see that `ExampleModule` _precedes_ `ExampleClass`. This is the exact opposite of what we saw last week with `ExampleModule` _succeeding_ `ExampleClass`: 

```
ExampleClass.ancestors
=> [ExampleModule, ExampleClass, Object, Kernel, BasicObject]
``` 

As we learned [when discussing ancestors](https://rubyweekly.com/issues/563), this means that Ruby will first look for a method defined on `ExampleModule`, and if it's not defined there, it will continue to traverse the list of ancestors, looking next at `ExampleClass` (our class itself). 

This means using `prepend` will cause the methods defined on the module we're prepending to trump methods defined on the class itself. 

```
module ExampleModule
  def example_method
    "This is defined in ExampleModule, which we're prepending"
  end
end

class ExampleClass
  prepend ExampleModule
  
  def example_method
    "This is defined in ExampleClass itself"
  end
end

ExampleClass.new.example_method
=> "This is defined in ExampleModule, which we're prepending"
``` 

`prepend` is commonly used in cases where it makes sense for a module to override a method defined in a class. Examples of this might be when a module needs to set something up in the `initialize` method, but the `initialize` method of a class itself doesn't call `super`. The `initialize` method in the module can do whatever setup it needs, and then call `super` to execute the class' `initialize` method. 

We'll learn about `extend` next week!    

This week’s tip was written by [Jemma Issroff](https://twitter.com/jemmaissroff).          

Curated by [Peter Cooper](https://twitter.com/peterc), [Glenn Goodrich](https://twitter.com/ruprict) and [Cooperpress](https://cooperpress.com/). 

[Change your email address](https://rubyweekly.com/edit_subscription/*|UID|*) or[Stop getting this newsletter](https://rubyweekly.com/leave/*|UID|*) 

© Cooper Press Ltd · Fairfield Enterprise Centre, Louth, LN11 0LS, United Kingdom
