rastam’s blog

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

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

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

http://rubyweekly.com/issues/370rubyweekly.com

Highlights

Ruby 2.5 Preview 1 Released

Ruby 2.5 Preview 1 リリース!

  • do; end ブロック内 rescue 対応。
  • yield_self 新規追加。
  • bundler 同梱。
  • 同一ネームスペース内で見つからなかった定数をルートネームスペースから探すのがなくなった。

Unsafe Object Deserialization Vulnerability in RubyGems

RubyGemsリアライゼーション脆弱性を解説した Aaron Patterson 先生。 gem のチェックサムYAML で保存されているのが原因。 RubyGems.org はこの脆弱性で攻撃された痕跡はない。 シリアライズ可能なオブジェクトをホワイトリストすることで解消済み。

ReportsKit: Add Reporting to Your Rails App in Minutes

レポート用 Rails engine。

Introducing hanami-cli: A New Framework for Command Line Tools

hanami-cli を紹介した、Hanami 作成者 Luca Guidi 先生。 thor では実装しづらい下記機能がある:

  • サブコマンド。例えば $ hanami generate actiongenerate action
  • 拡張性。外部 gem が Hanami にサブコマンドを追加できるようになった。

Hanami じゃなくても使えるので、thor の代替案として考えれば良い。

Top-Level Constant Lookup Removed in Ruby 2.5

同一ネームスペース内で見つからなかった定数をルートネームスペースから探すのが Ruby 2.5 からなくなった。その経緯を語る Redmine チケット。

Monkey Patching in Ruby: A Real World Example

Surrealist gem に対応するように、ArrayActiveRecord::Relation のモンキーパッチを検討した話。 下記条件全部満たせなければ、モンキーパッチやめたほうがいいと。

  • これ以上のモンキーパッチはない。
  • モンキーパッチしたコードに依存しているものが壊れない。
  • モンキーパッチ以外の選択肢がない。
  • 新しいインタフェースが作れない。

Organizing My First Conference: Southeast Ruby

カンファレンスを初めて主催した経験談。地方カンファレンスがなくなってきたのがきっかけ。

  1. 昔あったナッシュビル市の Ruby Hoedown カンファレンス主催者から許可を得た。
  2. ドメイン取得(自腹)。
  3. 会社設立(自腹)。
  4. ロゴ発注(自腹)。
  5. キーノート登壇者を招待した。
  6. CFP を 1.5 ヶ月開催。もうちょっと長くすればよかった。
  7. 予算計算。$199 のチケットを 175 枚売れば黒字。
  8. 会場探し。
  9. スポンサー探し。大変だったため、プランはもうちょっと安くすればよかった。
  10. 登壇者宿泊 + 交通費負担することにした。
  11. チケット発売。SNS + Ruby Flow + Reddit で宣伝。87 枚売れた。
  12. カンファレンス 3 日間開催。

赤字だったが、Ruby コミュニティに貢献できた充実感で、来年も開催予定!

News

Rails 5.2 Adds Options for Signed and Encrypted Cookies

Rails 5.2 では、暗号化・署名付きクッキーの有効期限が設定可能に。

RubyElixirConf Taiwan 2018 Call For Papers Open

台北の RubyElixirConf Taiwan 2018、CFP 開始。

New Book Released, 'Mastering Ruby Strings and Encodings'

Mastering Ruby: Strings and Encodings 本発売。

Tutorial

Receiving and Parsing Email in Rails 5 Using Griddler and Mailgun

Build a SaaS App in Ruby on Rails 5 本の抜粋。Rails 5 + Griddler + Mailgun でメールを受信・パースする手順。

  1. ngrok で手元マシンへの URL を用意。
  2. Mailgun で受信したメールを ngrok URL に転送するように Mailgun を設定。
  3. Griddler gem を Rails アプリにマウント。
  4. EmailProcessor オブジェクトでパース・処理を実装。

HTTP2 Early Hints in Rails 5.2+

Rails 5.2 の HTTP2 Early Hints を発表した Eileen Uchitelle 先生。Rails がレスポンスを 2 つ返すようになる:

  1. Early Hints(HTTP ステータス 103)
  2. 通常のレスポンス(HTTP ステータス 200、404、500 など)

Early Hints はブラウザーが優先的にダウンロードするファイル(JavaScriptCSS など)の指定。Rails での検証手順も記載されてる。

A Look at Ruby 2.5's Improved Stacktraces

Ruby 2.5 スタックトレースの見た目改善。エラー発生行番号が一番下になった。長いスタックトレースの上までスクロールすることがなくなって便利。しかし RailsRSpec では効かない。

Extracting a Class from a Method

巨大メソッドをクラスに抽出した話。

7 Little-Known Ruby Methods To Help You Write Better Code

Ruby のよく知られてないメソッド。

  1. Integer#digits (Ruby 2.4 以降)
  2. #tap
  3. Array#values_at
  4. Hash#transform_values (Ruby 2.4 以降)
  5. Kernel#itself (Ruby 2.2 以降)
  6. Array#count
  7. Enumerable#cycle

Upload Images to S3 in GraphQL Using Rails and Paperclip

PaperclipRails GraphQL API から画像を S3 にアップロードした話。REST アプリならドキュメンテーションはいっぱいあるが、GraphQL アプリは一切ない。画像を Base64 文字列に変換してから mutation の引数として Paperclip に渡した。

PDF Filter Implementation in HexaPDF Using Fibers

HexaPDF gem の PDF ファイル読み込み処理解説。

  • PDF ファイルは不特定多数のストリームで構成されてる
  • 各ストリームには不特定多数のフィルターが指定されてる
  • フィルターはストリームデータの解読方法を定義している(例:JPEG 画像は DCTDecode フィルター、ASCII 文字列は ASCIIHexDecode フィルター)
  • フィルターはそれぞれ HexaPDF::Filter::ASCIIHexDecode のようなモジュールで実装されてる
  • ストリームは HexaPDF::StreamData オブジェクトでカプセル化
  • ストリームのデータは非同期で読み込むため、Ruby の Fiber 採用

A Guide to Understanding the Rails Directory Structure

Rails フォルダー構造まとめ。

Updating Deeply Nested Attributes with RSpec

RSpec で深階層の nested attributes を指定した話。手で組み立てるのが大変だった。先輩に相談したら、ログからコピペすることになった。

Tools

nullalign: Generate Warnings for Missing Not-Null Constraints

NOT NULL 制限のない validates presence: true を検知してくれる nullalign gem。

Code

PgParty: PostgreSQL 10 Partitioning for ActiveRecord

ActiveRecord + PostgreSQL 10 パーティション管理用 gem.