rastam on rails

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

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

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

http://rubyweekly.com/issues/391rubyweekly.com

Highlights

Rails 5.2.0 RC2: The (Hopefully) Last RC Before RailsConf

Rails 5.2.0 RC2 新機能まとめ

  • Active Storage
  • Redis Cache Store
  • HTTP/2 Early Hints
  • Bootsnap
  • CSP 用 DSL
  • Credentials

Managing DB Schema Changes Without Downtime

Discourse がゼロダウンタイムで DB スキーム変更を実現できた秘密。

  • schema_migrations テーブルに git_version などのカラム追加
  • カラム・テーブル削除は migration ではなく seed で
  • migration でカラム・テーブル削除ができないように pg gem をパッチ

デプロイ手順は

  1. migration 実行
  2. 新規 Docker イメージ作成
  3. 旧 Docker インスタンス停止
  4. 新規 Docker インスタンス起動
  5. seed 実行

Browser: A Browser Detection Library

ブラウザー検知 gem。

Rails Jumpstart: A Quick Way to Start New Rails Apps

新規 Rails アプリ作成用テンプレート。

News

RailsConf 2018 Schedule is Live

RailsConf 2018 スケジュール公開。

Tutorial

JSONify your Ruby Translations

DB 内 i18n データ永続化用定番 gem Globalize では、各モデルに紐付いた モデル名_translations テーブルで i18n データを保存。しかし取得時には、JOIN する負荷がかかってしまう。

Mobility gem の JSON・JSONB ストラテジーだと、モデルと同一テーブルの JSON 型カラムに保存することで、JOIN なしで取得できる。

なお Globalize 流ストラテジーなども完備している Mobility は多様性・拡張性抜群。

Better Passwords in Ruby Apps with the Pwned Passwords API

Pwned Passwords API を叩くことで、パスワードが流出しているかどうかの validation を実装する手順。

Quick Tip: Inspecting Ruby Gems

gem の中身を確認する方法 2 つ。

  1. リポジトリgit clone
  2. bundle show のパスに cd

How to Test Logs using RSpec Expectations and StringIO

StringIO を注入することで、ログ出力をテストする手順。

Story

From Rails to Clojure, to Java, then Back to Rails

6 年間の職歴を経て、Rails 2.3 → ClojureJava 8 → Rails 4.2 で開発した経験談

  • Rails 2.3 のモノリスを 40% ぐらいリファクター・改善してから Clojure 屋さんに転職。
  • Clojure は高速 + エンジニアの生産性が良かったが、エンジニアの採用が難しくて事業がなかなか成長できなかった。
  • 意外とリーンな Java 屋さんに転職して、エンジニアの生産性も意外と良かった。何でもかんでも POJO 作るのがちょっとめんどくさかったのにもかかわらず。静的言語のおかげで大規模リファクターができた。
  • Rails 4.2 は使い勝手が 2.3 とはそんなに変わらない割には、アップグレードが辛い。後方互換性の優れている ClojureJava に比べて。
  • いろんな言語の経験はエンジニアリング・マネージャには必須だが、シニア・エンジニア募集案件に応募するには特定言語の専門知識が足りない。

Code

Rails-DB-Interactive: Interactive Database Diagrams for Rails

Rails アプリのモデル図を生成する JavaScript アプリ。

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

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

http://rubyweekly.com/issues/390rubyweekly.com

Highlights

Why Won't Bundle Update?

bundle update の謎メッセージ Bundler attempted to update 〇〇〇 but its version stayed the same を調べて解消した話。gem の古いバージョンに依存している gem があることが原因だが、どの gem なのかは bundler だけでは知り得ない。bundler-stats gem で邪魔な gem を特定し、両 gem 一気に bundle update することで解決。この機能はこれから bundle show に入る可能性があるらしい。

We Demand Serverless Ruby

Ruby に対応するように、AWS Lambda や Azure Functions などの FaaS への請願。

Using 'yield_self' for Composable ActiveRecord Relations

yield_self を活かすことで、複雑な ActiveRecord クエリオブジェクトをリファクターした ThoughtBot。

25 Years of Ruby Commits, Visualized

25 年もの Ruby へのコミットを可視化した動画。

An Overview of Ruby GUI Development in 2018

RubyGUI アプリ開発ツールまとめ。

News

Parallel Testing Coming in Rails 6.0

テストの並列実行を Rails 6.0 に追加したプルリクエスト。デフォールトでは、プロセスのフォークで実現しているが、スレッドでの実行も任意で選べる。

Coinbase Funding Ruby Projects with its Open Source Fund

