rastam on rails

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

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

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

http://rubyweekly.com/issues/400rubyweekly.com

Highlights

Actionable Tips to Improve Web Performance with Rails

Rails ウェブパフォーマンス向上まとめ。

  • フラグメントキャッシュ
  • カウンターキャッシュ
  • ページキャッシュ
  • etaglast_modified HTTP ヘッダー
  • ActiveStorage
  • HTTP/2、HTTP/2 PUSH
  • gzip ではなく brotli で圧縮
  • Heroku ではなく独自サーバ
  • dns-prefetchprefetchprerenderpreconnect

Pagy: The 'Ultimate' Pagination Ruby Gem

kaminariwill_paginate より遥かに軽いページネーション gem。

Building an API Client Using the Builder Pattern

ビルダーパターンでチェーン可能・イミュータブルな API クライアントを実装した話。

The Performance Impact of Removing OOBGC at GitHub

Aaron Patterson 先生が Github の OOBGC を外したことで CPU 時間を 10% 短縮できた。

Ryan Davis on Asking for Help for Contributing to Ruby

minitestsexp_processorruby_parserhoeflayflog の作成者 Ryan Davis が Patreon 支援者募集中。

RubyGems 2.7.7 Released

RubyGems 2.7.7 リリース。

Do We Need Dependency Injection in Ruby?

依存性の注入のメリットをうまく言葉にできなかった筆者が Test Double 社員の意見を集めた。

  • 依存関係が明確になる
  • モックだとテストが Arrange・Assert・Act パターンから外れちゃう
  • モックはデバッグしづらい
  • Sandi Metz の本読め

Tutorials

Ruby 2.5 Added Lazy Proc Allocation for Block Parameters

Ruby 2.4 以前では、メソッドのブロック引数を内部メソッドに渡すたびに Proc オブジェクトに変換していた。 Ruby 2.5 では、Proc オブジェクトへの変換が遅延評価になり、高速化に繋がった。

Separating Data and Code in Rails Architecture

Root 社の、極端に状態を持たせていない、準関数型に近い Rails アプリの話。

Securing Dependencies for Rails 5.2 Active Storage

ActiveStorage をサポートするようになった Heroku の FFmpeg セキュリティ対策。

  • FFmpeg脆弱性が頻繁に報告されるが、メンテナーが迅速に対応してくれている。
  • Ubuntu のパッケージマネージャは FFmpeg の最新版に追いついていないため、Heroku 独自バイナリーをコンパイルすることに。
  • ActiveStorage に使われていない機能をコンパイルから外すことで、バイナリー軽量化できた。

Monitoring SSL Certificate Expiry with Ruby

SSL 証明書有効期限監視スクリプト

Code & Tools

Introducing Stealth, a Framework for Conversational Voice and Chatbots

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

RoleCore: A Rails Engine Providing Role-Based Access Control

認可用 Rails Engine。CanCanCan 併用可能。

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

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

http://rubyweekly.com/issues/399rubyweekly.com

Highlights

Ruby's New Exception Keyword Arguments

Ruby 2.6 の exception キーワード引数で例外を投げるかどうか指定できるようになる。

Rewriting Deprecated APIs with the 'parser' Gem

deprecated ソースコードparser gem で AST に変換して書き換える話。

Deprecating Paperclip: What This Means to You

ActiveStorage がリリースされたため、Paperclip gem が deprecated になった。

Gotham Ruby Conf 2018: A One Day Ruby Event in NYC on June 16

ニューヨークの GORUCO がいよいよ。

How Phusion Redesigned Passenger's App Error Page

Passenger の development モードのエラー画面のデザインを改善した話。

Tutorials

How to Mitigate DDoS using Rack::Attack

Rack::Attack ミドルウェアで DDoS 防止。

Build an Effective Initial Deployment Pipeline

筆者自慢の初期 CI/CD パイプライン。

push するたびに

  1. test 環境コンテナにデプロイされる
  2. staging 環境で migration が実行される
  3. テストが実行される

テストが通ったコミットを master ブランチに push するたびに

  1. staging 環境コンテナにデプロイされる
  2. production 環境 DB がバックアップされ、staging 環境でダンプされる
  3. staging 環境で migration が実行される

テストが通ったタグを push するたびに

  1. production 環境コンテナにデプロイされる
  2. production 環境 DB がバックアップされる
  3. production 環境で migration が実行される

Securing User Emails in Rails

attr_encrypted gem で DB 内メアドを暗号化し、blind_index gem で検索可能に。

Adding GDPR Compliance to a Rails App

