rastam on rails

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

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

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

http://rubyweekly.com/issues/388rubyweekly.com

Highlights

Ruby Optimization with One Magic Comment

# frozen_string_literal: true でファイル内文字列を全て freeze することで無駄な String オブジェクト生成を減らす。

Clowne: Clone Ruby Models With a Smile

モデルデータの複製サービスクラス定義用 gem。polymorphic アソシーエションまで対応できてる。

Build Your Own RSpec: A Gentle Metaprogramming Intro

RSpecDSL を作ることでメタプロ紹介。

Rubygems.org TLS 1.0 and 1.1 Deprecation Notice

セキュリティ脆弱性が発覚された TLSv1.0、v1.1 を deprecate、無効化した RubyGems。Bundler などはバージョンによって RubyGems サーバに接続できなくなる。バージョンアップが必要かどうかチェックしてくれるコマンドは curl -sL https://git.io/vQhWq | ruby

Tutorial

How To Parse Command Line Options with OptionParser

CLI オプションをパースしてくれる Ruby コアの OptionParser

Quick Tip: Temporarily Disabling 'Touching' in ActiveRecord

ActiveRecord.no_touching ブロックで touchupdated_at 更新)しないように。バッチ処理などで DB を叩く回数が減らせる。

Ajax on Rails with Unobtrusive JavaScript

form_with がデフォで Ajax となった Rails 5.1 の UJS。

Code

Globalize: Rails I18n Library for ActiveRecord

ActiveRecord データの i18n 用 gem。

image_optim: Optimize Images Using Multiple Utilities

10 数ユーティリティで画像ファイル最適化 gem。

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

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

rubyweekly.com

Highlights

An Update on the Progress of Ruby 3x3

Ruby 3x3 の進捗。

  • Ruby 2.5.0 はスピードが Ruby 2 の 165%。
  • JIT のブランチが 2 本進んでる。
  • 並列実行は笹田耕一さんが実装中。
  • データ型は Matz 検討中。

Malloc Can Double Multi-Threaded Ruby Program Memory Usage

malloc のせいで Sidekiq プロセスが 1 GB にまで膨れ上がっちゃう問題。メモリのフラグメンテーションを起してるらしい。解決案は

  1. MALLOC_ARENA_MAX=2〜4 環境変数
  2. malloc の代わりに jemalloc 採用
  3. Aaron Patterson 先生実装中の GC

Building a Modern Frontend with Rails and JS

Rails のモダンなフロントエンド実装チュートリアル

Bindings in Ruby: Behind the Magic of Blocks

ブロックの中でもブロック外変数を読み書きできるようにしてくれる binding の解説。

Defining Class Methods In Ruby

筆者が class << self でのクラスメソッド定義を好む理由。

  • シングルトンクラスのスコープ内での定義だから。def self.method はスコープ外からの定義。
  • private protected 領域が使える。def self.methodprivate_class_method しかない。

News

RubyMine 2017.3 Released

RubyMine 2017.3 リリース。

  • パフォーマンス向上
  • 外部キーワードに飛べるようになった
  • Code Insight 改善
  • ネストしたプロジェクトへのサポート改善
  • WSL(WindowsBash)対応
  • メソッド抽出の private public protected 指定可能
  • エディター内 rubocop --auto-correct
  • Puppet テンプレート同梱
  • API テスト用エディター内 REST クライアント
  • JavaScriptCSS、Vue.js コード補完改善
  • git rebase -i
  • SQL 生成ツール

'99 Bottles of OOP' Book is 40% Off Till Next Week

99 Bottles of OOP 本は来週まで 40% 割引!

Julia Evans Taking a Sabbatical to Work on Ruby Profiling Tools

Unix を題にした zine で有名な Julia Evans が Ruby プロファイリングツール開発のため 3 ヶ月休職。

Tutorial

Using XPath to Rewrite Ruby Code

XPathRuby コードを書き換える手順。

  1. parser gem で Ruby コードを AST に変換。
  2. REXML または nokogiri で AST を XML に変換。AST 内オブジェクト ID を XML タグの属性として書き込む。
  3. XPath で書き換えたいコードを指定し、該当タグのオブジェクト ID で該当 AST ノードを取得。
  4. AST ノードを買い換える。

