Ruby Weekly #370: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
do; end
ブロック内rescue
対応。yield_self
新規追加。- bundler 同梱。
- 同一ネームスペース内で見つからなかった定数をルートネームスペースから探すのがなくなった。
RubyGems シリアライゼーション脆弱性を解説した Aaron Patterson 先生。 gem のチェックサムが YAML で保存されているのが原因。 RubyGems.org はこの脆弱性で攻撃された痕跡はない。 シリアライズ可能なオブジェクトをホワイトリストすることで解消済み。
レポート用 Rails engine。
Introducing hanami-cli: A New Framework for Command Line Tools
hanami-cli を紹介した、Hanami 作成者 Luca Guidi 先生。 thor では実装しづらい下記機能がある:
- サブコマンド。例えば
$ hanami generate action
のgenerate action
。 - 拡張性。外部 gem が Hanami にサブコマンドを追加できるようになった。
Hanami じゃなくても使えるので、thor の代替案として考えれば良い。
同一ネームスペース内で見つからなかった定数をルートネームスペースから探すのが Ruby 2.5 からなくなった。その経緯を語る Redmine チケット。
Surrealist gem に対応するように、Array
と ActiveRecord::Relation
のモンキーパッチを検討した話。
下記条件全部満たせなければ、モンキーパッチやめたほうがいいと。
- これ以上のモンキーパッチはない。
- モンキーパッチしたコードに依存しているものが壊れない。
- モンキーパッチ以外の選択肢がない。
- 新しいインタフェースが作れない。
カンファレンスを初めて主催した経験談。地方カンファレンスがなくなってきたのがきっかけ。
- 昔あったナッシュビル市の Ruby Hoedown カンファレンス主催者から許可を得た。
- ドメイン取得(自腹)。
- 会社設立(自腹)。
- ロゴ発注(自腹)。
- キーノート登壇者を招待した。
- CFP を 1.5 ヶ月開催。もうちょっと長くすればよかった。
- 予算計算。$199 のチケットを 175 枚売れば黒字。
- 会場探し。
- スポンサー探し。大変だったため、プランはもうちょっと安くすればよかった。
- 登壇者宿泊 + 交通費負担することにした。
- チケット発売。SNS + Ruby Flow + Reddit で宣伝。87 枚売れた。
- カンファレンス 3 日間開催。
赤字だったが、Ruby コミュニティに貢献できた充実感で、来年も開催予定!
News
Rails 5.2 では、暗号化・署名付きクッキーの有効期限が設定可能に。
台北の RubyElixirConf Taiwan 2018、CFP 開始。
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 でメールを受信・パースする手順。
- ngrok で手元マシンへの URL を用意。
- Mailgun で受信したメールを ngrok URL に転送するように Mailgun を設定。
- Griddler gem を Rails アプリにマウント。
EmailProcessor
オブジェクトでパース・処理を実装。
Rails 5.2 の HTTP2 Early Hints を発表した Eileen Uchitelle 先生。Rails がレスポンスを 2 つ返すようになる:
- Early Hints(HTTP ステータス 103)
- 通常のレスポンス(HTTP ステータス 200、404、500 など)
Early Hints はブラウザーが優先的にダウンロードするファイル(JavaScript、CSS など)の指定。Rails での検証手順も記載されてる。
Ruby 2.5 スタックトレースの見た目改善。エラー発生行番号が一番下になった。長いスタックトレースの上までスクロールすることがなくなって便利。しかし Rails・RSpec では効かない。
巨大メソッドをクラスに抽出した話。
Ruby のよく知られてないメソッド。
Integer#digits
(Ruby 2.4 以降)#tap
Array#values_at
Hash#transform_values
(Ruby 2.4 以降)Kernel#itself
(Ruby 2.2 以降)Array#count
Enumerable#cycle
Paperclip で Rails GraphQL API から画像を S3 にアップロードした話。REST アプリならドキュメンテーションはいっぱいあるが、GraphQL アプリは一切ない。画像を Base64 文字列に変換してから mutation の引数として Paperclip に渡した。
HexaPDF gem の PDF ファイル読み込み処理解説。
- PDF ファイルは不特定多数のストリームで構成されてる
- 各ストリームには不特定多数のフィルターが指定されてる
- フィルターはストリームデータの解読方法を定義している(例:JPEG 画像は
DCTDecode
フィルター、ASCII 文字列はASCIIHexDecode
フィルター) - フィルターはそれぞれ
HexaPDF::Filter::ASCIIHexDecode
のようなモジュールで実装されてる - ストリームは
HexaPDF::StreamData
オブジェクトでカプセル化 - ストリームのデータは非同期で読み込むため、Ruby の Fiber 採用
Rails フォルダー構造まとめ。
RSpec で深階層の nested attributes を指定した話。手で組み立てるのが大変だった。先輩に相談したら、ログからコピペすることになった。
Tools
nullalign: Generate Warnings for Missing Not-Null Constraints
NOT NULL
制限のない validates presence: true
を検知してくれる nullalign gem。
Code
ActiveRecord + PostgreSQL 10 パーティション管理用 gem.