rastam’s blog

東京在住のマレーシア人 Rubyist

Ruby Weekly #369: 日本語サマリー

職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/369rubyweekly.com

Highlights

Could We Drop Symbols From Ruby?

SymbolString の不一致がバグの根源なので、Ruby から Symbol を捨てないかという提案。

  • 下位互換性を維持するには、Symbol#freeze した String にすれば良い。
  • Symbol#to_s から #freeze されてない String を返すようにする。
  • #hash を同等にする必要がある。Symbol#hash 計算が 2〜3 倍速いから、String#hash 計算も Symbol#hash に合わせたい。

Fixnum Bignum 捨てたし、Symbol も捨てれるのでは?と。

Ruby Dev Summit: A Free Online Event for Rubyists

Ruby Rogues の Charles Max Wood 先生主催の Ruby Dev Summit 分散型カンファレンス(物理的開催地はなく、参加者はみんな動画配信やチャットで交流・登壇)。

get_schwifty: Render Portions of Rails Views in a Background Job Queue

重い partial を ActiveJob で render、ActionCable でブラウザー上非同期描画する gem。

Rediscovering Modularity in Ruby

株式会社デジカの Chris Salzberg 氏が RubyKaigi でトークを発表した話。たまたま Matz のキーノートと同じく、モジュールを題にしてた。しかし「モジュールはクラスではない」と言わんばかりの Matz 発言が Salzberg 氏のトークと矛盾してたのでちょっと困った。ModuleClass だからこそ Ruby ならではの Module Builder パターンが可能。

'ubygems.rb' Removed from Ruby Core

-rubygems に対応するための ubygems.rb が削除された、というちょっと面白いコミット。

Embracing Functional Programming in Ruby

Gusto 社の給与システムが関数型 Ruby になるようにリファクターした話。

  • PFaaO パターンで純粋関数オブジェクトを実装した。給料計算関数オブジェクトを例として挙げた。
  • 純粋関数オブジェクトなので、メモ化していても参照透過性が維持されてる。
  • 給料計算関数オブジェクトの中の税金計算メソッドを税金計算関数オブジェクトに抽出した。
  • ActiveRecord モデルそれぞれに対して immutable な Value Object を切って、純粋関数オブジェクトにValue Object のほうを渡すようにした。

News

Announcing Hanami V1.1.0.beta3

Hanami v1.1.0.beta2 リリース翌日に、バグ解消で v1.1.0.beta3 リリース。

Tutorial

Surrealist: A Gem to Serialize Ruby Objects According to a Defined Schema

シリアライズスキーマ定義 surrealist gem の紹介。データ型定義やキー camelize 機能など込み。

How to Program Vim Using Ruby

RubyVim プログラミングした話。

  1. Angular プロジェクトの該当 directive ファイルを開く関数

Perusing delegate.rb from Ruby’s Standard Library

Ruby コアの delegate.rb をコードリーディングした話。

  • Delegator が継承しているのは、不要なメソッドを省略された Kernel
  • #initialize #method_missing メソッドは Delegator にて実装されている。
  • デリゲート先オブジェクトの accessor は SimpleDelegator など子クラスで実装されている。
  • #method_missing がチェックするのはデリゲート先オブジェクトと一部省略した Kernel

Accessing Hash Values with Fallbacks for Missing Data

Hash#fetch でデフォ値を返すようにする。ブロック渡せば遅延評価もできる。

One Simple Trick to Make Event Sourcing Click

筆者著作の Domain-Driven Rails 本の抜粋。メソッドを 2 つのメソッドに分解することで Event Sourcing するというルールの解説。2 つのメソッドとは:

  1. イベントを発行するメソッド
  2. イベントの効果を適用するメソッド

Some Interesting Methods and Behavior with Arrays in Ruby

Ruby 配列いろいろ

  • #initialize 方法いろいろ
  • #slice 方法いろいろ
  • #insert 方法いろいろ
  • <=> 挙動
  • | 挙動
  • & 挙動

Ruby 2.4 Has Optimized Enumerable 'min' and 'max' Methods

Ruby 2.4 では Enumerable#min Enumerable#max Enumerable#minmax が速くなった!

Considering Performance and Unique Validations in Rails

validate uniqueness: 使用時の高速化案。

  1. インデックスを張ること。Rails の validation を高速化するため。
  2. UNIQUE インデックスを張ること。Rails の validation を完全に省けるため。

筆者作品の UniqueValidationInspector gem では、インデックスのない validate uniqueness: を検知できる。

Ways to Check Which Ruby Version You're Using

Ruby バージョン確認方法まとめ

環境 確認方法
irb RUBY_VERSION
rvm rvm current
rbenv rbenv version
コマンドライン ruby -v
コマンドライン which ruby
コマンドライン gem env

Story

A Reddit AMA with the Authors of 'Effective Testing with RSpec 3'

Effective Testing with RSpec 3 著者たちの質疑応答 Reddit スレ。

How A Lifelong Rubyist Made Some Python Code 5x Faster

Python コードのパフォーマンスを最適化した Richard Schneeman 先生。

Ruby との共通ルール:

  • ダブってるロジックを省けば軽くなる。
  • オブジェクトのインスタンス化を省けば軽くなる。
  • オブジェクトのシリアライズを省けば軽くなる。例:シリアライズした配列を引数として渡すよりも、要素を渡したほうが軽い。
  • ループ内のリテラルを省けば軽くなる。リテラル=オブジェクトのインスタンス化なので。
  • 不要なロジックを省けば軽くなる。あり得ない if 文の分岐点など。
  • メソッドを省けば軽くなる。効果はそんなに大きくないので、このルールに関しては無理しなくて良し。
  • ベンチマーク必須。
  • キャッシュするなら、オブジェクトのインスタンス化ルールは破って良し。

What I Learned After Going 18 Months Without Rails

レガシー Rails アプリに呆れて、18 ヶ月も Rails を避けていた経験で得た知見。

Opinion

Don't Use default_scope. Ever. Here's Why.

default_scope ではなく明示的に scope 使おうという主張。

  1. new したモデル属性は default_scope で設定されちゃうのが予期せぬバグの元。
  2. default_scope を外すことは辛い。 unscoped だとアソシエーションのスコープまで外れちゃったりするから。

Tools

Recommended Ruby and Rails Books for Experienced Developers

Ruby 上級者向け書籍。

  1. オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
  2. Rubyのしくみ -Ruby Under a Microscope-
  3. Effective Ruby
  4. Ruby Way 第2版 (Professional Ruby Series)
  5. Mastering Ruby Closures: A Guide to Blocks, Procs, and Lambdas
  6. Rails, Angular, Postgres, and Bootstrap: Powerful, Effective, Efficient, Full-stack Web Development
  7. Service-Oriented Design with Ruby and Rails (Addison-Wesley Professional Ruby Series)

Code

render_async 1.0: Render View Partials Asynchronously via Ajax

Rails ビューの partial を AJAX で非同期ロードする gem。

Virtualearth: Bing Maps API Wrapper

Bing Maps API クライアント用 gem。