A Refresher on Procs, Blocks, and Lambdas

proclambda・ブロックいろいろ。

  • proclambdareturn の挙動
  • proclambda 引数の数チェック
  • & 演算子でブロックを proc に変換

Roll Your Own XML Templater in Ruby

Builder gem + TiltXML テンプレートエンジンを実装した話。

Using Elasticsearch with a Basic Rails App

Rails アプリの elasticsearch 検索機能実装手順。elasticsearch 内インデックスは Kibana で確認。

Graceful Switching of Worker Processes on Heroku

Heroku 上での稼働中 Rails アプリのデプロイ時に、ワーカープロセスをグレースフルに切り替えるための Procfile 設定。

Opinion

Never Edit a Method, Always Rewrite It

細胞の再生のように、メソッドを小さいコンポーネント(純粋関数)として書き、変更が必要になったら修正ではなく一から書き直せば、長生きするシステムが生まれるのでは、と提案した Chad Fowler 先生の RubyConf 2017 トーク。このルールを守った開発は

  • 再利用性にどんな影響を与える?
  • 複雑さにどんな影響を与える?
  • テストにどんな影響を与える?
  • 命名にどんな影響を与える?

といった疑問を述べた記事。(答えは出してなく、あくまで質問を挙げているだけ)

Why Teach Ruby?

半年前に Ruby を教えるのをやめた Coding Dojo で騒ぎになった Ruby コミュニティ。その一方で Ruby を教え続けている Flatiron School。学校にとって一番大事なのは、卒業生の雇用先の需要ではなく、いかに学生がプログラミングのことを好きにさせること。Ruby がそれに最適だと。

Code

Passwordless: Add Password-Free Authentication to a Rails App

メール本文内リンクでのログイン用 gem。

Mobility: A Pluggable Ruby Translation Framework

データ i18n フレームワーク用 gem。

rack-contrib 2.0: Now Supports (Only) Rack 2.x and Ruby 2.2+

rack-contrib 2.0.0 リリース。

  • Rack 1.x サポート終了
  • Ruby 2.1 以前サポート終了

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

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

rubyweekly.com

Highlights

Rails 5.2.0 Beta Released

Rails 5.2.0 βリリース。

  • ActiveStorage でファイルアップロード
  • Redis Cache Store
  • HTTP/2 Early Hints 対応
  • Bootsnap でブート時間半減
  • Content Security Policy 定義用 DSL
  • secrets を deprecate、Credentials 新規追加
  • Webpacker 3.0

Talking to ActionCable without Rails

Rails ヘルパー使わずに素 JavaScript でクライアント側 ActionCable を実装してみた Thoughtbot 社。

'String#delete_prefix' and 'delete_suffix' Methods in Ruby 2.5

文末文字削除用 String#chompRuby 2.5 から #delete_suffix アライアス追加。さらに文頭の文字削除用 #delete_prefix が新規追加。

Zero Downtime Rebranding with Heroku

Heroku 上 Rails アプリをゼロダウンタイムでドメイン移行。

  1. 複数ドメイン
    • DNS ホストで ALIAS 設定
    • heroku domain:add
  2. 複数 SSL 証明書
    • Heroku SSL Endpoint を使ってる場合、Heroku SSL にアップグレード
  3. SAN 証明書発行
    • heroku certs:add
  4. rack-rewrite gem のミドルウェア
  5. 外部 API コールバック用エンドポイント
    • callbacks サブドメに移行
    • 旧コールバックを rewrite
  6. Evil Martians 自家製 RackRewriteConfig で環境別設定(原文コード参照)

Removing Business Logic From Controllers

コントローラテストを deprecate した Rails 5 に備えて、ロジックをモデルなどのオブジェクトに抽出するメリット。例に挙げたのは、パラメータ有無で挙動が変わったコントローラのビジネスロジック

A Written Retrospective of RubyConf 2017

