Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20200303後編)Ruby 2.7で引数のruby2_keywordsフラグを確認する、fake_apiでAPIプロトタイプ、groupdateで日付をグルーピングほか

こんにちは、hachi8833です。私もしばらくの間リモートワークになりました。

それはそうと確定申告が延長されましたね🎉。

参考: 確定申告4月16日まで延長方針 - Yahoo!ニュース

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

Ruby

Ruby 2.7の引数を確認する


つっつきボイス:「詳しくはkamipoさんのブログを見ていただきたいんですが、hashオブジェクトにRuby 2.7のruby2_keywordsフラグが付いているかどうかを確かめる公式の方法がこれまでなかったそうです」「これは渡されたものに対する評価方法がないってことですよね?たしかメソッドに対してはどういう引数があるのかをざっくり調べるメソッドは一応あるはず(名前忘れたけど😆)」

後で調べるとMethod#parametersがそれのようです。

「Ruby 2.7に入ったruby2_keywordsはキーワード的に使ってますね😋」「まあ上書きできるのかもしれませんが☺️」

後でruby2_keywordsを頼りにMethod#parametersをやってみました。

require 'ruby2_keywords'

module YourModule
  ruby2_keywords def delegating_method(*args)
    other_method(*args)
  end
end

class Foo
  include YourModule
end

Foo.new.method(:delegating_method).parameters
#=> [[:rest, :args]]

これはmameさんのハックを見て知った方法で、ようはフラグが付いてるhashオブジェクトかそうじゃないオブジェクトかで違う振る舞いをする処理を通らせてその結果を観測することでどっちだったかを確かめるという方法です。
同記事より

「観測!Ruby 2.7以降に合わせてすべてを完璧に修正する必要はなくて、観測して振る舞いが違うものに絞り込んで当面修正すればいいというのであれば、なかなかうまい方法かも😋」「観測されないものは存在しない😆」

このフラグが付いてるhashオブジェクトかそうじゃないオブジェクトかで違う振る舞いをする処理がRubyの世界からはほとんど存在しないので、普段Rubyでコードを書いてる常人が自力では気づけんやろって方法で、一部のメソッド(initializeとかmethod_missingとか)をRubyのコードから直接呼び出すんじゃなくてCのコードから間接的に呼び出されるときにフラグが付いてるhashオブジェクトをdupするので、dupされずにそのままのオブジェクト(object_id)だったらフラグが付いてなかったってことでdupされて別のオブジェクトが観測されたらフラグが付いてたオブジェクトだったという技を使っています。
同記事より

「ここが振る舞いの違うところですか😳」「一気に書き下した感」「C言語の世界でのこんな微妙な振る舞いの違いを使うのすげ〜」「これでRailsのオプション引数退治をはかどらせてたんですね🍑」

「そしてRuby 2.7.1では、フラグを見分けるruby2_keywords_hash?が正式に入るそうです」「お〜バックポートもすると😍」「ライブラリメンテナが泣いて喜ぶ機能😂」「つくづく凄い人たち…」

ferrum: ヘッドレスChrome API


同サイトより

以下を謳っています。

  • Pure Chrome
  • Pure Ruby
  • No addiction

つっつきボイス:「フェラーム?」「あ、元素記号の鉄(Fe)か!ラテン語です」「クロム(Chromium)だから鉄ってシャレね☺️」「CapybaraではculpriteというヘッドレスChromeドライバでやってるらしいですが、FerrumはCapybaraなしでもブラウザをRubyからいろいろ制御してクロールとかやれるということみたいです」

# 同リポジトリより
# Trace a 100x100 square
browser = Ferrum::Browser.new
browser.goto("https://google.com")
browser.mouse
  .move(x: 0, y: 0)
  .down
  .move(x: 0, y: 100)
  .move(x: 100, y: 100)
  .move(x: 100, y: 0)
  .move(x: 0, y: 0)
  .up

browser.quit

RuboCop 0.80リリース(Ruby Weeklyより)

