rastam’s blog

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

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

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

rubyweekly.com

Highlights

Awesome Ruby: Curated List of Ruby Libraries and Tools

Ruby ツールまとめ。

How Mutation Testing Causes Deeper Thinking About Your Code

mutant gem のミュテーションテストでモジュールの設計を見直した話。mutant が @unpublished_events = []@unpublished_events = nil に変えたのに、テストがそのまま通った。原因は getter がメモ化していたから。getter が必要なののは、#initialize で設定していないから。#initialize を prepend してみたが、無理矢理すぎて結局何も変えないことにした。

Crystal: The Ruby You’ve Never Heard of

Crystal はシンタックスRuby に非常に似ていてかつ速い。筆者のスクリプトも Crystal が 80 倍速かった。

Crystal の特徴:

  • Type Union: 1 つの変数で複数データ型を許容できる
  • Type Inference & Checking: コンパイル時にデータ型チェック・推論
  • Concurrency: Fiber に対応しているが、マルチスレッドはこれから
  • マクロでメタプロ
  • Ruby からも呼べる

Machine Learning Basics: K Nearest Neighbors

Google 社員の Aja Hammerly 先生がアヤメのデータセットで k 近傍法を紹介。アヤメのデータセットを散布図でプロット。品種の不明なアヤメの花もプロットしたら、図上距離の最も近いものが同一品種だと推測できる。図上距離はピタゴラスの定理で計算。

News

Ruby Together's August 2017 Update

  • Steve Klabnik 先生が Ruby Together 委員会から引退。Rust に集中するため。
  • Bundler が Ruby コアに同梱。

Tutorial

Don't Call Us, We'll Call You: Sending Webhooks with Rails

Rails で Webhook を実装する手順。

  • 送信先 URL と該当イベントのマッピングを保存する Webhook::Endpoint モデルと webhook_endpoints テーブル。
  • イベントとペイロードデートをラッピングする Webhook::Event モデル。
  • 各モデルに include する Webhook::Delivery モジュール。モデルのコールバックで Webhook::Delivery#deliver_webhook を呼ぶ。
  • 非同期送信用 Webhook::DeliveryWorkerWebhook::Endpoint#deliver から呼ぶ。

Build Your Own Daily Fantasy Football Salary Tracker with Ruby and Twilio

Ruby でファンタジーフットボール用選手給料トラッカーを作った話。 ファンタジーフットボールとは米国大人気のアメフトのドラフト会議シミュレーションゲーム。 リアル選手のリアル給料に大きく影響されるので、 2 時間ごとに最新給料 CSV を DraftKings.com からダウンロードして DB に保存。 変動のあった給料を ImageMagick で画像に描画し、Imgur にアップロード。 Twilio で Imgur リンクを MMS として携帯に送信。

Use TTY::Command to Run External Processes in Ruby

TTY::Command gem でシェルコマンドを細かく制御。system... だけでは、下記よくあるニーズが満たせない。

  • exit ステータスが 0 以外の場合は例外を投げる
  • stdout、stderr 抑えて、文字列に格納して返して欲しい

Open3#popen3 なら細かく操作できるが、低レベルで使いづらくてミスりやすい。

Cross-Site Scripting in Rails

Rails のよくある XSS 落とし穴:

  • HTML エスケープを止める rawhtml_safe や ERB の <%== %>
  • HTML 属性の " 漏れ。
  • link_to の URL。
  • テンプレート内 JSONRailsjson_encode 推奨。
  • コントローラで render inline:。サーバ上シェルコマンド実行までできちゃう!

DateTime#to_time and Time#to_time Preserve Timezone in Ruby 2.4+

Ruby 2.4 以降の DateTime#to_time Time#to_timeタイムゾーンを維持するようになった。2.3 以前はシステムタイムゾーンに変更していた。

Composable RSpec Matchers

カスタム matcher BeEventRSpec::Matchers::Composableinclude することで

expect([FooEvent.new, BarEvent.new]).to include(an_event(BarEvent))
expect(domain_event).to be_an_event(OrderPlaced).with_data(order_id: kind_of(Integer))

のような expectation を実現した話。

Watch Out for This Ruby Blocks Scope Gotcha

metrics_tracker ローカル変数の定義までトランザクションのブロックに囲ってしまったら、ブロック外で metrics_tracker の呼び出しでバグを起こした話。

Using Rails' MessageVerifier for Stateless Token Management

メールで送るパスワードリセット用リンクなどのトークンを生成・検証してくれる ActiveSupport::MessageVerifier の実用例。トークンは DB に保存しないためセキュリティ抜群。

Tools

ezpaas-cli: A Miniature Docker-Powered Heroku Clone for In-House Deployments

Heroku の OSS クローン。動的インスタンスは Docker で。

py2rb: An AST-Based Python to Ruby Code Translator

PythonRuby 変換用 Python スクリプト

Code

Roda 3.0 Released: A Routing Tree Web Toolkit

Sequel ORM 生みの親 Jeremy Evans 先生の routes 用 gem Roda 3.0 がリリースされた。

Searchkick: Intelligent Search for Rails Apps

機械学習 + Elasticsearch 検索機能用 Rails engine。クエリ正規化など対応。