RubyConf 2017 1 日目の振り返り。

  • Matz のキーノート
    • 初回参加者が意外と多くて Ruby の未来が有望的
    • なるべく互換性を保ちながらリリースしていく
    • コミュニティを交えて相談していきたい
  • There Are No Rules in Ruby (Max Jacobson)
    • Ruby の柔軟性のデメリット
  • Finding Beauty in the Mundane (Megan Tiu)
    • しんどい仕事でも接し方によって楽しめる方法
  • Augmenting Human Decision Making with Data Science (Kelsey Pedersen)
  • Growing Old (Chad Fowler)
    • レガシーだからって悪いとは限らない

News

RubyGems 2.7.3 Released

RubyGems 2.7.3 リリース。

The 10 All-Time Most Downloaded Ruby Gems

最もダウンロードされてる gem トップ 10。

  1. bundler
  2. multi_json
  3. rake
  4. rack
  5. json
  6. mime-types
  7. activesupport
  8. thor
  9. i18n
  10. diff-lcs

Rails は 22 位。

Tutorial

How to Run Sidekiq on a Heroku Free Dyno with Puma

Heroku の無料 Dyno で Sidekiq を動かすための Puma 設定。

Clean HTTP OPTIONS Handling in Rails

Rails API に OPTIONS の HTTP メソッド対応を追加した Kollegorna 社。結果的に rails_http_options gem も作った。

Instrumenting Ruby Methods

NewRelic などのメソッド計測コードが散らばらないように prepend する方法。

How to Add Comments to Database Columns from ActiveRecord

Choosing UUIDs for Model IDs in Rails with Postgres

PostgreSQL の UUID を Rails アプリで採用する手順。

Rails on Docker: Using Yarn to Manage Frontend Assets

Rails アプリの Docker イメージに Yarn を追加する手順。

How Does Bitcoin Force Consensus Among Byzantine Generals?

Bitcoin を解説した Fabio Akita 先生。

Code

ComfortableMexicanSofa 2.0: A Rails 5.2+ CMS Engine

CMSRails 5.2 エンジン。

ElasticNotifier: Send Error Notifications to an Elasticsearch Server

エラー通知を ElasticSearch サーバに送ってくれる ElasticNotifier gem。

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

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

rubyweekly.com

Highlights

Improving Ruby Performance with Rust

Pathname を Rust で書き換えて 3 割高速化した FasterPath gem 作成者が Rust に挑んだのを振り返った。

  • 最初は FFI 経由で実装してみたが、メモリを解放するコストなどあって、結局ピュア Rust 実装のほうが効果的だった。
  • Rust の Ruby 言語拡張 ruru と Helix はあるが、より安定な ruru にした。
  • Rust はまだ日が浅くて、ruru も Helix も 1.0 になってないので要注意。

Amazon API Gateway Can Now Generate Ruby SDKs

Amazon API Gateway では Ruby SDKAPI クライアント gem)を生成できるようになった!AWS IAM 認証込み(カスタム認証も可)。

Session-Only Cookie Corruption in Ruby Web Apps

Rails のセッションデータをクッキーで保存している場合、ブラウザのサイズ上限を超えたら

  • モダンなブラウザではクッキーがまるごと破棄され、ログイン状態を維持できないバグ発生。
  • IEiOSSafari では Secure、HttpOnly、SameSite などのディレクティブが切り捨てられ、XSS 脆弱性にもなりかねない。

Rails、Rack はサイズをチェックしてくれるが、ディレクティブまでは考慮できてない。筆者が暫定対応として Rack::Protection::MaximumCookie gem 作成。

GitHub Introduces Security Alerts for Ruby Projects

依存 gem と JavaScript ライブラリの脆弱性をアラートしてくれるようになった GitHub

DuckRails: Quickly and Dynamically Mock API Endpoints

API のモックを作るための Rails アプリ。

News

Rubyhack Conference (Salt Lake City, May 3-4, 2018)

Rubyhack カンファレンスの CFP 開始。

Tutorial

Ruby 2.5's Dir.children and Dir.each_child