今日見るともう0.80.1がリリースされていました。


つっつきボイス:「RuboCop 0.80がリリースされてました」「Style/HashTransformKeysやらStyle/HashTransformValuesやらいろいろ追加されてるな〜」「copますます強くなる👮‍♂️」「この間取り上げたJUnitFormatterも入ってます(ウォッチ20200218)」「JUnitはJavaでは当たり前に使われてるテスティングツールですね☕️」

「ついでにRubyWeeklyでは以下のRedditも紹介されててて、『RuboCopの取締きびしすぎ』『いやそんなことない』『お前はよくてもチームはそうじゃねえ』『どの辺のルールがつらい?』とかスレがめちゃ伸びてます😆」「自分はありもののルールでやってるから気にしたことないですし😆」「最初からなるべく素のRuboCopでやれたら平和になれるかしら😆」「まあ変にいじるとアップグレードとかでややこしくなったり😆」

fake_api: APIのプロトタイプ作成(Ruby Weeklyより)

# 同リポジトリより
# app/fake_api/app_routing.rb
class AppRouting < FakeApi::Routing
  get('/projects').and_return           { create_list(:project, 5) }.with_status(202).with_headers({TOKEN: "SECRET"})
  get(%r{/projects/\d+$}).and_return    { object(:project) }
  post('/projects').and_return          { object(:project).merge({created: 'ok'}) }
  delete(%r{/projects/\d+$}).and_return { { result: :deleted } }.with_status(333)

  post('/auth')
    .and_return { { status: "OK" } }
    .with_cookies({x: "A"})
    .with_session({y: "B"})
    .with_headers({token: "C"})
end

つっつきボイス:「これはもしかして嬉しい人がいるかも?文字どおりAPIのプロトタイプをさくっと作れるみたいです」「(デモ動画を眺めて)API仕様に基づいてJSONを吐けるgemという感じかな😋: まだ本物のAPIサーバーがないけど仕様とデータだけ判明してて、APIないと開発つらいぜみたいなときなんかに結構使えそうな気がします👍」「やった😋」「使い捨てのAPIサーバーとか自分でスクラッチで立てるのイヤですし😆」「JSON手作りするのも😆」

fake_apiはRailsエンジン型式になっていて、ファクトリーとルーティングを書けばRailsアプリの中で動かせる感じです。

midas: Rubyでアノマリー検出(Ruby Weeklyより)


つっつきボイス:「用語が何だか難しめなんですが、動的な世界でアノマリー(異常値)を検出するgemみたいです」「元になったC++版のMIDASの挿絵↓を見ると侵入の検出とかを指してるようだ🤔」「下のa1〜a3はいかにも悪い人たちですし🦹🏻‍♀️」「割と難しい世界…」「ankaneさんは最近Rubyで機械学習方面やってるからその絡みかも🤔」

グラフの異常値検出は、無数のシステムにおける疑わしい振る舞いを探す(侵入検出、レーティングの捏造、金融詐欺など)うえで重要な問題である。この問題は、静的なグラフに特化したアプローチの多くでは十分な研究がなされているが、現実のグラフは本質的に動的であり、静的接続に基づいた手法ではグラフやアノマリーの一時的な特徴を見落とす可能性がある。
(中略)
私たちの提案するMIDAS(Microcluster-Based Detector of Anomalies in Edge Streams)ではマイクロクラスターの異常値や、互いによく似た疑わしいエッジが突然エッジストリームに入ってくるのを、一定の時間とメモリで検出する。MIDASではさらに従来の手法にはなかった、原則に基づいた仮説のテスティングフレームワークを用いて偽陽性の確率の理論的束縛も提供する。最新のアプローチと比べて644倍高速かつ精度を48%向上させた。
github.com/bhatiasiddharth/MIDASより

直接の関連はありませんが『機械学習を用いた異常検知入門』スライドを貼ります。