Rails アプリ、ブログの GDPR 対策。

How to Create Charts in a Rails App with Just One Line of Code

chartable gem で .analytics 取得用メソッドを ActiveRecord モデルに生やし、chartkick gem で可視化。

Code & Tools

Discard: Soft Deletes for ActiveRecord Done Right

paranoia gem のメンテナーが新しく作った ActiveRecord 論理削除用 gem。

acts_as_paranoidparanoia gem よりは魔術が少ない:

  • default_scope を生やさない
  • #delete #destroy を上書きせず、新しいインタフェースを生やす
  • dependent: :destroy で関連レコードを削除しない

Ralyxa: A Ruby Framework for Interacting with Amazon Alexa

Amazon Alexa ウェブサービスフレームワーク

aws_public_ips: Fetch All Public IP Addresses Tied to Your AWS Account

AWS アカウントの公開 IP を全て表示してくれる CLI gem。

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

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

http://rubyweekly.com/issues/396rubyweekly.com

Highlights

Top 10 Errors From 1000+ Rails Projects (and How to Avoid Them)

Rails アプリのよくあるエラーと解消方法まとめ。

Ruby's New Infinite Range Syntax

上限無限 Range(例:3..Float::INFINITY)は Ruby 2.6 以降、3.. で書けるようになる。

配列の最後までの #slice でも使える: array[3..]

The Rails Hosting Survey 2018 Results Are Out

2018 年 Ruby 開発者世論調査結果。

The Future of Rails 6: Scalable by Default

RailsConf で発表された Rails 6 方針スライド。

  • スケーリング
  • テスト並列実行
  • 複数 DB

Articles & Tutorials

Direct, Secure Rails Client-Side File Uploads to AWS S3 Buckets

Fog gem で AWS S3 にファイルをアップロードする手順。

Using Singleton Objects as Default Arguments

nil などのデフォ引数をシングルトンにする話。

Rails' Built-In Cache Stores: An Overview

Rails の Cache Store まとめ。

Event Sourcing Made Simple

Kickstarter 社の投資者宛てコンテンツ配信プラットフォーム Drip を Event Sourcing で実装してみた話。

Testing Example Code In Your Jekyll Posts

Jekyll 記事内コードをテストしてくれる jekyll-include_snippet プラグイン紹介。

Rails 5.2's Date#prev_occurring and Date#next_occurring

Rails 5.2 の Date#prev_occurringDate#next_occurring で前後の指定した曜日の日付取得。

Code & Tools

A Nokogiri Cheat Sheet

HTML・XML パース用 Nokogiri gem の API をまとめたチートシート

dotenv: A Gem to Load Environment Variables from '.env'

Rails 5.2 対応になった dotenv gem。

Embedded: Persist Value Objects in Active Record Attributes

バリューオブジェクト ⇄ ActiveRecord マッピング用 gem。ActiveRecordcomposed_of の冗長な configuration を convention で省いてくれたのが売り。

Database Cleaner: Strategies for Cleaning Databases in Ruby

テスト DB をまっさらにしてくれる gem がここ数週間整理されてきた。

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

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

http://rubyweekly.com/issues/395rubyweekly.com

Highlights

Ruby 2.5 Enables Thread.report_on_exception by Default

例外発生時にスタックトレースなど吐かずに無言で終了してたスレッドは、Rails 2.5 移行デフォで吐くようになった。

GraalVM: Oracle's Universal Virtual Machine

実験的な高パフォーマンス TruffleRuby がベースにしてる GraalVM。

NGINX Unit 1.0: An App Server That Supports Ruby (and Others)

NGINX のアプリサーバ NGINX Unit v1.0 リリース。

Running a Government Department on Ruby for Over 12 Years

Sequel、Roda のメンテナー Jeremy Evans 先生がカリフォルニア州監査局で 12 年も働いた経験を語ったスライド。

  • 政府機関発注の IT システムはほとんど高コストの巨大 SAP システムだが、カリフォルニア州監査局は低コストの小規模 Ruby ウェブアプリ
  • アプリが 3 つある:
    1. 局員管理などの局内処理用イントラネットサイト
    2. 入局試験や応募者評価用の採用サイト
    3. 監査完了後の政府機関への改善案の遂行までのワークフロー管理サイト
  • セキュリティ第一

Legend of The Sourcerer: A Ruby Text Adventure Game

Ruby 製テキストベース RPG

Tutorials

Full Text Searching Linux Man Pages with Elasticsearch and Ruby

Linuxman ページの ElasticSearch 検索機能実装手順。