. .. を除外した ls -a の結果を返してくれる Ruby 2.5 の Dir.children Dir.each_child

Using ActiveStorage Today (Prior to the Rails 5.2 Release)

リリース前の ActiveStorage で画像アップロード機能を実装する手順。

Better Rails Performance with JSON Patch

カスタムフォーム作成用 FormAPI は不特定多数のフィールドを PostgreSQL の jsonb カラムで保存。フィールド数が多いと重くなってたが、JSON Patch 標準で差分だけサーバに送るようにした。差分を当てるには hana gem 採用。

How to Receive & Respond to Text Messages with Hanami & Twilio

Hanami + Twilio で SMS 送受信アプリ実装手順。

Migrating 'has_and_belongs_to_many' Associations to Rails 4+

Rails 4 HABTM 移行した話。HABTM テーブルのデフォ命名が変わったため、join_table: オプションで指定する必要があったりする。新規命名に従ってないテーブルを検知してくれるスクリプトも作った。

Docker + Rails + System Tests with Headless Chrome

Docker + Rails + Headless Chrome システムテストを実装した話。

google_translate_diff: Using Google's Translate API More Efficiently

Google 翻訳 API 料金節約施策を google_translate_diff gem としてリリースした Evil Martians 社。原文をテキストと HTML マークアップに分解して、翻訳済みテキストをキャッシュすることで、Google 翻訳 API の二重呼び出しを塞ぐ。自社費用は 6 割減。

Story

Some Thoughts and Feelings on RubyConf 2017

RubyTapas 売上低迷と健康保険の負担で RubyConf 2017 に参加できなくなるところだった Avdi Grimm 先生。結局コミュニティからの寄付で参加した。感動と感謝の気持を記事で書き落とした。

Tools

dbmgr: CLI Tool to Back Up, Restore, and Provision Dev Databases

開発環境 DB バックアップ・復元用 CLI ツール。

Code

ModelProbe: Schema Introspection for ActiveModel

ActiveRecord スキーマ取得用 gem。

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

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

rubyweekly.com

Highlights

Sniffer: Log and Analyze Outgoing HTTP Requests

Net::HTTP、Typhoeus などの HTTP リクエストを JSON でロギングしてくれる gem。

How David Heinemeier Hansson, Creator of Rails, Works

DHH いろいろ。

  • 元々はプログラミングに興味がなかった。
  • 高校で運営していたゲームレビューサイトが数千もの読者がいた。
  • サイトの機能追加で PHP 覚えた。
  • ブログ上の PHP 相談で Jason Fried と知り合い、37Signals 入社。
  • 好きなエディターは TextMate
  • 趣味は写真、機械式腕時計、自動車競技、旅行。
  • 時間節約の裏技は、依頼をほとんど断ること。
  • 仕事は 4〜5 時間集中して、それ以上仕事しない。

Implementing a Worker Pool in Ruby

Celluloid、Concurrent Ruby のような Worker Pool パターンを TDD で一から実装してみた話。

  • ワーカー数上限が指定できる WorkerPool
  • メモリパンク防止用のジョブ数上限が指定できる SizedQueue
  • WorkerPool に注入できるスケジューリングアルゴリズム

How We Trick Bundler and Cause Interesting Bugs

Gemfile 内 gem の定期アップグレードを SaaS として提供してる depfu。各 gem のバージョンを上げる試行錯誤を繰り返し、互換性を検証する仕組み。ある日 ActiveSupport のバージョンアップでメモリパンクしちゃった。原因は bundler が依存関係を Array#combination で掛け合わせてるところ。配列の重複してる様子を排除する PR 出して緩和。

Clear Up Controllers and Models with the Waterfall Gem

Waterfall gem でコントローラのサービスオブジェクトをロールバック可能なチェーンで連携する活用例 2つ。

Are Comments A Code Smell? It Depends

コメントは必ずしもコードスメルだとは限らない、という主張。コメントは2種類ある:

  1. コードが何をしてるかの説明
  2. コードが何で必要かの説明
    • 書くべき

Tutorial

The Proxy Pattern in Ruby