Coinbase OSS 基金は今月 Ruby 関連プロジェクトに献金することになった。補助対象プロジェクトは Ruby Together、RSpec、Rubocop。

Tutorial

Ruby 2.5's New Exception#full_message Method

Ruby 2.5 の Exception#full_message でフォーマットされた例外とバックとレースを取得できるようになった。

The Proxy Pattern Revisited

プロキシデザパタは昔、Ruby では method_missing で実装されていたが、デメリットとしては:

  • プロキシオブジェクトを呼ぶ手間があった
  • パフォーマンスのコストがかかった
  • クラスメソッドまで対応するには別のプロキシオブジェクトが必要になった
  • どんなメソッド呼び出しでも拾ってしまい、責務の範囲が広すぎた

Ruby 2.0 以降は prepend上記問題点解消。

Run Capybara Feature Specs with Selenium and Headless Chrome

CircleCI 2.0 で Chrome Headless + Selenium の Capybara feature spec を実行する手順。おまけに並列実行の CircleCI 設定。

Yes, Ruby 1.9 Can Support TLSv1.2

TLSv1.0、v1.1 が非対応になったせいで、バージョンアップを迫られてきた Ruby 1.9 ユーザだが、それでもバージョンアップがまだできないというユーザ向け一時しのぎの手順。

Tools

Test Kitchen: An Integration Tool for Testing Infrastructure Code

インフラコードのテスト用のテストフレームワーク(ServerSpec など)や実行先(Vagrant、Docker、EC2、GCE、DigitalOcean など)を管理するツール。

Code

FasterPath: Faster Pathname Handling for Ruby with Rust

Rust で Pathname を高速化した FasterPath gem が最近更新されている。

Doorkeeper: An OAuth 2 Provider for Rails and Grape Apps

OAuth 2 用 Rails Engine。

pwned: A Ruby Wrapper for the Pwned Passwords API

パスワード流出確認用 Pwned Passwords APIRuby クライアント。

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

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

http://rubyweekly.com/issues/389rubyweekly.com

Highlights

Timeasure: A New Transparent In-Production Profiler

メソッドレベルのプロファイリング用 gem Timeasure を実装した経緯。

  • NewRelic より柔軟なインタフェース提供
  • ruby-prof gem より軽くて本番環境でも使える

An Epic Collection of Ruby One Liners

ruby CLI コマンドのワンライナー集。

How Ruby 2.5 Prints Backtraces and Error Messages

Ruby 2.5 のバックトレース出力順のデモ。

Rack::Reducer: Map URL Params to Functions That Filter Data

絞り込み条件用 URL 引数を scope などにマッピングしてくれる gem。

Using Genetic Algorithms in Ruby

Ruby遺伝的アルゴリズム実装。

News

Ruby Up From 12th to 9th in the Latest TIOBE Index

プログラミング言語人気ランキング TIOBE で Ruby が 12 位から 9 位に上昇。

12 Ruby Conferences You Should Attend in Spring 2018

今年前半の Ruby カンファレンスまとめ。

Tutorial

Ruby Memory Usage Vocabulary Explained

Ruby のメモリ関連用語解説。

Implementing a Basic Debug Mode for Your Ruby CLI

Ruby CLI アプリのデバッグモード実装。

Solving CAPTCHAs with TensorFlow and Ruby

TensorFlow ライブラリの機械学習CAPTCHA を突破した話。

Considerations When Upgrading a Rails App from 4.2 to 5.0

Rails 4.2→5.0 バージョンアップ時の懸念点まとめ。

Opinion

Why Ryan Bigg Likes Hanami

Ryan Bigg 先生が Hanami を試した感想。

  • Repository パターンのおかげで、モデル層関心の分離ができるのが良い
  • Action 別クラスのおかげで、コントローラ層関心の分離ができるのが良い(params の validation とか)
  • View クラスのおかげで、ヘルパーがグローバルで公開されないのが良い

Tools

Licensed: Cache and Verify the Licenses of Dependencies

依存している gem のライセンス管理用 gem。

Server Timing Response Headers for Rails

Rails サーバ側パフォーマンス計測データをレスポンスのヘッダーに埋め込み、Chrome コンソールで確認できるようにしてくれる gem。

Code

semantic_logger: A 'Next Generation' Logging System

スループット・低レイテンシーのログ処理用 gem。NewRelic、Sentry、HoneyBadger、ElasticSearch などのログ出力先に対応。

Invisible Captcha: Unobtrusive Spam Protection for Rails

honeypot 型 captcha 用 gem。非表示チェックボックスでボット排除。

Flipper: Fast and Simple 'Feature Flipping' for Ruby

フィーチャフラグ定番 gem の最新リリース。

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。