rastam’s blog

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

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

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

http://rubyweekly.com/issues/411rubyweekly.com

Highlights

Visualizing Ruby Execution

Ruby コードのロジックをフロー図に変換してくれる VisualizeRuby gem。

Changing the Way Ruby Creates Objects

.new メソッドをオーバーライドしてみた話。

  • #initialize 前にシングルトンクラスに対してモジュールを include
  • #allocate で子クラスにも include されるように。

Finding Where STDOUT/STDERR Debug Messages Are Coming From

Discourse デバッグ中の Sam Saffron 先生が STDERR モンキーパッチでエラー発生元を出力させた話。

Rails 5.2.1 Released

Rails 5.2.1 リリース!

How to Use Bundler in a Single-File Ruby Script

require 'bundler/inline'gemfile ブロックだけで、単独ファイルの Ruby スクリプトでも Bundler 使えちゃう。

First Beta of Hanami 1.3 Released

Hanami v1.3.0.beta1 リリース。v1.3.0 は 10 月リリース予定。

  • RSpec がデフォになった

Articles & Tutorials

Designing Services with dry-rb

dry-rb でサービスクラス実装。

  • Dry::Initializer で注入する依存性定義。
  • Dry::Validation で注入した依存性のルール定義。
  • Dry::MonadsSuccess Failure オブジェクトを返す。

Ruby 2.6's Dir#each_child and Dir#children Instance Methods

Ruby 2.5 の Dir.each_child Dir.children に該当する Dir#each_child Dir#children インスタンスメソッドが Ruby 2.6 で登場。

Improving Partial Loading Performance

partial パフォーマンス向上方法 2 つ。

  • bullet で N+1 クエリ検知・撲滅。
  • ビューからの SQL 発行を検知してくれる自前 concern。

How Can I Use Ruby 2.6 JIT?

JIT の紹介。

  • JIT とは、Ruby 稼働中によく呼ばれるメソッドの特定・コンパイル
    • メモリが倍ぐらいかかっちゃう
    • コンパイル完了までは重い
  • 今までの JIT 実装
    • JVMコンパイルを先にやるせいで、起動が重い
    • Rubinius などの JIT がいろいろ提案されてきたが、起動速度とメモリのせいで却下
  • 許容範囲内の保守性・起動速度・メモリを誇る MJIT は、いよいよ Ruby 2.6 で登場。
    • 稼働中にバックグラウンドで少しずつコンパイルすることで、起動は速くなるが、高速化するまでは時間がかかる
    • 現時点 Rails は重くなるだけ
    • MJIT はデフォ無効

Back to the Primitive. Testing with Simplicity

テストの期待値は、ヘルパーなどの戻り値ではなく、プリミティブにしようという主張。

Code & Tools

Paraspec: Parallel RSpec Test Runner

RSpec テスト並列実行用 gem。ファイル単位だけではなく spec 単位でも分散できる。

Groupdate: Group Temporal Data with Active Record, Simply

ActiveRecord や Enumerable を年、月、日付、曜日、時間などでグループしてくれる gem。

Xcode::Install: A Ruby Tool to Install and Update Xcode Versions

XCode 最新バージョンをインストールしてくれる CLI 用 gem。

TTY::Screen: Cross-Platform Terminal Screen Size Detection

ターミナルのサイズを検知してくれる gem。

capybara-screenshot: Automatically Save Screen Shots When a Capybara Scenario Fails

Capybara テストが落ちたらスクショを保存してくれる gem。

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

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

http://rubyweekly.com/issues/410rubyweekly.com

Highlights

Stop Shipping Untested Ruby Code with Undercover

指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる undercover gem の機能紹介。

Generating Random Numbers in Ruby

乱数生成いろいろ。

  • rand
  • srandrand のシード指定
  • Random.rand
  • rubystats gem の Rubystats::NormalDistribution正規分布に従った乱数生成

Evaluating Scala and Sticking with Ruby

Scala で新規アプリ開発してみた REA 社が最終的に関数型 Ruby にした話。

  • 生産性向上を期待していたが、そこまで変わらなかった
  • パフォーマンスは確かに Scala 圧勝
  • 関数型プログラミングで保守性の改善を期待していたが、、ボイラープレートが多くて可読性暴落