「MIDASはギリシャ神話のミダス王なんでしょうね: 『王様の耳はロバの耳』の話と、触ったものが全部黄金になる力を神から授かったら飯も食えなくなった🥘という話の😆」「😆」

参考: ミダース - Wikipedia

groupdate: 日付のグルーピングgem(Ruby Weeklyより)

# 同リポジトリより
User.group_by_week(:created_at, time_zone: "Pacific Time (US & Canada)").count
# {
#   Sun, 08 Mar 2020 => 70,
#   Sun, 15 Mar 2020 => 54,
#   Sun, 22 Mar 2020 => 80
# }

つっつきボイス:「こちらは日付時刻のグルーピングgemだそうです」「あああ、こういうgroup_byってたしかにつらい😭」「Active Supportにはこういうのってないんでしたっけ?」「日付のgroup_byってepoch time的な数値でグルーピングしようと思えばできるんですけど、あんまり価値がない😆: 日でグルーピングとか分まで見てグルーピングとかって、やってみると結構エグいんですよこれが」「あ〜なるほど!」「created_atとかは秒以下の時刻も持ってますし、日でグルーピングとかって実はそんなに簡単じゃないんですよ〜😆」「このgemはタイムゾーンも扱えてgroup_by_dayとかgroup_by_weekとかgroup_by_hour_of_dayとか便利そうなのがありますね」「時刻の細かな扱いが多くて、時刻のレンジを切って分析することが多い案件なんかでは有用かも👍」「やった😋」「普通はあまりしませんけど😆、こういうのを知っていれば車輪の再発明しなくて済むかも☺️」

参考: UNIX時間 - Wikipedia

その他Ruby

つおい😳。

DB

iredis: Redisターミナルクライアント(DB Weeklyより)



同リポジトリより


つっつきボイス:「Redis用のインタラクティブなクライアントでiredisということみたいです」「お、redisのターミナルクライアント、よさげ😋」「あると嬉しい感じでしょうか?」「redisをRails経由で使うことはよくやってますけど…そもそもredisのGUIクライアントってありましたっけ?😆」「MySQLのMySQL WorkbenchやPostgreSQLのPgAdminみたいなGUIクライアントなヤツですよね、どうだったかな🤔」「つまりredisを直接触らなくてもやっていけるということで😆」

後で探すと、RedisInsightというブラウザベースの公式ツールがあるそうです。今は無料版でも制約なく使えるようです。

サイト: RedisInsight | Redis Labs

参考: Redis向け GUI ツール RedisInsight を使う - tech.guitarrapc.cóm

クラウド/コンテナ/インフラ/Linux/Serverless

FirefoxのDoH

参考: Firefox、米国では「DNS over HTTPS(DoH)」が初期設定で有効に - ITmedia NEWS


つっつきボイス:「FirefoxがDNS接続をHTTPS化するそうですけど、言われてみれば今までDNSのクエリって暗号化されてませんでしたね」「普通に温かみのある平文でやってますし😆: やりたいのは改ざん防止かな?」「英語記事によると、ISPがその気になればユーザーがDNSにアクセスしたときの情報を取れるのを防ぎたいということみたいです」「ははぁそちらですか」「Mozillaは信頼できるプロバイダとしてCloudflareとNetDNSを使うとありますね」「その2つは信用できるのかしら😆」「Cloudflareは信頼を高めるために何かやってた覚えあります(ウォッチ20180518)」

参考: IPアドレスを保存しない高速パブリックDNSサービス「1.1.1.1」、APNICとCloudflareが無料提供 - INTERNET Watch

記事ななめ読み(抜粋・大意):

