Ruby Weekly #369: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
Symbol
と String
の不一致がバグの根源なので、Ruby から Symbol
を捨てないかという提案。
- 下位互換性を維持するには、
Symbol
を#freeze
したString
にすれば良い。 Symbol#to_s
から#freeze
されてないString
を返すようにする。#hash
を同等にする必要がある。Symbol#hash
計算が 2〜3 倍速いから、String#hash
計算もSymbol#hash
に合わせたい。
Fixnum
Bignum
捨てたし、Symbol
も捨てれるのでは?と。
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。
株式会社デジカの Chris Salzberg 氏が RubyKaigi でトークを発表した話。たまたま Matz のキーノートと同じく、モジュールを題にしてた。しかし「モジュールはクラスではない」と言わんばかりの Matz 発言が Salzberg 氏のトークと矛盾してたのでちょっと困った。Module
は Class
だからこそ Ruby ならではの Module Builder パターンが可能。
-rubygems
に対応するための ubygems.rb
が削除された、というちょっと面白いコミット。
Gusto 社の給与システムが関数型 Ruby になるようにリファクターした話。
- PFaaO パターンで純粋関数オブジェクトを実装した。給料計算関数オブジェクトを例として挙げた。
- 純粋関数オブジェクトなので、メモ化していても参照透過性が維持されてる。
- 給料計算関数オブジェクトの中の税金計算メソッドを税金計算関数オブジェクトに抽出した。
- ActiveRecord モデルそれぞれに対して immutable な Value Object を切って、純粋関数オブジェクトにValue Object のほうを渡すようにした。
News
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 機能など込み。
- Angular プロジェクトの該当 directive ファイルを開く関数
Ruby コアの delegate.rb をコードリーディングした話。
Delegator
が継承しているのは、不要なメソッドを省略されたKernel
。#initialize
#method_missing
メソッドはDelegator
にて実装されている。- デリゲート先オブジェクトの accessor は
SimpleDelegator
など子クラスで実装されている。 #method_missing
がチェックするのはデリゲート先オブジェクトと一部省略したKernel
。
Hash#fetch
でデフォ値を返すようにする。ブロック渡せば遅延評価もできる。
筆者著作の Domain-Driven Rails 本の抜粋。メソッドを 2 つのメソッドに分解することで Event Sourcing するというルールの解説。2 つのメソッドとは:
- イベントを発行するメソッド
- イベントの効果を適用するメソッド
Ruby 配列いろいろ
#initialize
方法いろいろ#slice
方法いろいろ#insert
方法いろいろ<=>
挙動|
挙動&
挙動
Ruby 2.4 では Enumerable#min
Enumerable#max
Enumerable#minmax
が速くなった!
validate uniqueness:
使用時の高速化案。
筆者作品の UniqueValidationInspector gem では、インデックスのない validate uniqueness:
を検知できる。
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 スレ。
Python コードのパフォーマンスを最適化した Richard Schneeman 先生。
Ruby との共通ルール:
- ダブってるロジックを省けば軽くなる。
- オブジェクトのインスタンス化を省けば軽くなる。
- オブジェクトのシリアライズを省けば軽くなる。例:シリアライズした配列を引数として渡すよりも、要素を渡したほうが軽い。
- ループ内のリテラルを省けば軽くなる。リテラル=オブジェクトのインスタンス化なので。
- 不要なロジックを省けば軽くなる。あり得ない
if
文の分岐点など。 - メソッドを省けば軽くなる。効果はそんなに大きくないので、このルールに関しては無理しなくて良し。
- ベンチマーク必須。
- キャッシュするなら、オブジェクトのインスタンス化ルールは破って良し。
レガシー Rails アプリに呆れて、18 ヶ月も Rails を避けていた経験で得た知見。
- 悪いのは Rails 自体ではなく、Rails の用途に合わないアプリ
- 何でも gem に依存させるのも良くない
- Rails はドキュメンテーションが充実してる
Opinion
default_scope
ではなく明示的に scope
使おうという主張。
new
したモデル属性はdefault_scope
で設定されちゃうのが予期せぬバグの元。default_scope
を外すことは辛い。unscoped
だとアソシエーションのスコープまで外れちゃったりするから。
Tools
Ruby 上級者向け書籍。
- オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- Rubyのしくみ -Ruby Under a Microscope-
- Effective Ruby
- Ruby Way 第2版 (Professional Ruby Series)
- Mastering Ruby Closures: A Guide to Blocks, Procs, and Lambdas
- Rails, Angular, Postgres, and Bootstrap: Powerful, Effective, Efficient, Full-Stack Web Development
- 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。
Bing Maps API クライアント用 gem。