rastam’s blog

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

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。コミットメッセージもほとんど絵文字。

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

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

http://rubyweekly.com/issues/404rubyweekly.com

Highlights

You Can Now Install TruffleRuby via RVM (and ruby-build)

RVM、rbenv でインストールできるようになった TruffleRuby。

Serious Vulnerability Found in Sprockets

Sprockets の脆弱性が判明。production で Rails アセットのコンパイルを有効にしている場合は secrets や環境変数の内容が漏れる恐れがある。

Making Tests Go Faster

テスト高速化対策 2 つ。

  1. RSpec プロファイリングで重いテストを特定し、Factory でのレコード作成を減らす。
  2. MongoDB クエリの自前ロギングで不要なクエリと発行箇所を特定・排除。

Visualize Ruby with Flowcharts

RubyDSL としたフロー図生成ツール紹介。

The Demand for Rails Developers is Still Huge

Rails の需要は未だにあるという、米国募集案件を基にした調査結果。サンフランシスコでは断トツ 1 位。

Articles & Tutorials

Rails CSRF Protection for Single-Page Applications

Rails 制 SPA 向け CSRF 対策。

First Impressions of Elixir, from a Rubyist's Perspective

Elixir に挑戦した Rubyist経験談

  • Elixir への警戒が好奇心に変わった経緯。
  • Elixir を覚えた資料。
  • 1 ヵ月後の印象。

Code & Tools

Rails DateTime Formats

Rails の DateTime フォーマットまとめ。

Maily: A Rails Engine to Preview Outgoing Emails

メール送信前のプレビュー用 Rails Engine。

TensorStream: A Reimplementation of TensorFlow for Ruby

機械学習フレームワーク TesnorFlow を Ruby で書き直した gem。

activerecord-import: Bulk Data Insertion with ActiveRecord

一括 INSERT 用 gem。

MiniSql: A Minimal, Safe SQL Executor for Postgres

PostgreSQLSQL 高速実行用 gem。

RRRSpec: Distributed RSpec Execution Service

RSpec 分散実行用 RRRSpec が最近更新された。

Spreadsheet Architect: Create Spreadsheets from Ruby Objects

ActiveRecord オブジェクトや PORO を ExcelCSV スプレッドシートに変換してくれる gem。

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

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

http://rubyweekly.com/issues/403rubyweekly.com

Highlights

Arel with Wharel: Virtual Rows for Active Record

Arel を書きやすくしてくれる超シンプルな Wharel gem を実装した経緯。APISequel に似ているが、ソースは 31 行しかない!

From ActiveRecord to Diesel (and Rust)

Rust に挑戦した Rubyistシンタックス、パッケージマネージャ、ORM など比較した話。

Adding Automated Speech Recognition for Phone Calls to Rails

Rails + Twilio で音声認識サービスを実装する手順。<Gather> の TwiML でユーザの声を文字列に変換し、指定エンドポイントに転送。

Tutorials

How to Write a Bundler Plugin

Bundler プラグイン開発・適用手順。プラグインでできることは:

Quick Tips for a Practical Rubocop Workflow

Rubocop 活用戦略。

  • オススメの初期設定
  • エディター連携
  • autocorrect 駆使
  • pre-commit フック設置

Simple Shortcuts to Get More Out of Bundler

筆者の便利な Bundler ショートカット集。

  • bundle info
  • gem をエディターで開く bundle open
  • gem 内ソース検索

Using GraphQL with Rails

graphql gem で Rails 上の GraphQL API 実装。

  • Types::QueryType でデータ取得用 API 定義
  • Types::MutationType でデータ書き込み用 API 定義
  • graphql-preload gem で N+1 撲滅
  • 開発環境のブラウザー上 UI でクエリ検証

Quick Tip: Use Beginnings and Ends of Strings in Regular Expressions

正規表現の文頭・文末は ^ $ ではなく \A \z を使う理由。

Code & Tools

Sho: An Experimental 'Post-Framework' View Library

ディレクトリなどのフレームワーク規約に拘束されないビュー用ライブラリ。テンプレートへのマッピング定義用 DSL でビュー描画メソッドを生やす。

Wallaby: A Rails Engine for Managing Data/Admin Interface

管理画面用 Rails Engine。

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

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

http://rubyweekly.com/issues/402rubyweekly.com

Highlights

Ruby 2.6 Preview 2 Released

Ruby 2.6.0-preview2 リリース。

  • JIT 一部最適化
  • RubyVM::AST 新規追加
  • Kernel#yield_selfthen アライアス
  • 無限 Range (1..)
  • など

Stripe is Building a Ruby Type Checker

Stripe 社が RubyKaigi で発表した、開発中の型チェックツール Sorbet

http.rb is Great and Here's Why

筆者お気に入りの HTTP クライアント http.rb の機能紹介、Net::HTTP との比較。

An Analysis of Memory Bloat in Active Record 5.2

ActiveRecord のメモリ肥大化は、データ型変換の遅延評価でオブジェクト作り過ぎているのが原因。

An Initial Ruby 2.6 Preview 2 Benchmark