プロキシパターン(別名サロゲートパターン)解説。

  • 重い処理をラッピングして遅延評価などで時間稼いでくれる活用例。
  • 認可層の活用例。
  • RPC での活用例。
  • メモ化用の活用例。

Using Vue.js with Rails

Rails アプリへの Vue.js 導入手順。

Postgres Primary/Replica Replication on Heroku with Rails

Octopus gem で Heroku の PostgreSQLレプリケーション実装手順。

Using Postgres's Advisory Locks from Ruby

PostgreSQL の Advisory Lock 解説。テーブルロック・行ロックと違って、DB 層ではなくアプリ層で管理。例えば、バックグラウンドジョブのワーカーだけでロックをかけても、UI からの CRUD 操作ではロックがかからない。

  • ロック作成、確保、解除
  • トランザクションロック vs セッションロック
  • ロック管理用 Ruby モジュール実装例

Flippin' Features at Runtime

フィーチャーフラグ用 Flipper gem の新機能。

  • 初期設定のデフォ
  • Flipper クラスメソッドからシングルトンのインスタンスへデリゲート
  • get_all preload_all で全フィーチャーフラグ取得
  • フィーチャーフラグ import 機能
  • redis、ActiveSupport キャッシュ用アダプター追加
  • flipper-api gem でフィーチャーフラグを HTTP API

Refactoring with Hash Defaults

Hash の デフォ値設定方法。

  • Hash.new
  • Hash#default
  • Hash#default_proc

case 文を Hash でリファクターすることも提案してる。

Atom Tricks, Plugins and Shortcuts for Ruby Developers

Rubyist 向け Atom パッケージ、キーボードショートカット、スニペットなど。

Getting Started with Faktory

3 週間前にリリースされた Faktory バックグラウンドジョブシステムのインストール手順。

Opinion

On Sustainable Testing

ちゃんと書かれた describe 文を推薦する RSpec コアチーム方針への反論。メンテされなくなると。なぜならプログラマーがメンテしたいのは書くのが楽しい、カスタムマッチャーを活かした、テストコードを読むだけでもわかる spec。

出力が読みづらいという指摘を覆す例も挙げた。

Code

Rackula: Generate A Static Site from any Rack Middleware

RailsSinatra などから静的コピーを生成してくれる Rack ミドルウェア

frappe_charts: Generate Frappé Charts from Your Rails Apps

SVG チャート生成ライブラリー Frappé Charts をラップした gem。

Karafka 1.1: Work with the Kafka Streaming Platform from Ruby

Kafka + Ruby アプリ用 MVC フレームワーク Karafka 1.1.0 リリース。

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

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

rubyweekly.com

Highlights

How We Switched From Sprockets to Webpack

下記理由で Sprockets から Webpack に移行した LearnZillion 社。

  • Sprockets が重い。
  • ES6 欲しさ(Sprockets にもあるが、未だに experimental)。
  • Sprockets が提供してくれない機能欲しさ。
  • Webpack が Rails Way となった。

移行計画

  1. 準備フェーズ
    • Webpacker 追加
    • 環境構築
    • Nginx、capistrano 設定
    • デプロイ
  2. 移行フェーズ
    • Rails asset 用 gem を NPM パッケージで置換
    • アピリコードを Webpack に移行
    • 必要に応じて Webpack 設定修正
  3. クリーンアップフェーズ
    • Rails asset 用 gem 削除
    • Sprockets 設定削除
    • Webpack バンドル最適化

問題点

コード豊富なので原文参照。

Upgrading Kickstarter to Rails 5

9 年ものレガシー Rails アプリを Rails 5 にバージョンアップした Kickstarter 社。

  1. 段階的アップグレード
    • Rails 4.2.8 → 4.2.9 などのマイナーパッチ
    • Ruby 2.25 → 2.4.x
  2. リリースノートに従った修正
  3. gem を v5 にアップグレード
  4. Rails 4.2 にマージできる修正を master ブランチにマージ
  5. Rails 5 専用ブランチを CI グリーンに
  6. Rails 5 専用ブランチの deprecation 忠告撲滅
  7. Rails 5 専用ブランチを手動で動かす
    • テストでカバーできてない問題特定のため
  8. master ブランチで今までの修正をバックポート
  9. 各機能の開発チームに自分の機能をテストしてもらう
  10. staging 環境にデプロイ
  11. 本番デプロイ
    • カスタマーサポートからのバグチケ消化
  12. 振り返り