Rails 5.2.1 RC 1 Released

Rails 5.2.1.rc1 リリース。Rails 5.2.1 は今日中にリリース予定。

Articles & Tutorials

Building a Testing Framework Similar to RSpec in Ruby

RSpec 風テストフレームワークの作り方。

Rails 5.2 Encrypted Credentials Cheat Cheat and Tips

Rails 5.2 Credentials 備忘録。

  • config/credentials.yml.enc はコミットしても OK
  • config/master.key はコミットするな!.gitignore、.dockerignore に入れること!
  • CI ログには RAILS_MASTER_KEY 環境変数を出すな!
  • キー変更手順

Ruby 2.6 Added Some Options to Exception#full_message

Ruby 2.6 で Exception#full_message に追加されたオプション引数まとめ。

  • highlightエスケープ文字を消す
  • order

Send Emails with Style in Rails

HTML メールの CSS をインライン style 属性として当ててくれる gem まとめ。

Ruby 2.6 Adds Option to Not Raise Exception for Integer and Float Methods

変換できない文字列を渡されたら ArgumentError を投げる Integer()Float() メソッドは、Ruby 2.6 以降、exception オプション引数で例外を抑えれるようになる。

Using Rails Encrypted Credentials with Docker

Docker で Rails Credentials を使う方法。

  • 開発用コンテナ上で rails credentials:edit が実行できるための設定
  • マスタキーの渡し方

Code & Tools

Undercover: Like RuboCop But For Code Coverage

指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる gem。

MiniI18n: Minimalistic Internationalization for Ruby

簡易 i18n 用 gem。

Orbacle: A Ruby 'Language Server' for Code Editors

vimemacsAtom などにコード補完やリファクター機能を提供してくれる Ruby 言語サーバ。

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

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

http://rubyweekly.com/issues/409rubyweekly.com

Highlights

Pundit 2.0 Released: The Pure Ruby Authorization Library

認可用 Pundit gem は v2.0 リリース!

Tweaking Ruby's Global Method Cache

グローバルメソッドキャッシュいろいろ。

  • メソッドの定義元クラス・モジュールをマッピングするキャッシュ。定義元を毎回評価するのにコストがかかるから。
  • RUBY_GLOBAL_METHOD_CACHE_SIZE 環境変数でキャッシュするメソッドの数を指定(デフォ 2048)。
  • メソッド数増やしても高速化は 2%〜3% しかない。

Faker: The Library for Generating Fake Data

ダミーデータ生成用 gem。

Articles & Tutorials

Painlessly Managing Long Running Processes in Your Views

fie フレームワークで ActiveJob の進捗をプログレスバーとして表示。

Adding Authorization to Sinatra with Pundit

Sinatra アプリで pundit gem を使う手順。

Ruby 2.6 Adds Binding#source_location

ファイル名、行番号を返してくれる、Ruby 2.6 の Binding#source_location

Hiding .gemrc Credentials in Dotfiles

コミット対象の .gemrc の中の認証トークンなどを隠す方法。

  1. トークンを dotfile に移す
  2. GEMRC 環境変数で dotfile を指定することで、.gemrc の設定が dotfile の設定とマージされる

Making Ruby Yours with the pretty_ruby Gem

コアメソッドに可読性向上の拡張をしてくれた pretty_ruby gem。拡張はモンキーパッチではなく、安心安全な refinement で。

  • .map { |x| x.join('-') }.map(:join, '-')
  • .map { |x| x.next.upcase }.map(:next >> :upcase)
  • .reduce(['']) { |m, x| m << m.last + x }.drop(1).scan
  • #take #drop のマイナス引数対応

11 Books Every Ruby on Rails Developer Should Read

Rails 開発者必読の書籍 11 冊。

Code & Tools

TTY::Box: Draw Frames and Boxes in Your Terminal Window

CLI で四角い枠を描画してくれる gem。

FastJsonapi: A Super-Fast JSON:API Serializer for Ruby Objects

v1.3 がリリースされた高速 JSON:API シリアライズ用 gem。

Crystalball: Run Only the Specs You Need to Run

