Ruby Weekly #367: 日本語サマリー
職場の Slack の #ruby 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。
Highlights
Ruby ツールまとめ。
mutant gem のミュテーションテストでモジュールの設計を見直した話。mutant が @unpublished_events = []
を @unpublished_events = nil
に変えたのに、テストがそのまま通った。原因は getter がメモ化していたから。getter が必要なののは、#initialize
で設定していないから。#initialize
を prepend してみたが、無理矢理すぎて結局何も変えないことにした。
Crystal はシンタックスが Ruby に非常に似ていてかつ速い。筆者のスクリプトも Crystal が 80 倍速かった。
Crystal の特徴:
- Type Union: 1 つの変数で複数データ型を許容できる
- Type Inference & Checking: コンパイル時にデータ型チェック・推論
- Concurrency: Fiber に対応しているが、マルチスレッドはこれから
- マクロでメタプロ
- Ruby からも呼べる
Google 社員の Aja Hammerly 先生がアヤメのデータセットで k 近傍法を紹介。アヤメのデータセットを散布図でプロット。品種の不明なアヤメの花もプロットしたら、図上距離の最も近いものが同一品種だと推測できる。図上距離はピタゴラスの定理で計算。
News
Tutorial
Rails で Webhook を実装する手順。
- 送信先 URL と該当イベントのマッピングを保存する
Webhook::Endpoint
モデルとwebhook_endpoints
テーブル。 - イベントとペイロードデートをラッピングする
Webhook::Event
モデル。 - 各モデルに include する
Webhook::Delivery
モジュール。モデルのコールバックでWebhook::Delivery#deliver_webhook
を呼ぶ。 - 非同期送信用
Webhook::DeliveryWorker
をWebhook::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 として携帯に送信。
TTY::Command gem でシェルコマンドを細かく制御。system
、...
だけでは、下記よくあるニーズが満たせない。
- exit ステータスが 0 以外の場合は例外を投げる
- stdout、stderr 抑えて、文字列に格納して返して欲しい
Open3#popen3
なら細かく操作できるが、低レベルで使いづらくてミスりやすい。
- HTML エスケープを止める
raw
、html_safe
や ERB の<%== %>
。 - HTML 属性の
"
漏れ。 link_to
の URL。- テンプレート内 JSON。Rails は
json_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 以前はシステムタイムゾーンに変更していた。
カスタム matcher BeEvent
に RSpec::Matchers::Composable
を include
することで
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 を実現した話。
metrics_tracker
ローカル変数の定義までトランザクションのブロックに囲ってしまったら、ブロック外で metrics_tracker
の呼び出しでバグを起こした話。
メールで送るパスワードリセット用リンクなどのトークンを生成・検証してくれる ActiveSupport::MessageVerifier
の実用例。トークンは DB に保存しないためセキュリティ抜群。
Tools
ezpaas-cli: A Miniature Docker-Powered Heroku Clone for In-House Deployments
Heroku の OSS クローン。動的インスタンスは Docker で。
Python → Ruby 変換用 Python スクリプト。
Code
Sequel ORM 生みの親 Jeremy Evans 先生の routes 用 gem Roda 3.0 がリリースされた。