結果

  • 見積もりどおりの 3 ヶ月で完了
  • 大規模ダウンタイムなし
  • カスタマーサポートのバグチケ対応計画たてとけばよかった
  • いろいろ学習できた
  • 影響範囲の最も広かった変更点は HashWithIndifferentAccess を継承しなくなった ActionController::ParametersHash を継承していることを前提にしたコードがいっぱいあったから。
  • モバイルアプリへの影響は少なかったが、予想しなかった。ネイティヴチームのエンジニア巻き込んどけばよかった。

Ruby Performance Profiling: An Unorthodox Approach

API の重いリクエストで悩まされた Kollegorna 社は、フレイムグラフ見てもネックが特定できなかった。そこでクラス単位でメソッドをベンチマークしてくれる ClassProfiler gem を作ることに。%の最も高いメソッドの中で呼ばれるクラスを次々とベンチマークすることで、やっと犯人に辿り着いた。

Why Aren't We Using More Service Objects Already

先週サービスオブジェクトの使いすぎを否定した Avdi Grimm 先生への反論。

  • モジュールメソッドだとどんどん増えていき、結局 junk drawer になる。
  • 筆者の経験では、サービスオブジェクトが統一したコードへと繋がった。
  • サービスオブジェクトを支える ActiveInteraction gem まで作った。

Multiverse: Manage Multiple Databases in Rails Apps

Rails アプリの多数データベース用 gem。

News

Ruby Versions Used in Commercial Projects in 2017

Semaphore CI ユーザが採用している Ruby バージョン別分布。

  • 85% は Ruby 2.0 以上。
  • 最新バージョン (2.4) の採用は例年に比べて低い。
  • Ruby 2.1 は EOL 済みなので早めにバージョンアップするように推奨。

JRuby 9.1.14.0 Released

JRuby 9.1.14.0 リリース。

RubyGems 2.7.2 Released: A Bugfix Release

RubyGems 2.7.2 リリース。

  • bundle gem コマンドで新規 gem 生成できなくなっていたバグ解消。
  • git がインストールされていない環境でエラっていたバグ解消。

Tutorial

Interactors in Ruby: Easy As Cake, Simple As Pie

インタラクターデザパタinteractor gem の紹介。

  • Fat Controller の各工程をそれぞれサービスオブジェクトに抽出して、 Interactor モジュールを include
  • Interactor::Organizerinclude したオブジェクトでサービスオブジェクトの呼び出し順番を定義。
  • Interactor が提供してくれる before around after フックでトランザクションを張ったりする。
  • gem は非常に計量(ソースが小さい)。
  • Interactor::Organizer に並べたサービスオブジェクトは Context オブジェクトを共有するのがちょっとグローバル変数っぽくて要注意。
  • gem は validation 仕組みを提供してくれないので、筆者が validation 用 Interactor を提案した。

How 'require' Loads A Gem

$LOAD_PATH に載っていないのに gem を require できるようにしてくれる RubyGems コードリーディング。Kernel#require のモンキーパッチで、LoadError 発生時の rescue ブロックで、インストール済み gem の中から探す。見つけた場合、$LOAD_PATH に追加し、require 再挑戦。

Get 80% Smaller Rails Page Sizes with Rack Deflate

Rack::Deflate ミドルウェアRails レスポンスを gzip 圧縮してサイズを 80% 減らした Richard Schneeman 先生。

Quick Tip: A Pitfall of The &. Operator

&. 演算子の罠。< などの評価順番が変わっちゃうから要注意。(原文コード参照)

How to Partition and Conquer a Large Postgres Table