Ruby 2.6.0-preview2 ベンチマークRuby 2.5.0 より 17.7% 高速化。

Some Favorite Ruby Community Resources

Ruby ポッドキャスト、ブログ、メルマガまとめ。

Tutorials

Examples of Some 'Hidden Jewels' in Ruby's Standard Library

知られざる Ruby 標準ライブラリ。

  • CLI 引数パース用 GetoptLongOptionParser
  • 簡易 KVS DBM, GDBMSDBM
  • オブジェクト永続化用 PStore
  • Observable
  • DRb
  • TSort
  • Math
  • Abbrev
  • Zlib

Interesting Problems: Mondrian

Ryan Davis 先生が自作 graphics gem でモンドリアン絵画風画像を生成してみた話。

Coding Sidekiq Workers the Right Way

Sidekiq ワーカーを書くルール。

  1. ワーカー内にロジック書くな。
  2. 実行時間の長いワーカー書くな。マスター・スレーブのワーカーに分けよう。
  3. ワーカーをディレクトリ別で整理しよう。
  4. スケジューリングは計画的に。
  5. 定期的に実行時間を監視し、必要に応じてリファクター。

Conditional Execution with a DSL in Ruby

条件分岐をコールバックで書く DSL 案。

Ruby's Redo, Retry, and Next Keywords

redo retry next の紹介と比較。

Using Concurrent Ruby in a Rails App

Concurrent RubyConcurrent::Future で並行処理を実装した経験談。スレッド内例外が気付きにくくてバグの原因になったが、ラッパーで対応した。

Rails 5.2 Adds allow_other_host Option to redirect_back Method

Railsredirect_back メソッドに追加された allow_other_host オプションで、外部サイトへの遷移が制御できるようになった。

Code & Tools

Asynchronize: Easily Make Multiple Methods Asynchronous

メソッドを非同期化(別スレッド実行)するマクロを提供してくれる gem。

DeepPluck: Pluck Attributes From Nested Associations

ネスとされたアソシエーションから一括 pluck してハッシュ返してくれる ActiveRecord 拡張 gem。select での自前より高速!

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

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

http://rubyweekly.com/issues/401rubyweekly.com

Highlights

'then' Is Now an Alias for 'yield_self' (in Ruby 2.6)

3 ヶ月もの議論の上で yield_self のアライアス thenRuby 2.6 にマージされた。

JRuby 9.2.0.0 Released

Ruby 2.5 に対応した JRuby 9.2.0.0 リリース。

Spina CMS 1.0: A CMS for Rails Devs

CMSRails Engine。

TestProf: Factory Therapy for Your Ruby Tests

テスト最適化ツールキット TestProf gem で Factory 軽量化。

  1. EventProf で Factory 処理の思いテストを特定。
  2. FactoryProf で階層の深い Factory、使用率の高い Factory を特定。flame graph でも可視化可能。
  3. FactoryDefault で階層の深い Factory のアソシエーションを再利用。
  4. AnyFixture で使用率の高い Factory を fixture に。

9 Ruby Conferences Worth Seeing This Summer

夏の Ruby カンファレンスまとめ。

Tutorials

Railway Oriented Programming in Ruby

dry-transaction gem で鉄道指向プログラミングを実現。

Upgrading Rails 4 Controller Tests to Rails 5

Rails 4 コントローラテストのリクエスト発行メソッドの引数を Rails 5 のキーワード引数に移行する方法。

  1. rails-forward_compatible_controller_tests gem でキーワード引数を Rails 4 にバックポート。
  2. rubocop -a --only Rails/HttpPositionalArguments でキーワード引数に変換。
  3. rails5_xhr_update gem で xhr メソッドを変換。

Active Record's .first and .last May Not Mean What You Think

Active Record の .first .lastcreated_at 順ではなく id 順だよー、という注意書き。

Rails Gaining a Eumerable#index_with Method

Hash のキーを指定する Enumerable#index_by の次に、Hash の値を指定する Enumerable#index_withActiveSupport に追加された。

Running Chrome Headless, Selenium and Capybara Inside GitLab CI and Docker

Docker コンテナ内に動かなくなった Chrome Headless テストを --no-sandbox オプションで実行することで動くようにした話。

Faster JSON Generation using Postgres's JSON Function

重くなりがちな Ruby での JSON 生成を、PostgreSQL に委任することで軽量化。

Quick Tip: Content-Type application/json by Default in Rails 5

Rails APIContent-Type をデフォで application/json にしてくれるミドルウェア

Ruby's Magical 'Enumerable' Module

Enumerable Enumerator で連結リストを実装してみた話。

The Case for 'before_validation' Callback: Complex State Normalization

オブエクトの状態を正規化するなら before_validation 使っていいよ、という主張。

Code & Tools

Stealth: A Framework for Building Conversational Bots

チャットボット用 MVC フレームワーク gem。

Niceql: Colorized SQL Formatting in Ruby

irbSQL 出力をフォーマット、シンタックス・ハイライトしてくれる gem。

29+ Ruby Gems For Building Command Line Programs

CLI 開発用 gem まとめ。