Stop Robots and Crawlers From Causing Errors in Rails

ボットや検索エンジンクローラーが発生させたエラーを is_crawler gem で抑える方法。エラーログのノイズなどを減らすように。

For Want of Pattern Matching in Ruby: The Creation of Qo

実験的なパターンマッチング gem。

Where Are They Now? Revisiting Ruby 2.3's Goodies

2 年も前に Ruby 2.3 で導入された機能の振り返り。

  • &.
  • Hash#digArray#dig

Ruby's SignalException Exception

kill -9 などしたら、SignalExceptionrescue していても、処理が終わる前に強制終了してしまう。ちゃんと処理するには Signal.trap が必要。

Refactoring for the 'Tell Don't Ask' Pattern

漢字フラッシュカードゲームの正解判定ロジックを「求めるな、命じよ」パターンでリファクターした話。

Migrating from state_machine to AASM in Rails

メンテされなくなった state_machine gem から aasm gem に移行した手順。

Code & Tools

WordpRSS: Pull Any WordPress RSS Feed with Ruby

WordPress ブログの RSS フィード取得用 gem。

ActionPolicy: Authorization Framework for Ruby and Rails Apps

RubyRails アプリ向け認可フレームワーク gem。Pundit の物足りないところを補ってくれるらしい。

JSONAPI::Consumer: ActiveModel-Compliant Framework for Consuming JSON API Services

JSONAPI クライアント gem。インタフェースは ActiveModel 同等。

kms_encrypted: Simple, Secure Key Management for attr_encrypted

attr_encrypted gem がキー管理までやってくれないので、この gem が KMS 方式で管理してくれる。Amazon KMS、Google KMS 対応。

render_async: Render View Partials Asynchronously via Ajax

Rails ビューの partial を AJAX で非同期ロード、レンダー高速化してくれる gem。

jwt_sessions: XSS/CSRF-Safe JWT Auth for Single Page Apps

SPA 向け JWT セッション用 gem。XSSCSRF 対応付き。

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

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

http://rubyweekly.com/issues/394rubyweekly.com

Highlights

Rails 5.2 Released

Rails 5.2 リリース!Basecamp、Shopify で絶賛稼働中。

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

Measuring Branch and Method Coverage in Ruby 2.5

行カバーレッジのみ分析していた Coverage クラスは、Ruby 2.5 でメソッド、ブランチのカバレッジまで分析してくれるようになった。

A Dive into Ruby CVE-2017-17405: Identifying a Vulnerability in Ruby's FTP Implementation

Net::FTP が裏で呼んでいた libcurl 脆弱性の解説。

How to Migrate a Rails App from Heroku to Dokku

Heroku から安いクラウドに移行する手順。Heroku の便利な devops ツールは Dokku に。

Profiling Ruby's Memory Allocation with TCmalloc

Google 製の gperftools スイートの tcmalloc で Rubymalloc プロファイリング。SVG の図で可視化までしてくれる。

Hanami 1.2.0 Released

Hanami 1.2.0 リリース!

  • HTTP/2 Early Hints
  • UJS
  • REPL 付きの開発環境エラーページ
  • CLI フック
  • 外部 gem から操作可能なプロエクトレベルの Rack ミドルウェア
  • Hanami::Repository でカスタムの書き込みコマンドが定義可能に

Articles & Opinion

Interactive Debug Sessions in RSpec with Capybara

Launchy gem + binding.pry で Capybara のテストをデバッグする便利ヘルパー。

Add SMS Notifications to Your Rails App Using Twilio

Twilio で Rails アプリ発 SMS 通知機能実装。

面白いと思ったのはそもそもの課題。ニューヨークは道路掃除のため、駐車が許可されている路上スペースが定期的に変わる。変わったタイミングの通知が欲しかったらしい。車を移動させて罰金から逃れるように。

Adding Bash Completion to 'db:migrate:down'

migration のバージョン番号を補完してくれる .bash_profile 用スクリプト

5 Commercial Use Cases Continue to Prove the Value of Rails

意外と Rails だった 5 サイト。

Do You Really Need WebSockets?

複雑な WebSocket しかないと思われがちリアルタイム通信だが、サーバからの一方的なプッシュだけなら、比較的シンプルServer-Sent Events で十分。

  • HTML5 標準
  • RailsSinatra、Roda ではサポートされてる
  • 再接続機能完備
  • デメリットは、クライアント切断検知機能がない

ポーリングとも比較している。

豆知識:Facebook Messenger (ブラウザー版)は意外とポーリングで実装されている。