数百万行もの PostgreSQL テーブルをパーティション分割した Evil Martians 社。

  1. 親テーブルをクローン。
  2. 子テーブル + 親テーブルの PK をマッピングするビュー作成。
  3. 子テーブルを作成・更新するストアドプロシージャ作成。
  4. ストアドプロシージャを呼ぶトリガーをビューに張る。
  5. ActiveRecord モデルがビューを見るように設定。
  6. 既存データはビューに INSERT することで移行。

Turn Rows Into Columns With The Array#transpose Method

Array#transpose いろいろ。

  • 二次元配列で行と列を入れ替えてくれる。
  • 三目並べゲームの勝利判定ロジックを例に挙げた。

Upgrading a Rails App from 3.2 to 4.0

Rails 3.2 アプリを 4.0 にアップグレードするための豆知識。移行してない人がまだまだいるから。

  • Ruby 1.8.7 を使っていれば、1.9.3 にアップグレード。
  • rails4_upgrade gem を Gemfile に追加して、アップグレードの必要な gem を特定。
  • rails:update Rake タスクで不要な設定・モンキーパッチを削除。
  • RailsDiff で予想された差分を確認。
  • activerecord-deprecated_finders gem で .find_by_hoge メソッドを洗い出し・撲滅。
  • scope は全部 lambda 表記に。
  • protected_attributes 撲滅。あるいは protected_attributes gem 導入。Strong Parameters に移行することがベスト。
  • ActiveRecord::Observer 撲滅。あるいは rails-observers gem 導入。wisper gem または Rails Concerns に移行するのがベスト。
  • ActiveResourceactive_resource gem に移行。
  • caches_page caches_actionactionpack-action_caching gem に移行。
  • Test::Unittest-unit gem に移行。
  • match 式 route は HTTP メソッド要指定。
  • プラグインを使っていれば gem に移行。

Code

Arbolito: A Minimalist Currency Conversion Library

Alpha Vantage API を叩く両替 gem。Alpha Vantage 以外でも拡張可能。キャッシュ期限設定可能。他 gem への依存が一切ない。

wsdirector: A Command Line Tool for Testing WebSockets

ActionCable など WebSocket サーバテスト用 CLI ツール gem。データ送受信スクリプトYAML で定義してから wsdirector コマンドで実行。ApplicationCable::Channel単体テストと思えば良さそう。(RSpec・MiniTest・Test::Unit とは別物)

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

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

rubyweekly.com

Highlights

Enough With the Service Objects Already

どんな Fat Controller でもサービスオブジェクト抽出で片付けちゃうのを否定する Avdi Grimm 先生。

  • 多くの場合はプロシージャー型モジュールメソッドのほうが適切だと
  • 間違ったオブジェクトを抽出よりも、オブジェクトを抽出しないほうがマシ
  • サービスオブジェクトは依存し合いがち
  • サービスオブジェクトはビジネスドメインよりも、インフラ層に相応しい(DDD 本もこう書いてある)
  • ビジネスドメインのサービスオブジェクトがあったとしても、インフラ層のサービスオブジェクトから分離すべき

Bundler 1.16 Released (But 2.0 Is Close)

Bundler 1.16 リリース。

  • 依存関係解決の新規アルゴリズムに切り替えたことでパフォーマンス向上・バグ解消。
  • bundle installeval 回数を減らしたことでパフォーマンス向上。

次のリリースは Bundler 2!

  • master がすでに Bundler 2 となった。
  • Bundler 2 機能は 1.16 にも入ってて、feature flag で無効となっている。Bundler 2 を試したい方は、ぜひ有効化を。

Implementing OCR using a Random Forest Classifier in Ruby

ランダムフォレストアルゴリズムで手書き数字の OCR を実装する手順。PyCall gem で Pythonscikit-learn ライブラリーに投げてる。

Memory Conscious Programming in Ruby

メモリを意識した Ruby

  • nil true false はメモリを確保しないため、考慮しなくてもいい。
  • -2^622^62-1 の整数もメモリを確保しないため、考慮しなくてもいい。
  • Array Struct は要素 3 つまでは最低メモリの 40 バイトで収まる。
  • 空っぽの Hash は最低メモリの 40 バイトで収まる。
  • String は 23 バイトまで最低メモリの 40 バイトで収まる。
  • オブジェクトはインスタンス変数 3 つまでは最低メモリの 40 バイトで収まる。