カバー率測定で、修正したファイルの関連 RSpec テストを特定してくれる gem。

OpenStreetMap: Ruby Gem for OpenStreetMap API Integration

OpenStreetMap API クライアント gem。

graphql-ruby: A Ruby Implementation of Facebook's GraphQL

GraphQL API フレームワーク用 gem。

Terraforming: Export Existing AWS Resources to Terraform Style

既存の AWS リソースを元に Terraform 用 .tf、.tfstate 設定を生成してくれる gem。

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

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

http://rubyweekly.com/issues/408rubyweekly.com

Highlights

Don't Step on a Rake, Use Rake::DSL

Rake タスク群の DRY 化は、メソッド抽出ではなく、Rake::DSL のクラスを抽出しよう。

TruffleRuby Now Easily Installable via RVM, rbenv, and ruby-install

TruffleRuby は rvm、ruby-build、ruby-install でインストールしやすくなった。

Ruby 2.6 Adds String#split with Block

Ruby 2.6 の String#split にブロック引数を渡せるようになった。"hoge".split { }"hoge".split.each { } は挙動的に変わらないが、ブロック引数のほうは Array オブジェクトを作らないためパフォーマンス最適化に使える。

How to Replace wkhtmltopdf for PDF Generation from Ruby

HTML → PDF 変換用 CLI ツール wkhtmltopdf の問題点と別案まとめ。

JavaScript-'Sprinkled' Rails Applications

フラグメントキャッシュを活かしたビューを、turbolinks:load イベント内 Ajax でユーザ毎にカスタマイズした話。

Articles & Tutorials

The Forwardable Module in Ruby

Forwardable#def_delegator#def_delegators#delegate メソッド解説。

Thin and Maintainable Rails Mailers

Rails 5.1 の ActionMailer::Base#params ハッシュで Mailer をリファクターした話。defaultbefore_action から params ハッシュが呼べるようになったおかげで、アクションメソッドの中身をインスタンス変数の代入と #mail 呼び出しのみに減らせた。

Everything You Need to Know About Ruby Operators

Ruby演算子まとめ。

How to Write a Case Expression in Ruby

case 文の使い方。

Code & Tools

SmartEnum: Enums for Ruby That Aren't Just Symbols

メソッドが生やせる enum 定義用 gem。enum のダックタイプまでチェックしてくれる。(未安定)

Pragmatic Segmenter: Rule-Based Sentence Boundary Detection

10 ヶ国語対応のセンテンス単位セグメンテーション用 gem。

XmlMatchers: Validate Your XML API Responses against XSD XML Schemas

XML レスポンスを XSD で検証するための RSpec Matcher を提供してくれる gem。

Easy GraphQL Caching with GraphQL Cache

graphql-ruby gem のフィールド別キャッシュ用プラグイン

InSpec: An Auditing and Testing Framework for Infrastructure

インフラ周りの RSpec 記法テストフレームワーク

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

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

http://rubyweekly.com/issues/407rubyweekly.com

Highlights

Generating Music with Sonic Pi and Ruby

Sonic Pi で音楽生成。

'Why I Recommend Against Using Cucumber'

Cucumber が Capybara に一切勝らないという主張。

Under the Hood of “Slurping” and Streaming Files in Ruby

IO.readIO.foreach の内部処理の解説。

Tutorials

Improving Your Ruby Development Process with Pry

Pry とその便利機能の紹介。

  • ls -G または find-method でメソッド検索
  • show-source
  • show-doc
  • .pryrc でお気に入りエディター設定
  • play -l で指定行のコード実行
  • show-models
  • show-routes

A Look at Some Useful ActiveRecord Methods

ActiveRecord メソッド紹介。

  • #pluck
  • #sum
  • #uniq
  • #update_all

Write Bash/Zsh Tab Completion Scripts in Ruby

bash でも zsh でも動くタブ補完スクリプトRuby で実装する方法。

  • zshARGV を設定してくれないから、COMP_LINE 環境変数でコマンドやオプションを地道にパース
  • .zshrc と .bash_profile の設定

Ruby 2.6 Raises an Exception if 'else' Is Used Inside 'begin..end' Block Without 'rescue'

rescue を書かなかった下記ブロックは