プライバシーにどんな脅威があってDoHを導入するのか
ユーザーのインターネット上での活動はDNSリクエストで露わになる。プロバイダ(ISP)やWiFiプロバイダがその気になれば無断でその情報を集められる。
暗号化DNSにする理由と、DNS以外にISPが情報収集に使えるしくみがあるかどうか
ユーザーのプライバシーは多くの脅威にさらされており、1つの技術ではカバーできない。だからこそ個別の問題に取り組むのであり、脅威が多いからといって解決を拒む理由にはならない。Mozillaに限らず、DNS以外の個人識別情報の漏洩を防ぐ適切な方法の定義に取り組んでいる。TLS接続におけるESNI(Encrypted Server Name Indication)もそのひとつだ。
DoHでDNSの中央集約化がさらに進むとネット全体にとってよくないのでは?
中央集約化がネットにとってよくないのは確かだ。現実世界ではISPのDNSサービスにロックインされ、5つの企業が米国のブロードバンドインターネットの80%を牛耳っている。FirefoxをDoH化するとトラフィックが大手ISPから離れるので、中央集約化を弱めることはあっても強めることはなく、企業のDNS設定も尊重しつつユーザーの選択肢を増やせる。
DoHは企業の”split-horizon” DNSなどとうまくやれるか
企業はDoHを簡単に無効にできるし、Firefoxは企業のポリシーを検出して自動で無効にすることもできるようになる。
FirefoxのDoH化は全世界でやるのか
当面米国内のみのリリースに注力する。現時点ではヨーロッパやその他の地域でのリリース計画はないが、DoHはあらゆる人々のプライバシー保護にとってよいものであると私たちは強く信じている。

参考: インターネット用語1分解説~DNS over HTTPSとは~ - JPNIC

JavaScript

プロポーザル: パイプライン演算子をJSに

// 同リポジトリより
let result = exclaim(capitalize(doubleSay("hello")));
result //=> "Hello, hello!"

let result = "hello"
  |> doubleSay
  |> capitalize
  |> exclaim;

result //=> "Hello, hello!"

つっつきボイス:「2年ほど前からあるプロポーザルですが😆」「みんな好きね〜|>パイプライン演算子🚰」「Elixirとか」「Ruby 2.7にもパイプライン演算子が入りかかったけど先送りになってましたね(ウォッチ20191210)」

参考: Elixir (プログラミング言語) - Wikipedia

「やっぱりパイプラインの記号は|>になるのかしら🤔」「|>はJSっぽくはないけど、言葉で書くよりうまい記号があればそっちでやりたいですし☺️」「そういえば論理学方面の記号って、画数が少なくて書くのは楽だけど読むのがめちゃ大変なのがちょくちょくあってつらいです😭」「慣れると記号じゃない方がつらくなりますし😆」

参考: パイプライン演算子の歴史 - まめめも

CSS/HTML/フロントエンド/テスト

「牧歌的 Cookie の終焉」


つっつきボイス:「jxckさんによるCookieの今後についてのエッセイなんですが、はてブでものすごいブクマ数になってて、しかもCookieについての説明としてもよくできてて、久しぶりに技術文の名文を読んだ気持ちになりました😂」「考えてみたら自分が知ってるのは牧歌的なCookieの方なのかも😆: Cookieはどうにでも使えちゃってたからトラッキングとかで使われがちだったけど、Cookieでやると何となくイカサマっぽく見えたり😆」

「その記事を読んでて、IDFA↓というものを今頃知りました: Webとは別のiOS特有の広告トラッキングシステムだそうです」「まあ使う側はそいつが誰なのかはどうでもよくて、端末が同じかどうかが識別できればそれでいいんですけど、誤解されがち😆」「ですね😆」

参考: IDFAについて、理解していますか?いまさら聞けないweb広告用語 | アド論 byGMO

「昔インテルのCPUも固有の番号を刻んだら袋叩きになってたことありましたし😆」「あ〜国民総背番号制とかそっちのイメージで騒ぎになってたような覚えが😆」

PSN(プロセッサシリアルナンバー)でした↓。

参考: CPUID - Wikipedia

「あと今月のWeb+DB Pressを買ったらblog.jxck.ioの中の人の新連載が始まっていて↓、これもブログと同じぐらい特濃でおすすめです😋」