メモリ最適化の工夫:

  • 上記ルールと ObjectSpace.memsize_of でメモリ計測していき、最も効率の良いデータ構造を選択。
  • オブジェクトをできるだけ再利用する。
  • Array#map! など破壊的メソッドでオブジェクトのインスタンス化を避ける。
  • allocation_tracermemory_profiler などの gem でメモリ計測。

Transactions in Rails and Atomic Bugs

Rails トランザクションの罠いろいろ。全文日本語訳あり!

RubyGems 2.7.0 Released

gem update --system でバージョンアップしようぜ!

  • 同梱 bundler を 1.16.0 にバージョンアップ。
  • Bundler が Gem.use_gemdeps を使うように。
  • gem CLIsignin コマンド追加。
  • gem CLI にログアウト機能追加。

News

5 Performance Improvements in Ruby 2.5

Ruby 2.5 パフォーマンス向上。

  • 文字列 interpolation が 72% 速く!
  • String#prepend が 42% 速く!
  • Enumerable#sort_by Enumerable#min_by Enumerable#max_by が 50% 速く!
  • String#scan の文字列パターンは 50%、正規表現パターンは 10% 速く!
  • Range#min Range#max が 60% 速く!

Tutorial

Cleanly Scaling Sidekiq

AWS 上の Sidekiq を自動スケーリングしている Honeybadger.io 社。

実行中ジョブが完了するまで、インスタンスを殺すのを遅らせる、という要件を、原文のスクリプトで実装した。

The Case Against Exotic Usage of :before_validate Callbacks

よくある before_validate コールバック悪用パターンと代替案。

  • データフォーマット・正規化。
    • attr_writer をオーバーライドしよう。
  • データ設定。
    • 例えばアソシエーションから取得した値をカラムに設定して非正規化。
    • コールバックなしで普通に設定しよう。

Make Your JSON API Tests Clean with a Linter

linter で JSON APIRSpec テストを綺麗に。リクエストとレスポンスの

JsonApiLint オブジェクトに抽出して、 request spec の #app を置き換えることで、 spec に残るのは

  • HTTP ステータスチェック
  • JSON 内容チェック

のみになった。

A Useful RSpec Trick for Testing Methods with Arguments

1 it 1 expect ルールを厳守する Victor Shepelev さんの、引数パターン別メソッドの戻り値をテストする裏技。

  1. subjectObject#method で取得した Method オブジェクト。
  2. its([引数]) で引数パターンを指定。

WEBrick, Rack, and Sinatra's Responsibilities Visualized

WEBrick・Rack・Sinatra のそれぞれの役割を分かりやすく描いた図。

Testing Stripe with Rails and RSpec

Stripe で決済処理を行っている Rails アプリのテストを支える stripe-ruby-mock gem。StripeEvent gem で実装した Stripe Webhook の受信までテストできちゃう。

Use Simplecov in Your Rails Test Suite

simplecov gem でテストのカバー率を測る手順。

Story

Splitting Strings in Ruby vs. Python

"".split("-")RubyPython で挙動が異なっている。

Python

Ruby

  • [] を返す。
  • PerlAWK に倣った。

A Bug That Only Appears Once A Year

25.hours.from_now で日付が変わることを期待していたテストが落ちた話。実行したのは夏時間に切り替えた日。

Code

RequestVia: A Functional HTTP Client That Wraps Net::HTTP

関数型 HTTP クライアント gem。

Rack::Session::SmartCookie: Smarter Session Cookies for Rack 2 Apps

Rack 2 セッションクッキーの問題点を解消してデフォにした gem。

Kaminari: A Powerful, Customizable Paginator for Ruby Webapps

松田明先生のアノ有名なページング用 gem。

Postwill: Post to Popular Social Media Networks from Ruby

SNS 投稿を一本化した gem。