Code, Tools & Demos

sidekiq_profiling_middleware: A Tool for Profiling Sidekiq

stackprof または memory_profiler で Sidekiq をプロファイリングしてくれるミドルウェア gem。ダンプは S3 にエクスポート可能。

qo: Pattern Matching and Fluent Querying in Ruby

実験的なパターンマッチング gem。

The Ultimate Guide to Ruby Timeouts: Timeouts for Popular Ruby Gems

人気 gem のタイムアウト設定方法まとめ。

mysql2: A Modern, Simple and Fast MySQL Library

mysql2 gem は v0.5 リリースで Ruby 2.0+、MySQL 5.5+ 以外対応しなくなった。

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

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

http://rubyweekly.com/issues/393rubyweekly.com

Highlights

An In-Depth Look at a Ruby Vulnerability

String#unpack 脆弱性の解説。

ImageProcessing 1.0: Image Processing Helper Library

Shrine でお馴染みの ImageProcessing gem が 1.0 にバージョンアップ。

  • ImageProcessing::MiniMagick がチェーン可能な API になった。
  • EXIF メタデータを元に自動回転補正。
  • サムネールをよりシャープにする後処理。
  • ImageProcessing::Vips でサムネール生成高速化。

News

Ruby Sass to Be 'Put to Pasture' on March 26, 2019

sass gem が deprecate され、来年メンテ終了。Dart Sass へ移行推奨。

Isle of Ruby 2018: A British Ruby Event on April 13-15 (Exeter, UK)

今週末はイギリス・エクセター市の Isle of Ruby カンファレンス。

Tutorial

Graceful Errors in Ruby SDKs

SendGrid、Twilio、Stripe、Contentful の SDK gem のエラー処理比較。

SendGrid は 400、401 発生時に例外を投げず、その後のヌルポなどで初めてエラーが発覚。

Twilio は Twilio::REST::TwilioError を投げるが、エラークラスでもエラーメッセージでもエラー内容が分からない。

Stripe は 400、401 それぞれ専用のエラークラスを投げ、分かりやすいエラーメッセージを添えてくれる。

Contentful は 400、401 それぞれ専用のエラークラスを投げ、API レスポンスをパースしてエラーメッセージに埋め込んでくれる。

The Local Variable Aversion Antipattern

ローカル変数アレルギーはアンチパターンだという主張。

Tools

Gemsmith: A Command Line Interface for Smithing New Ruby Gems

gem 開発用 CLI

Code

Blueprinter: A Declarative and Fast Object to JSON Serializer

JSON シリアライズ用 gem。

Grape: An Opinionated Framework for Creating REST-like APIs

RESTful API 開発用 DSL を提供するフレームワークRailsSinatra と併用可能。

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

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

http://rubyweekly.com/issues/392rubyweekly.com

Highlights

A New Ruby Application Server: NGINX Unit

NGINX のアプリサーバ NGINX Unit が Ruby にも対応できるようになった。

Fuse Panel: A Graphical Interface for Passenger

Passenger の新しい Fuse Panel 管理画面紹介。

News

Gotham Ruby Call for Papers

ニューヨークの GORUCO 2018、CFP はあと 2 週間。

Tutorial

How to Deploy Rails Apps with Ansible, Capistrano and Semaphore

  • Ansible で AWS 上サーバ構築する手順
  • CapistranoRails アプリをデプロイする手順
  • Semaphore で CI をセットアップする手順

Share Your Gem's Changelogs on RubyGems.org

gemspec の metadatachangelog_uri を指定することで、RubyGems.org からリンクを張る。

Focused 'puts' Debugging with STDERR

デバッグ中に出力ノイズを省く戦略。

  1. 標準出力を /dev/null にリダイレクト。
  2. $stderr.puts でログを吐く。

Tools

Alki: A Dependency Injection Framework for Ruby

コンフィグやサービスオブジェクトを管理してくれる依存性注入フレームワーク

Code

Strong Migrations: Catch Unsafe Migrations at Dev Time

オンラインメンテで問題を起こしそうな migration を検知してくれる gem。

PpSql: ActiveRecord SQL Query Log Beautifier

ActiveRecordSQL ログやコンソール出力を pp のようにフォーマットしてくれる gem。

Envizon: A Network Visualization Tool Written with Rails

ネットワークをスキャン・可視化・管理する Rails アプリ。Docker イメージ付き。

Ruby Event Store 0.27 Released

イベント駆動アーキテクチャーのイベント永続化 Ruby Event Store gem。