rastam’s blog

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

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

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

rubyweekly.com

Highlights

Fixing Bundler's Dependency Resolution Algorithm

dependabot(依存 gem チェッカー as a Service)のバグ改修で Bundler を 2 倍速くした話。

バグは Bundler の依存関係解決ロジック(Molinillo gem に抽出されてる)にあった。バックトラッキングアルゴリズムが複雑すぎて、リファクターすることに。そこで閃いて、グルーピングで 10 倍高速化。

次バグ改修したが、今度激重くなった。フィルタリングしてみたら今のスピードになった。

A Crash Course in Analyzing Memory Usage in Ruby

YAML から巨大 Hash を読み込む Rails アプリのメモリが気になり、Ruby メモリ計測方法調べてみた話。

  1. String#bytesize で文字列単位計測
  2. memory_profiler gem でブロック単位(Total retained 値)
  3. derailed_benchmarks gem の derailed exec perf:mem_over_time で多数リクエストを投げてメモリ計測

結論:3 の数値が横ばいになっていくから Hash 巨大化してもメモリへの影響はさほどない。

Looking Into CSRF Protection in Rails

RailsCSRF 対策の内部実装をコードリーディングした話。

Advanced Enumeration with Ruby

Enumeration 上級者編

  • Enumeration とは
  • Enumerator の最低条件
  • Lazy vs Not Lazy
  • 上級者活用例
    • グループ分け
    • フォールディング
    • Struct

Why It's Just Lazy to Bad-Mouth Rails

Rails 終わったなんてデタラメ」ブラジル RubyConf 元オーガナイザー Fabio Akita 氏。 Rails 経歴を振り返りながら、先々週の Coding Dojo ブートキャンプ騒ぎに反論。

2003 年。SNS 元年。

2004 年。Gmail 誕生。FB 急上昇。常識を覆す Rails がブラジルの無名カンファレンスで登場。

2006 年。TwitterGroupon、Engine Yard 登場。AWS S3・EC2 リリース。インディーズでもスケーリングが可能に。

2007 年。Heroku 誕生。Git リリース。iPhone 発売。

2008 年。GitHub 誕生。DevOps 元年。Zed Shaw が Ruby から引退した騒ぎ。Rails + Merb 結合。

2009 年。Apple ネイティヴ SDK リリース。NoSQL 元年。TwitterScala に移行。

2010 年。AppleFlash に対して宣戦布告。Rails 全盛期。

2011 年。RubyObjective-C が主流となった。

2012 年以降。Rails 屋さんから生まれた、なんでも作り直したがる不満げなエンジニアの時代。Go、Elixir、Scala などニッチ言語に流出。

結論Rails 終わったなんて大げさ。常識を覆さなくなったのは、Rails が常識になったから。

Effectively Managing Localization Files in Rails

Railsi18n 管理

  • キー命名統一しろ
  • ダブらせるな
  • 文字列前後に " 付けろ(YAML パース失敗 → Rails ブート失敗の原因。超デバッグし辛い)
  • ローカライズ外注先とのワークフロー決めろ
  • 該当文章が見つからなかった場合は機械翻訳をフォールバックに(コードあり)
  • YAML ファイル名とファイル内ロケールが一致しているかテスト書け

Tutorial

Modeling has_many Relationships with AWS DynamoDB

DynamoDB で has_many アソシエーションをモデリングした話。1 テーブルでのモデリングと 2 テーブルでのモデリングを比較した。

Using Gemstash for Private Gem Hosting

社内 gem を Gemfury(有料)でホスティングしてた Showoff 社が、gemstash でセルフホスティングにした手順。

  1. EC2 インスタンス作成・設定
  2. gemstash 用 Rails アプリ作成
  3. Capistrano 設定
  4. gemstash 設定(認証有無)
  5. デプロイ
  6. gemstash コマンドでプッシュ用キー作成
  7. 社内 gem を gemstash にプッシュ
  8. gemstash コマンドでフェッチ用キー作成、Gemfile に埋め込む

Tips on Treating Flakiness in your Rails Test Suite

テストが不安定になる原因

  • FactoryGirl(見えないところでレコード作りまくってる)
  • タイムスタンプ(Timecop 使え)
  • 外部リクエスト(スタブ・VCR 使え)
  • Ajax(JS レベルでスタブするコードあり)

Faster Rails: Eliminating N+1 Queries

N+1 クエリ撲滅方法

おまけ

  • Semaphore CI では bullet.log もジョブ毎に表示できる!という執筆者のステマ
  • Bullet.raise = true で CI ビルドをレッドにしよう
  • 既存 N+1 が多すぎる場合は、ホワイトリストに追加して、新規クエリのみ CI 対象にしよう

Quick Tip: The --profile Hammer and RSpec

RSpec--profile オプションで重いテスト特定して潰していこう。

Create a State Machine with AASM, Sequel, SQLite, Rake, and RSpec

AASM gem + Sequel で state machine 実装、RSpec でテスト。

Using Ruby and Amazon SQS FIFO Queues

Shoryuken gem + Amazon SQSFIFO キューでバックグラウンドジョブ処理。

FIFO キューの特徴

  • ジョブのグループ分け(処理順を例えばユーザ別に固めたい場合)
  • ジョブ重複実行防止(Amazon SQS に繰り返して投げた場合)

手順

  1. shoryuken sqs create queue.fifo コマンドで FIFO キュー初期化
  2. Shoryuken::Worker を実装(ActiveJob も OK!)
  3. Shoryuken::Worker.perform_asyncActiveJob.perform_later でジョブをキューに積む
  4. shoryuken -q queue -r ./hello_worker.rb コマンドでジョブ処理開始

rate limit にでも使える。

Using dry-container to Implement Inversion Of Control for Hanami::Events

Hanami::Events gem 作成者が dry-container の制御の逆転で DB バックエンドのアダプターをカスタムなものでも指定可能にした話。

Defining 'Super Secret' Hard-to-Call Methods

極秘メソッドの作り方。

. を含んだメソッド名を define_method('super.secret') で定義したら、send('super.secret') でしか呼べないメソッドができる。

考えられる用途:

  • 外から使わせたくないメソッド(つまり private メソッド)
  • 名前空間汚染防止

執筆者の注意事項:これやらないほうがいいよ!

4 Ways to Secure Your Auth System in Rails

Rails 認証セキュリティ改善案 4 つ。

  1. rack-attack などでリクエスト数制限しろ
  2. ちゃんとした HTTP セキュリティヘッダー付けろ
  3. 認証ライブラリーのソース、changelog、ブログ記事読め
  4. トークンをダイジェストしろ

Bundler and Private Dependencies

Bundler + GitHub の private リポ上の gem

Code

A Collection of Ruby One-Liners

役に立つ awk ワンライナー集Ruby で実装してみた。

graphql-guard: Simple Authorization Gem for GraphQL

GraphQL 用認可 gem。CanCanCan、Pundit とも併用可能。