rastam’s blog

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

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

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

rubyweekly.com

Highlights

Visualizing Your Ruby Heap

Aaron Patterson 先生が Ruby ヒープを可視化した話。ObjectSpace でヒープを JSON で取得し、ChunkyPNGPNG 画像に落とした。

Ruby 2.5's Object#yield_self Method

Ruby 2.5 の Object#yield_self 登場。Elixir の |> 演算子相当。筆者見解では、コードのフロー的には読みやすくなるが、ボイラープレートが多い。

A Gaijin Guide to RubyKaigi

@schneems 先生の外国人として RubyKaigi に参加する豆知識。

  • 内容はテクニカルもの重視。スライドはコード大量。
  • 日本語トークはイヤホンで同時通訳あり。
  • トーク後の質疑応答は、司会が頑張って通訳。
  • 英語トークよりも日本語トーク聞いたほうがいい。あとからアップロードされる動画には字幕・吹替がないから。
  • 英語圏のいわゆる hallway track (参加者同士の交流)は基本ない。日本人は真っ赤の他人に話しかけたり質問したりするのに抵抗があるから。
  • 日本のレストランが狭くて大人数で食事するのが難しい。10 人座れるのは居酒屋ぐらい。そして居酒屋はあまり美味くない。
  • 食事の相手は日本語が喋れる人がいれば非常に助かる。美味い店は英語のできない店が多いから。
  • Yelp はあるが、tabelog 使いましょう。
  • コンビニ飯は意外と美味い。

日本人参加者へのお願い:外国人参加者に積極的に話しかけてください!

Debugging Why Your Specs Have Slowed Down

Thoughtbot 社員がテスト高速化のためにデバッグした話。

  • spec_helper.rb 部分的コメントアウトで下記犯人が判明:
    • 全テスト用の config.before(:each) に feature テストのセットアップが入ってた。type: :feature などのメタタグで用途別に分けた。
    • 全テスト DatabaseCleaner.strategy = :truncation になってた。メタタグで :truncation :transaction 適用した。
  • FactoryGirl 部分的コメントアウトafter(:create) のレコード大量作成が判明。trait に移し、再発防止として ActiveSupport Instrumentation でレコード作成数を見える化した。

OptCarrot: An Excellent CPU Benchmark for Ruby 3x3?

Ruby 3x3 ベンチマークとして作られた NES エミュレーター OptCarrot の紹介。

Using Python's scikit-learn Machine Learning Library via PyCall

PyCall gem 経由で Pythonscikit-learn 機械学習ライブラリーを Ruby から呼ぶ手順。

News

Rails 4.2.10 Released

サポート終了済みの Rails 4.2 は、デグレ対応のため 4.2.10 リリース。

Forking Behavior Changed in macOS 10.13, Causing Failures

macOS High Sierra の fork 挙動が変わったため、Puma ワーカーが失敗する現象発覚。

未解消!

Tutorial

Strange Hash Instances in Ruby

#eql? #hash のモンキーパッチで

  • 異なるキーで同一値のハッシュ
  • 同一キーで異なる値のハッシュ
  • 時間限定キーのハッシュ

インスタンス化した話。FixnumStringSymbol は C レベルで塞がれているが、それ以外のオブジェクトはモンキーパッチできた。

良い子は真似しないでね。

Object#try Considered Harmful

Object#try が有害だという主張。オブジェクトがヌルな場合でも、メソッドが定義されていない場合でも、エラー投げずにヌルを返し、正当なエラーまで隠滅してしまうから。

代替案:

  • ヌルチェックを明示的な if 文で。
  • デメテル法則厳守。
  • DB レベル NOT NULL でヌルを防ぐ。
  • 暗黙の to_s などに頼らず、明示的に該当データ型に変換。
  • ダックタイピング。
  • ヌルオブジェクトパターン。
  • &. は OK。ヌル以外のオブジェクトでメソッドが定義されていない場合は NoMethodError を投げるから。

Running Background Workers with Crontab

crontab + whenever gem で Sidekiq ジョブを定期的に起動する手順。

How to Implement a GraphQL API in Rails

graphql gem で Rails アプリの GraphQL API を実装した話。

  • Query でデータ取得用 API 定義
  • Mutation で破壊的 API 定義(例としては JWT 認証 API

How To GraphQL チュートリアルも参考に。

How to Build a React App that Works with a Rails 5.1 API

Rails 5.1 で React のアイデア付箋 CRUD アプリの実装手順。

  1. Rails API 実装。
  2. Facebook 社の Create React App で新規 React アプリ生成。
  3. IdeasContainer IdeaForm などコンポーネント実装。
  4. NPM の axios ライブラリで API を叩く。
  5. rack-cors gem で CORS 制限解消。
  6. NPM の immutability-helper ライブラリで React 上データのイミュタブル性を保証しながら更新。
  7. React Developer Tools ブラウザー拡張で状態監視。

All The Ways to Generate Routing Paths in Rails

link_to などにパスを指定する方法いろいろ。

  • edit_admin_exercise_path edit_admin_exercise_path ヘルパー
  • [:edit, :admin, exercise] 配列
  • {action: :edit, controller: "admin/exercises", id: exercise.id } ハッシュ
  • /admin/exercise/5/edit 文字列ハードコード

Building Something Besides a Chat App with ActionCable

PDF 非同期生成の生成完了通知を ActionCable で実装した話。Michael Hartl 先生の Learn Enough Action Cable to Be Dangerous を参考にしていた。

Get Into (Very Basic) Sentiment Analysis with Ruby

Ruby 感情分析ツールまとめ。