- Ruby / Rails関連
週刊Railsウォッチ(20200303後編)Ruby 2.7で引数のruby2_keywordsフラグを確認する、fake_apiでAPIプロトタイプ、groupdateで日付をグルーピングほか
こんにちは、hachi8833です。私もしばらくの間リモートワークになりました。
家で保育園と小学校をやりながら仕事をしてるんだけど、これ無理では......
— yancya (@yancya) March 2, 2020
それはそうと確定申告が延長されましたね🎉。
参考: 確定申告4月16日まで延長方針 - Yahoo!ニュース
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓Ruby
⚓Ruby 2.7の引数を確認する
- 元記事: Ruby 2.7.0でキーワード引数として渡された引数なのかどうかフラグを確かめる方法 - かみぽわーる
-
PRコメント: Fix keyword argument warning on Action Mailer by rafaelfranca · Pull Request #38105 · rails/rails
- Gist: bouncing_test.patch
つっつきボイス:「詳しくはkamipoさんのブログを見ていただきたいんですが、hashオブジェクトにRuby 2.7のruby2_keywords
フラグが付いているかどうかを確かめる公式の方法がこれまでなかったそうです」「これは渡されたものに対する評価方法がないってことですよね?たしかメソッドに対してはどういう引数があるのかをざっくり調べるメソッドは一応あるはず(名前忘れたけど😆)」
後で調べるとMethod#parameters
がそれのようです。
「Ruby 2.7に入ったruby2_keywords
はキーワード的に使ってますね😋」「まあ上書きできるのかもしれませんが☺️」
- リポジトリ: GitHub - ruby/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?
が正式に入るそうです」「お〜バックポートもすると😍」「ライブラリメンテナが泣いて喜ぶ機能😂」「つくづく凄い人たち...」
- PR: hash.c: Add a feature to manipulate ruby2_keywords flag by mame · Pull Request #2818 · ruby/ruby
⚓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
とか便利そうなのがありますね」「時刻の細かな扱いが多くて、時刻のレンジを切って分析することが多い案件なんかでは有用かも👍」「やった😋」「普通はあまりしませんけど😆、こういうのを知っていれば車輪の再発明しなくて済むかも☺️」
⚓その他Ruby
つおい😳。
金曜日の夜から移動して松本に行き、ハウスに一泊したあと、土曜日に、ながのRubyの花見(会場はハウスから徒歩数分)に参加して、ハウスに一泊して日曜日に帰る、というプランがオススメです。4泊と料金は変わりませんが、2泊で 13,000 円なら、まぁまぁ安いと思います。よろしくお願いします https://t.co/eNV8wiiuHN
— yancya (@yancya) March 3, 2020
⚓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(プロセッサシリアルナンバー)でした↓。
「あと今月のWeb+DB Pressを買ったらblog.jxck.ioの中の人の新連載が始まっていて↓、これもブログと同じぐらい特濃でおすすめです😋」
みんなで読もうWEB+DB PRESS #phpstudy https://t.co/NMXrGJslyd
— tadsan (@tadsan) February 26, 2020
最新号はjxckさんの『Origin解体新書』の他、mameさんの『コミッター詳解: Ruby 2.7の魅力』、ko1さんの『Rubyのウラガワ』など目白押しです。
⚓その他フロントエンド
- サイト: Neumorph.scss -- Bootstrapテーマあり
Download Neumorph UI Kitmade by @springslambs at:
👉 https://t.co/ILAkbyiT70 pic.twitter.com/t9tFKH1GP1
— UpLabs 👑 (@UpLabs) February 28, 2020
つっつきボイス:「BPSのデザインチームがこのNeumorphというデザインで盛り上がってました」「へ〜このエンボスっぽいデザインですか😳: まだWeb界隈では見かけないな〜」「ひと頃のフラットデザインから逆に振れてきた感じなのかしら😆」「ちょっと前までフラットだ何だって言ってたのに😆」「きっとまた逆に振れる😆」
「こうやって目立たせたいところが凸になってるのって意外と重要かもしれませんね☺️」「色に頼らないのもよさげ😋」「ユニバーサルデザイン的に色覚の弱い人でも使いやすそうな気がしますし」「普段はデザインにあまり目が向かないけど、これはちょっと好き❤️」
「そう思うとCSSのz-index
って何だったんだろうって😆」「まあz-index
の軸とは違う感じ😆」
⚓言語・ツール
⚓習わぬ経を読む
ちなみにこれ「三項演算子使いまくってif文減らしました!!」って話じゃないよ。
interfaceで抽象化したりhashで区分オブジェクト実現したり、コレクションクラスを作ってリスト処理を隔離&単純化するなど、設計で解決するという話だよ。
— ミノ駆動 (@MinoDriven) February 25, 2020
つっつきボイス:「ちょっとできすぎな話かも😆」「ええ子や、パパの言うとおりよ〜👋」
⚓その他言語
今日モブプロで「あ、これ三項演算子でいいんじゃね?」とざっくり書いて、次の瞬間IntelliJにifに展開してもらった。ifちょーみやすい……
— いろふ (@irof) February 25, 2020
つっつきボイス:「これもほっこりしました☺️」「三項演算子を使うかどうかの見極めってほんと難しいですね〜😆: うまくハマれば可読性上がることもありますし、メソッド末尾のreturn
のところだったら三項演算子でもいいかな思うんですけど」「たいていこじらせる😆」「仕様が変わって三項演算子をif
にしないといけなくなったときがめんどい😆」
「後置のif
は好きです」「ガード文に使う後置のif
はいいですね😋」
⚓その他
⚓『ちいさい言語学者の冒険-子どもに学ぶことばの秘密』
つっつきボイス:「こないだKindleでポチって読み中なんですが、いきなり面白かったので」「ほほぅ?」「言語学者の著者が主に自分の子をネタに言語学的な発見をする話なんですが、たとえば小さい子どもにこんな質問をすると↓」
- 「か」に点々を付けると? --> 「が」
- 「さ」に点々を付けると? --> 「ざ」
- 「た」に点々を付けると? --> 「だ」
- 「は」に点々を付けると? --> (ほとんどの子が、喉の奥をならすような文字に書けない音を出す)
「というふうにほとんどの子が『ば』と発音しない: 実は『ば行』の濁点は他の濁点と発音の規則が違っているということを、規則を知らない子どもが図らずも見つけ出したそうです」「だって半濁音の『ぱ』があるくらいですし😆、お子様はそのあたり混じりがちなのでは?」「実際、昔の日本語には『ば行』がなくて『ぱ行』だったという研究もあるそうです」
なお、apoptosis の概念を最初に提唱した論文では p を黙字としているらしく、この p を発音するか黙字にするかは論争の種だそうです。
米語では黙字にすることが多く、英語では発音することが多いという傾向があるようです。
日本語には「アポトーシス」と黙字の形で入っています。— LingLang@言語学好き (@linglanglong) February 24, 2020
「ヘリコプターがヘリコとプター🚁」「apoptosisにpが入ってて発音しないって知らなかった」
「pter」は英語では巡り巡ってfeather(羽)に変わり果てたそうです。
⚓その他のその他
#protip don't get the wheels if you keep this thing on your desk. There's no locks. pic.twitter.com/NfkqQiNKYC
— Marques Brownlee (@MKBHD) February 26, 2020
つっつきボイス:「なはは😆、ロックないとダメじゃん」「タワー型PCにキャスター要るかしら😆」
よく見る独学の人がCS卒に足りないスキル
重要順
1.タッチタイピング
2.アルゴリズムとデータ構造
3.計算量 BigOの計算
4.メモリやCPUなどの基礎逆にこれらを勉強すれば,もうCS卒の人と変わらないと思う
情報系院卒でスクール(日米)も行った私の意見
ブログにこの辺りの本など紹介してます
— かめ@米国🇺🇸データサイエンティスト/ブロガー (@usdatascientist) February 25, 2020
「タッチタイピングが1位って意外😳」「他は納得: オーダーのO
とか習わないと絶対やりませんし😆」
⚓番外
⚓スミソニアンに勝てる気がしない
The Smithsonian's treasures belong to you. Now you can download, remix, reuse and share them with #SmithsonianOpenAccess, for free, for any purpose. Explore at https://t.co/35Wp7dOaNK. pic.twitter.com/njhaN9JCoS
— Smithsonian (@smithsonian) February 25, 2020
つっつきボイス:「データ公開に加えて自由に再利用していいって太っ腹」「天才過ぎる」「米国のスミソニアン博物館って一日や二日では絶対見終わらないぐらい規模がでかいらしくて、死ぬまでに一度見に行ってみたいです👴」
後編は以上です。
おたより発掘
エンジニアの @junara783 です。
今週使ったGroupdate。これは自分の定番gemになりそう。
月単位の集計のSQLクエリ書くのって面倒。(タイムゾーン考慮したりGROUP BY駆使するのつらいから)Groupdateはメソッド1つでいい感じの集計クエリを発行してくれる。気持ちいいです!https://t.co/E5lz1ibgC8
— ビルディット / 八王子市のWebサービスデザイン・開発企業 (@BuildItInc) March 6, 2020
バックナンバー(2020年度第1四半期)
週刊Railsウォッチ(20200302前編)RubyKaigi 2020は9月に延期、Railsのセキュリティパッチバージョニングが変更、dry-monadsほか
- 20200226後編 dry-rbを使うべき理由、最近のRubyオンライン教材、AWSから乗り換えた話ほか
- 20200212後編 Rubyistが解説するUnicodeとUTF-8、Sorbetが速い理由、CSSの歴史、2019年の脆弱性まとめほか
- 20200210前編 Railsのベンチマークジェネレータ、長いバックグラウンドジョブと戦う、Timestamp切り詰めの謎、Open APIツールほか
- 20200204後編 Ruby3.0の他のbreaking change、Rubyのシリアライザ、GitHubのcode ownersほか
- 20200203前編 Railsの各種高速化コミット、OpenAPIの使い所、パンくずリストgem loaf、Railsビュー最適化ほか
- 20200128後編 もう一つのgemマネージャgel、”Did you mean”の仕組みを追う、DXOpalでブラウザゲームほか
- 20200127前編 Railsでキーワード引数warning退治始まる、ライブラリとフレームワークの違い、ShopifyのRails高速化記事ほか
- 20200121後編 RubyKaigi 2020受付開始、RubyGemsとBundlerの今後、ファイル同期ツールMutagenほか
- 20200120前編 福岡でも公開つっつき会、Railsのconnection_specification_nameでprimaryという名前が非推奨に、structure.sqlとschema.rbほか
- 20200115後編 Ruby 2.7関連情報、Bootstrap 5は今年前半リリースか、PostgreSQLでやってはいけないリストほか
- 20200114前編 config_forのbreaking change、Active Storage variantをDBでトラッキング、SprocketsとWebpackの違いほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。