begin
else
end

Ruby 2.6 以降、例外を投げるようになった。

Queries on Rails: A Tour of Active Record and Arel

ActiveRecord と Arel のメソッド紹介。

  • #where 連結で AND
  • #or
  • #find_by
  • #limit
  • #not
  • #order
  • #group
  • #includes
  • #joins
  • Arel の #matches

Code & Tools

Staytus: An Open Source Service Status App

システム稼動ステータス告知用 Rails アプリ。

PgHero: A Performance Dashboard for Postgres

PostgreSQL パフォーマンス監視ダッシュボード用 Rails engine。

Down: For Flexible Streaming and Downloading of Remote Files over HTTP

ファイルダウンロード用 gem。ストリーミングにも対応。

StaleOptions: A Gem for Caching HTTP Responses

ActionController のレスポンスをキャッシュしてくれる gem。

Spreadsheet Architect: Create Excel, OpenDocument or CSV Spreadsheets from Ruby Objects

CSVExcel スプレッドシート生成用 gem が v3 にバージョンアップ。

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

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

http://rubyweekly.com/issues/406rubyweekly.com

Highlights

Running JRuby on the Graal JIT

Graal JIT 上に JRuby を動かす手順とパフォーマンスの比較。

Ruby Memory Environment Variables: Simpler Than They Look?

Ruby メモリ制御用環境変数の解説。おまけにアプリの最適な環境変数設定を記録してくれる EnvMem gem の紹介。

How Not to Structure Your Database-Backed Webapps

OSS Rails アプリ 12 個のパフォーマンスを調査した論文。ORM、DB 設計、アプリ設計などの問題点種別で集計。

Your Business Rules Are Objects Too

条件達成判定メソッドをルールオブジェクトとして抽出しようと提案した Avdi Grimm 先生。

Ecommerce at Scale: Inside Shopify's Tech Stack

Shopify を支えているインフラの進化。

  • 社内各システムの稼働率SSL 証明書有効性、脆弱性有無など一望できる ServicesDB という Rails アプリ
  • 巨大 MySQL DB → 出店者別シャード → 出店者別ポッド(個別 MySQL DB + Redis + Memcache + cron)
  • jQuery + prototype.jsBatman.js の SPA → 生 JS → React + TypeScript
  • GraphQL
  • Buildkite で 10 万テスト並列実行
  • ShipIt で継続的デプロイ
  • オンラインメンテで 100 以上ものシャードを非同期で db:migrate

Covered: An Experimental Coverage Tool Using Ruby 2.6 Features

カバー率計算用 gem。Ruby 2.6 の RubyVM::AST.parse を駆使することで、今まで計算できなかったテンプレートまで計算できるようになった。

Articles & Tutorials

Writing Testable API Documentation Using APIB and Dredd

Rails APIドキュメンテーションAPI Blueprint 形式で作成、実際の API との整合性を Dredd でテスト。

Ruby 2.6 Adds Syntax for Endless Ranges

Ruby 2.6 の無限 Range 0..0..nil でも書ける。

A Complete Guide to JSON Serialization in Rails

JSON シリアライズ関連 gem まとめ。

パフォーマンス的には、Fast JSON API + Oj が最も速い組み合わせ。

Visualizing and Optimizing JS Bundle Size in Rails/Webpacker Apps

webpack-bundle-analyzer で webpack の bundler の構成を可視化し、不要なものを webpack 設定から外す方法。

Notes on Writing Service Objects

筆者のサービスオブジェクト関連ルール。

  • public メソッドは 1 個のみ。SRP 守るように。
  • .new は明示的に呼ぶこと。引数は DI のみ。
  • インスタンス変数を設定するのは #initialize のみ。
  • private メソッドから他の private メソッドを呼ぶな。深い階層は読みづらい。
  • ローカル変数は遠慮せず。
  • ループではサービスオブジェクトのインスタンスを再利用しよう。
  • 戻り値はバリューオブジェクト。
  • モナド使おう。
  • 必要に応じて、上記ルール破って良い。

Custom Exceptions in Ruby

カスタム例外の使いこなし方。

Escaping the SPA Rabbit Hole with Modern Rails