最新号はjxckさんの『Origin解体新書』の他、mameさんの『コミッター詳解: Ruby 2.7の魅力』、ko1さんの『Rubyのウラガワ』など目白押しです。

その他フロントエンド


つっつきボイス:「BPSのデザインチームがこのNeumorphというデザインで盛り上がってました」「へ〜このエンボスっぽいデザインですか😳: まだWeb界隈では見かけないな〜」「ひと頃のフラットデザインから逆に振れてきた感じなのかしら😆」「ちょっと前までフラットだ何だって言ってたのに😆」「きっとまた逆に振れる😆」

「こうやって目立たせたいところが凸になってるのって意外と重要かもしれませんね☺️」「色に頼らないのもよさげ😋」「ユニバーサルデザイン的に色覚の弱い人でも使いやすそうな気がしますし」「普段はデザインにあまり目が向かないけど、これはちょっと好き❤️」

「そう思うとCSSのz-indexって何だったんだろうって😆」「まあz-indexの軸とは違う感じ😆」

参考: z-index-スタイルシートリファレンス

言語・ツール

習わぬ経を読む


つっつきボイス:「ちょっとできすぎな話かも😆」「ええ子や、パパの言うとおりよ〜👋」

その他言語


つっつきボイス:「これもほっこりしました☺️」「三項演算子を使うかどうかの見極めってほんと難しいですね〜😆: うまくハマれば可読性上がることもありますし、メソッド末尾のreturnのところだったら三項演算子でもいいかな思うんですけど」「たいていこじらせる😆」「仕様が変わって三項演算子をifにしないといけなくなったときがめんどい😆」

「後置のifは好きです」「ガード文に使う後置のifはいいですね😋」

[Ruby/Rails] 例外で深くなったネストをGuard Clauseですっきりさせる

その他

『ちいさい言語学者の冒険-子どもに学ぶことばの秘密』


つっつきボイス:「こないだKindleでポチって読み中なんですが、いきなり面白かったので」「ほほぅ?」「言語学者の著者が主に自分の子をネタに言語学的な発見をする話なんですが、たとえば小さい子どもにこんな質問をすると↓」

  • 「か」に点々を付けると? –> 「が」
  • 「さ」に点々を付けると? –> 「ざ」
  • 「た」に点々を付けると? –> 「だ」
  • 「は」に点々を付けると? –> (ほとんどの子が、喉の奥をならすような文字に書けない音を出す)

「というふうにほとんどの子が『ば』と発音しない: 実は『ば行』の濁点は他の濁点と発音の規則が違っているということを、規則を知らない子どもが図らずも見つけ出したそうです」「だって半濁音の『ぱ』があるくらいですし😆、お子様はそのあたり混じりがちなのでは?」「実際、昔の日本語には『ば行』がなくて『ぱ行』だったという研究もあるそうです」

「ヘリコプターがヘリコとプター🚁」「apoptosisにpが入ってて発音しないって知らなかった」

「pter」は英語では巡り巡ってfeather(羽)に変わり果てたそうです。

その他のその他

つっつきボイス:「なはは😆、ロックないとダメじゃん」「タワー型PCにキャスター要るかしら😆」


「タッチタイピングが1位って意外😳」「他は納得: オーダーのOとか習わないと絶対やりませんし😆」

参考: ランダウの記号 - Wikipedia

番外

スミソニアンに勝てる気がしない


つっつきボイス:「データ公開に加えて自由に再利用していいって太っ腹」「天才過ぎる」「米国のスミソニアン博物館って一日や二日では絶対見終わらないぐらい規模がでかいらしくて、死ぬまでに一度見に行ってみたいです👴」

参考: スミソニアン博物館 - Wikipedia


後編は以上です。

バックナンバー(2020年度第1四半期)

週刊Railsウォッチ(20200302前編)RubyKaigi 2020は9月に延期、Railsのセキュリティパッチバージョニングが変更、dry-monadsほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。

Ruby Weekly

DB Weekly

db_weekly_banner


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。