モダン Rails (Turbolinks + Stimulus + SJR)で脱 SPA。SPA の複雑さなどの問題点とそれぞれを解決するモダン Rails 機能。

Rails 5.2 Added 'write_multi' Method to Cache Store

Rails 5.2 の ActiveSupport::Cache::Store#write_multi のおかげで複数キーを一括で書き込めるようになった。

Sidekiq-ifying Emails at Reflektive

非同期でメールを送信している Reflektive 社。メールの数が多くなると発送が遅くなってしまった DelayedJob から、高速かつ監視しやすい Sidekiq に移行した話。

Code & Tools

Snibox: A Self-Hosted Code Snippets Manager

コードスニペット管理ツール Rails アプリ。

Eps: Linear Regression for Ruby

線形回帰用 gem。

Sym: A CLI and Ruby API to Encrypt and Decrypt Sensitive Data

secret などの暗号化・復号化 CLI 用 gem。

WIP: Promote Webpacker to the Default JavaScript Compiler for Rails 6

Webpacker をデフォにしようとしている DHH のプルリクエスト。

OpenProject: Open Source Project Management Software

プロジェクト管理ツール Rails アプリ。

cache_with_locale: Automatically Add Locale to Your Cache Keys

ロケール別キャッシュを持たせるように、ロケールをキャッシュのキーに挿入してくれる gem。

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

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

http://rubyweekly.com/issues/405rubyweekly.com

Highlights

Support of Ruby 2.2 Has Ended

Ruby 2.2 サポート終了。

Fie: A Rails-Centric Frontend Framework Running over WebSockets

ビューの状態を Rails のサーバ側で管理できるようにしてくれるフロントエンドフレームワーク

The Ongoing Quest for Ruby Pattern Matching

Ruby でのパターンマッチングのデザイン・実装案。

Safely Migrating from Paperclip to Active Storage

Paperclip から Active Storage への移行をテストで保証した話。

  • データ移行のテスト
  • ファイルのローカル保存でのテスト
  • S3 でのテスト
  • データ移行 + ファイルのローカル保存でのテスト
  • 本番データ移行のテスト
  • staging 環境で外部 API 込みテスト

Ruby's Powerful Method Arguments and How To Use Them Correctly

通常引数、デフォルト引数、キーワード引数、可変引数の使い分け。

Articles & Tutorials

Rails and Conditional Validations in Models

利用規約承諾 validation の実装案 5 つ(DB に承諾フラグを保存しないパターン)

  1. モデルに virtual attribute 追加
  2. 作成時のみモデルに virtual attribute 追加
  3. 特定 context のみモデルに virtual attribute 追加
  4. フォームオブジェクト
  5. モデルオブジェクトを extend

Managing Stripe Subscription Payments in Rails

Rails アプリの Stripe 定期支払い実装手順。

How to Ignore PHP-Targeting Bots with Rack::Attack

Rack::Attack で PHP 狙いボットを弾く方法。

Docker for Rails Development

Rails 開発用 Docker コンテナ作成手順。

Delegating Methods in Ruby with Forwardable

Forwardable の使い方と、delegate マクロの自前実装方法。

Disassembling Rails: How Fragment Caching Works

Rails フラグメントキャッシング周りのコードリーディング。

Code & Tools

RecentRuby: CLI Tool to Check For A Recent and Secure Ruby Version

使用中 Ruby バージョンには最新セキュリティパッチが入っていないか検知してくれる CLI ツール gem。

dry-monads 1.0 Released

dry-monads は安定したバージョン 1.0 がリリースされた。

Rutie: A Tie Between Ruby and Rust

Ruby で Rust が使える、そして Rust で Ruby が使えるようにしてくれる gem。ruru をフォークした次世代拡張。

BreezyPDFLite: A Ruby Client for a Self Hosted HTML to PDF Converter

Headless Chrome で HTML を PDF に変換してくれるマイクロサービス gem。

Rydux: A Ruby Implementation of Redux

Redux らしき状態管理機能を実装した gem。

ActiveEmoji: Emoji Aliases for Core Ruby Methods

Ruby コアのメソッドを絵文字でアライアスを定義した gem。コミットメッセージもほとんど絵文字。