- Ruby / Rails関連
週刊Railsウォッチ(20200414後編)Ruby 3で"endレス"メソッド定義構文が追加、ECMAScript 2020の新機能、紛失防止デバイスほか
こんにちは、hachi8833です。今日はMatzの誕生日と今朝Facebookが知らせてきました🎉。
ありがとうございます!(イタリアもいいな)
— Yukihiro Matsumoto (@yukihiro_matz) April 13, 2020
それはそうとZoom背景がすっかり大喜利化してますね。
- 元記事: リモートワークで「バーチャル背景」広まる ピクサーやセガがSNSで配布 | Mogura VR
- 元記事: ZOOM背景一発ボケ選手権「電波少年」「例のプール」「ソフマップ」「佐藤健」「銀魂のあれ」高度な発想力で楽しむ人増殖中(素材集めざして随時更新中) - Togetter
- 元記事: WEB会議などで使える「スタジオジブリ壁紙」 - スタジオジブリ|STUDIO GHIBLI
今朝はジブリのかぐや姫にしてみましたが、やっぱりこっちにしました↓。
弊社にも #バーチャル背景 で使えそうな画像があるんだけど、どうかな。
この奥行をご堪能下さい。 pic.twitter.com/fJqPM3Yz4b— 丸善ジュンク堂書店劇場 (@junkudo_net) April 13, 2020
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓Ruby
⚓monar: もうひとつのRubyモナド
# 同リポジトリより
class Just
include Monad
include MonadPlus
include Monar::Maybe
def initialize(value)
@value = value
end
def fmap(&pr)
self.pure(pr.call(@value))
end
def flat_map(&pr)
pr.call(@value)
end
# このモナドが2種類以上のオブジェクトを返す可能性がある場合は
# `monad_class`で親クラスを指定してください
def monad_class
Monar::Maybe
end
end
つっつきボイス:「@joker1007さんがモナドのgemを作っていることを以下のツイートで知りました↓」「用法が今後変わる可能性があると書いてありますね☺️」
今こそ monar の出番じゃないか?/週刊Railsウォッチ(20200407後編)RubyのTracePointでデバッグ、Rubyとモナド、Gitノウハウ集、リモートワークほか https://t.co/a8dlrBt3bX
— 甚六 (@jimlock) April 7, 2020
「実用というより、作ってみたかったから作ってみた感じかな」「そうかも」「これはflat_map
さえ実装すれば後はこのgemをinclude
するだけでモナドを使えるようになるヤツですね: この間話したeach
を実装すればRubyのEnumerableを使えるのと似たノリで(ウォッチ20200407)」「あ、そういうことですか😳」「とてもRuby的な実装だと思います😋」
- API:
Enumerable#collect_concat
(Ruby 2.7.0 リファレンスマニュアル) --flat_map
はエイリアス
⚓提案: end
レスなメソッド定義(Ruby Weeklyより)
# こういうふうに1行でメソッドを定義する新しい構文を入れたい
def: value(args) = expression
つっつきボイス:「@mameさんがRubyの新構文を提案していました」「エンドレスなメソッド定義?」「endlessはキーワードのend
を書かなくて済むという意味か!😳」「end
が省略可能なら省略したいというか😆」
「これはまたlinterが苦労しそう😆」「大胆な提案ですね」「Matzは"totally agree"ですって😆」「Rubyは元々、書かなくていいものは書かないようにしようという文化がありますし☺️」「そういえばreturn
とかもそうですね」「以下のdef value { @val }
みたいな書き方できるといいなと思うことはあります😆」
# original
def value; @val; end
# proposed - is that conflicting one?
def value { @val }
「こういう書き方は主に作り捨てのスクリプトとかで使うのかな☺️」「そんな雰囲気ですね」「def:
で始まると文末までがメソッド定義になると↓」「どことなくPythonっぽい🐍」「パーサーでやれるんなら、そんなに無理な仕様追加ではないかなと思います🤔」
def: fib(x) =
x < 2 ? x : fib(x-1) + fib(x-2)
p fib(10) #=> 55
「『どこまで本気の提案なんだろうか』というコメントもありますね😅」「まあRubyを書けば書くほど、中身が1行しかないメソッドを書くことって増えてきますよね、rubocopのABCサイズで怒られないようにとか👮🏼♀️」「ああたしかに!」「エディタ画面が1行メソッドで埋まるのもあるあるですし😆」
「それに従来のdef value; @val; end
みたいに;end
で書くやり方ってあんまり直感的じゃありませんし」「個人的にもRubyでセミコロンはない方が嬉しい😂」「より読みやすい構文が入るのはいいと思います😋」
その後早々にこの機能がRuby 3.0(表示は2.8-dev)にマージされました。
Endless method definition has been merged to Ruby 2.8.0-dev 👀https://t.co/eeBIZvx4Pq
— Koichi ITO (@koic) April 10, 2020
⚓Rubyで「モンティーホール問題」を納得する(Ruby Weeklyより)
つっつきボイス:「数学ネタはkazzさんにと思ったんですが今日はお休みでした」「あまりに直観に反しているので発表当時に数学者も続々間違えたことで有名な問題ですね」「いわゆるベイズ理論を学ぶと必ずと言っていいほど出てきますけど、納得するのが難しい😆」「まさに😆」「扉が100個になったらどうなる😆」「扉を増やす方がわかりやすいという説明をどっかで見たことあった気がします🤔」
「でモンティーホール問題をRubyでやってみたら、たしかに扉を変える方が確率が上がると↓😆」「😆」「こうやってモンテカルロ法的にシミュレーションしてみるのはひとつのアプローチですね😋」
# 同リポジトリより
ruby monty_hall.rb 1000
#=> {"stay"=>343, "switch"=>657}
⚓ruby.hを分割整理
家にいて暇なのでrubyから五千行削って六万行足すなどしていたhttps://t.co/EcmjTWNLDr
— 7594591200220899443 (@shyouhei) April 8, 2020
つっつきボイス:「5000行削って6万行足す🤣」「思わず笑っちゃいました🤣」「がっつり整理した感」「プルリクのこの図がわかりやすいです↓」
「この規模で大整理やったらこうなるでしょうね😆」「このグラフえらいことになってる😆」「maybe_unused.hとかサイコー🤣」「す、スゴすぎ🤣」「🤣」「Rubyはこんだけスゴいことになってるというのがよくわかる😆」「ある程度は自動化したんでしょうけど☺️」
RUBY_VERSION_MAJORが3になったら入れようかなって思ってたけど、なかなか3にならないので、しびれを切らして先に入れてしまったというやつですね。。。
— 7594591200220899443 (@shyouhei) April 8, 2020
こちらもその後マージされました。
Tireless work by Ruby core team 👀
Split ruby.h by shyouhei · Pull Request #2991 · ruby/rubyhttps://t.co/ZQBa2FkID8
— Yasuhiro Yoshida (@yoppuyoppu) April 1, 2020
⚓提案: Struct.new
にimmutable: true
オプションを追加(却下)
# #16769より
Post = Struct.new(:id, :name, immutable: true)
post = Post.new(1, "hello world")
post.id = 2 # NoMethodError (undefined method `id=' for #<struct Post id=1, name="hello world">)
つっつきボイス:「こちらは@k0kubunさんの提案です」「Struct.new
にimmutable: true
を付ける、なるほど😋」「今のStructは構造は変えられないけど値は変えられるか🤔」「Value Objectやるときにイミュータブルを保証したいことはあるのかも?」
「Structがイミュータブルかどうかをチェックする方法ってあるのかしら?」「@mameさんがコメントにも書いてますけど、freezeのメカニズムを流用すればfrozen?
でチェックできますね」「たしかに!」
# #16769より
Post = Struct.new(:id, :name, freeze: true)
post = Post.new(1, "hello world")
p post.frozen? #=> true
post.id = 2 #=> FrozenError
なおこちらはその後rejectされ、以下に議論が移りました。
基本的な振る舞いを変えるキーワード引数は好きでない。#16122の方が好ましいので続きはそちらで。
Matz
#16769のコメントより
⚓リモートワーク
⚓COVID-19がネットに及ぼす影響
イタリアのトラフィック上昇が突出してますが、全体にダウンロード速度の低下は持ちこたえてますね。公的機関のアナウンスがあるとトラフィックが増える傾向があるとのこと。
つっつきボイス:「BPS社内Slackに貼っていただいた記事です」「この記事を見たときに思ったんですけど、今リモートワーク関連特需でPCの納品が間に合ってなくて、各種部品の生産もゼロではないにしてもだいぶ落ちているので、この記事のようにインターネットのトラフィックもクラウドの利用も非常に増えているということは、もしかするとクラウド系の利用料金の上昇につながる可能性があるのではないかとちょっと思いました」「あぁ、それありそう!😳」「クラウド料金を現在の価格で試算しているとハマるかもしれないので、とりあえず料金上昇の可能性について警戒はしておこうかなと☺️」
「まあAWSあたりがいきなり爆上げするとは考えにくいですが😆、カツカツの料金で運営しているサービスなんかが上げてくる可能性はあるかなと: 上の記事はそのつもりで貼りました」「なるほど」「文字どおり自分らの業務に影響する話なので🧐」
⚓その他リモートワーク
つっつき後のツイートです。
Zoomのバーチャル背景がCore i5 4コア以上でないと使えないので,新しいMacを買うか研究室を掃除するか悩んだ末,ホワイトボードを運んできて物理背景にするという姑息な手段を選んでしまった
— Haruhiko Okumura (@h_okumura) April 14, 2020
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓AWS ECSやFargateでEFSファイルシステムをサポート
つっつきボイス:「これも社内Slackに貼っていただいた記事です」「うん、これはいいですね👍: AWSのECSがEFSをマウントできるようになったことで、ようやく共有ファイルシステムを触れるようになった😋」
参考: Amazon ECS(Docker コンテナを実行および管理)| AWS
参考: Amazon EFS(EC2 用フルマネージド型ファイルシステム)| AWS
「今までだと面倒だったんでしょうか?」「ECSはEC2の上で動いているからやってやれないことはないんでしょうけど、公式にインテグレーションされていなかったので自分で頑張って設定しないといけなかったと思います🧐」「どちらかというとFargateでEFSが使えるようになったというのが目玉っぽいかな🤔」
参考: 【全世界待望】Fargateから共有ファイルストレージのEFSが使えるようになりました! | Developers.IO
「Googleだとどのサービスが対応するんだろうという話にもなってましたね」「以下の記事↓にあるように、GKEのKubernetesには元々PersistentVolumeというものがありますが、GKEはKubernetesなのでそもそもECSとは違いますね😆」「そうでしたか😅」「AWSにおけるEFSに相当するのはGoogle Engineの永続ディスクでしょうね」「なるほど」
参考: 永続ディスクを使用した永続ボリューム | Kubernetes Engine のドキュメント | Google Cloud
参考: ストレージ オプション | Compute Engine ドキュメント | Google Cloud
⚓コンテナデザインパターン
つっつきボイス:「こちらは少し前の記事ですが、論文PDFを要約したものだそうです」「なるほど、GoogleがUSENIX↓に出した論文」「意外に短いですね」
「Googleが今まであったコンテナのパターンをまとめた感じで、2016年の論文だからDockerが流行り始めたぐらいの頃かな🤔」「そのぐらいですね」「まあGoogleはその前からKubernetesをゴリゴリ使ってたので、そういうコンテナパターンの走り的なものでしょうね☺️」
⚓JavaScript
⚓privateメソッドのテストは書かないものか
つっつきボイス:「はてブでバズってたt-wadaさんのブログで、サンプルコードがJSだったのでここに置きました」「ああこれ、privateなメソッドをテストしないかどうかはものによる気もしますけど😆」「基本的にはしないという感じでしょうか?」「privateなメソッドをpublicメソッド経由でテストするのは一見理にかなっているように見えなくもないんですけど、仕様変更によってパスしなくなる条件が出現する可能性は否定できないので、カバレッジの保証ができないという意味ではあんまりよくないとは思います🧐」「う〜む」「まあカバレッジにどこまで意味があるのかという話もありますけど😆」
「実際記事で言っているとおりだと思いますし、privateなメソッドは、落ちても人が死なないようなシステムであれば普通テストは不要だと思いますが、とてもクリティカルな機能についてはテストを書きたいと思うこともあるんじゃないかなという気はしますね☺️」「なるほど」「記事の『privateなメソッドのテストは内部の実装に対するテストになりがち』『構造的結合が強い』もそのとおりで、ただそれが必要になることがまったくないわけではないかなと自分は思います: まあWebシステムではほぼ要らないでしょう😆」「😆」
⚓ECMAScript 2020の新機能
つっつきボイス:「似たような記事はちょいちょい見かけますが😆」「ECMAScript 2020はもう確定した?」「今release candidateだったと思います」
参考: Release ES2020 Candidate · tc39/ecma262
「お、Promise.allSettled
でPromiseに対してまとめて処理できるようになってる: 速くなりそうなので速くなってるといいな😋」
// 同記事より
const p1 = new Promise((res, rej) => setTimeout(res, 1000));
const p2 = new Promise((res, rej) => setTimeout(rej, 1000));
Promise.allSettled([p1, p2]).then(data => console.log(data));
// [
// Object { status: "fulfilled", value: undefined},
// Object { status: "rejected", reason: undefined}
// ]
「Nullish Coalescing演算子なんてのも」「??
っていうのがそれですね」「なるほど、通常の||
だと空文字""
がfalseになるので"Anonymous"が返るけど、??
だと少し型厳密に""
はfalseじゃないという扱いになって""
が返ると」「次の数値0
も同じで、要は必ずtrue/falseで判定するのね」「??
なんて記号が突然出てきたらこっちの頭がクエスチョンになりそう😆」「😆」
// 同記事より
let person = {
profile: {
name: "",
age: 0
}
};
console.log(person.profile.name || "Anonymous"); // Anonymous
console.log(person.profile.age || 18); // 18
// 演算子でやる場合
console.log(person.profile.name ?? "Anonymous"); // ""
console.log(person.profile.age ?? 18); // 0
「Optional Chaining演算子?.
はRubyの&.
演算子と似たような動作😋」「Rubyのぼっち演算子でしたっけ」「その呼び方知らな〜い😆」
// 同記事より
let person = {};
console.log(person.profile.name ?? "Anonymous"); // person.profile is undefined
console.log(person?.profile?.name ?? "Anonymous");
console.log(person?.profile?.age ?? 18);
「そしてBigInt型」「およ、数値の後ろにn
を付けるのか!😳」「これも実際に見たらビックリしそう😆」「たぶん使わないかな〜☺️」
// 同記事より
const bigNum = 100000000000000000000000000000n;
console.log(bigNum * 2n); // 200000000000000000000000000000n
⚓CSS/HTML/フロントエンド/テスト/デザイン
⚓Chromeのデフォルトコントロール改善とSameSite Cookieの一時ロールバック
- 元記事: Google Developers Japan: Chrome のフォーム コントロールとフォーカスのアップデート
- 元記事: Chromium Blog: Temporarily rolling back SameSite Cookie Changes
つっつきボイス:「またChromeの見た目変えるのね😆」「😆」「こういうコントロールは結局ブラウザ依存ですし、デザインにこだわる人たちはみんなCSSで上書きしてるので影響ありませんし」「たしかに」「ブラウザのスタイルシートをそのまま使っている人にとっては影響ありますけど☺️」
「2本目はSameSite Cookieの適用を先送りにしたという話」「COVID-19の影響か😳」「なるほど、SameSite Chookieに対応していなくても生活のために重要な情報を発信しているサイトはあるので、GoogleがSameSite Cookie適用を強行すると影響が大きいと見て先送りにしたということなんでしょうね☺️」「これはたしかに」「SameSite Cookieに対応するリソースがないところもあるでしょうし」「Googleナイスプレイ❤️」
参考: 【一問一答】 Chrome の SameSite Cookie の変更とは? : Cookie への新たなアプローチ | DIGIDAY[日本版]
⚓その他デザイン
つっつきボイス:「画像や写真なしでレイアウトしているとBPSデザインチームがどよめいてたので」「英語圏だとそういうサイトがよくありますね☺️」「このレベルまで完成させるのは大変そう😅」「本当の意味でフロントエンドエンジニアとUXデザイナーを兼任しているような人たちはこういうのが作れますしお金も取れますね💪」「あとコピーライティングも」
⚓言語・ツール
⚓Unixコマンドの名前由来事典(StatusCode Weeklyより)
つっつきボイス:「DebianのWikiに載っているコマンド名由来事典だそうです」「めちゃ大量😆」「aptが何の略かとか初めて知りました😆」
「コマンド名は由来がいくつもあったりするものもありますけど😆」「古いコマンドとか特に😆」「dc
ってdesk-calculatorの略なのか〜」「bc
は知ってたけどdc
知らなかった😳」「cd
をタイポしてdc
動かしちゃうことがたまにあってですね😆」
「nethack-*
はnot a net-hacking toolだぞと😆」「あれ、これは...?」「rogue
ライクなゲーム😆」「あ〜CLIゲームの!」「そうそう、自分のマークが@
になるヤツ」
「tmux
とかあるぐらいなので割と新しそう」「メンテされてるのかしら?」「たぶん最近作ったんでしょう😆: インターネットミームまみれでもなくて割と真面目に書かれてるっぽい」「そんな感じですね」「まあトリビアですけど🤣」「年代別でも探せると嬉しいかも😋」「たしかに!」「最近はまともなコマンド名が増えましたけど、昔になるほど意味不明なコマンド名多いですし😆」
「昔何かで読んだんですが、Unix古参の人がcreat()
関数にe
を付けなかったのは失敗だったと悔やんでたような覚えがあります」「昔のlibcとかにもそういうのありますね、strなんちゃら
系で母音を削ったみたいな話😆」「😆」
⚓その他言語
これ、C言語にgotoがなければ話は簡単だったのですよ。「gotoなしでもプログラムは書ける」と単に返せばよい。実際にはC言語にgotoがあるものだから、どっちで返せばよいか、とっさにわからなかった
— 徳丸 浩 (@ockeghem) April 6, 2020
つっつきボイス:「COBOLはgotoありなのか」「はいありました😆」「Cのgotoは、gotoで書く方がシンプルになることもなくはないかも☺️」「深いところから脱出するときとか😆」「まあ自分はやらないけど😆」「今のC言語ならgotoで書いてもよしなに最適化してくれるかな?ラベルにgotoするのは割とアセンブラに近いものがありますし、Cにgotoがあるのは自分的にはそれほど違和感はないかな〜☺️」
⚓その他
⚓LPWAとBLE対応GPSトラッカー
参考: LPWA (LPWAN) とは? Low Power Wide Area - IoT プラットフォーム 株式会社ソラコム
参考: 「そもそもBLEって何?」Bluetoothの技術概要 | 芳和システムデザイン
つっつきボイス:「LPWAとBLE周りがわかってなかったので😅」「全部入りな感じ😆」
「こういうデバイスって昔から需要はあったんですけど、お値段がね...昔こういうデバイスを自転車に付けようとして探したんですけどなかなか手頃なものがなかったんですよ😅」「電波を発信するとどうしても電力使うから難しいですね💡」「電力は自分がバッテリー交換すればいいとしても、当時はやっぱりお値段というか運用費かかっちゃって😅」「ライセンス費用で値段下げにくいとかもあったんでしょうね」「そんな感じでした😢」「バイクにPHS仕込んで盗難防止にする記事を昔見ました」「そういう発想です☺️」
⚓紛失防止デバイス: TileとAirTag
「そういえば、手段は違いますけど最近Appleが似たようなサービスを始めようとしているニュースがありましたよね?」「というと?」「その前に説明しておくと、日本だとソフトバンクがやっているTileっていう探しものに便利な製品↓があって自分も使ってるんですけど」「え、これ知らなかった😅」
- サイト: 探し物を「音」で見つけるTile
「このキーホルダーみたいなTileはBLEと連携していて、スマホのアプリからTileを鳴らしたり、逆にTileのボタンを押してスマホを鳴らすこともできるんですよ😋」「へぇ〜!」「Tile自体はBluetoothの通信機能しかないので、本来だと遠くでなくしたら通信できないはずなんですけど、Tileがエラいのは、Tileアプリを入れている他人がたまたまTileの近くにいると、それを経由してTileの居場所をいわば共有することができるんですよ」「ははぁなるほど!」
「私、これに似た別の製品を昔持ってたんですけど、アプリのユーザーがあまりに少なすぎて役に立ちませんでした😆」「この手の製品で重要なのは圧倒的に売れて普及していることですね🧐」「おっしゃるとおりです😅」「自分が調べたときはTileが一番普及してたのでTileにしましたけど😋」「Tileを自分だけが使う分には問題ありませんね」「実際Tileの一番の使いみちは、自分の部屋の中で車の鍵とかをなくしたとき🗝」
「で、AppleもAirTagという製品を出してこのアプローチをやることにしたとこないだ発表してたんですよ」「なんと😳」「Appleが公式にこれをやったらライバルを全部つぶせますから😇」「あ〜そういうことですか😳」「ユーザーとしてはそういうサービスがある方がありがたいんですけど😂」「でもこれだとビットコインみたく他人のリソースを使って商売することになるので、そこは超えないといけないハードルだと思います🧐」「米国はそういうのにうるさいですし😆」「まあでも便利なサービスには違いないですね」「自分もTile使っててそう思いますし☺️」
参考: Apple紛失防止タグ「AirTag」はコイン電池で動作。交換も可能か
参考: Apple、高精度な紛失防止タグ「AirTag」の発売は4月以降に?
「とにかく、こういうアプローチはやれるからやっていいというものではありませんし☺️」「技術はあっても運用で揉めるパターン😅」「日本だと『見守り』とか『安心』をフィーチャーしないと😆」「海外だとだいたい軍事目的になりがちですね: 小隊の兵士全員に持たせて小隊の位置を把握するとか」
「まあ冒頭の製品みたいに自分で位置を検出する方が、他のユーザーに頼らなくて済むので当然いいんですけど」「でもお高いしエネルギーも使うし😅」
⚓かるた
つっつきボイス:「関係ありませんけど、今任天堂Switchがものすごい勢いで売れてる一方でボドゲも結構売れてるみたいですヨ😆」「ボドゲ😆」「それこそ人が集まらないとできないんじゃ?」「いえいえ、家から出られない子どもにゲームばかりさせるのは後ろめたいけど、ボドゲなら親としても言い訳が立つじゃないですか😆」「なるほどそっち😆」
「AIかるたはさすがに大人向けかな〜😆」「ゲームにすれば子どもはあっという間に覚えちゃいますから😆」「それもそう😆」「むしろ子どもほど、暇があれば意味わからなくても覚えちゃいますし☺️」「百人一首全部覚えるみたいな😆」「自分も暇だったときにギリシャ文字全部覚えたりしましたし🇬🇷」「私もギリシャ文字とキリル文字を並べて覚えました🇷🇺」「子どもならやれる😆」「後で大学とかでμ(ミュー)とか知ってる文字が出てくるとうれしかったり😋」「ψ(プサイ)とか😋」「ξ(クサイ)とか😋」
⚓番外
⚓感情操作
つっつきボイス:「知能をAIで云々はよくやりますけど、感情周りってあんまりフィーチャーされてなかったかなと思って」「どこまで本当なのかと思いますけど😆」「電気信号で恐怖とか快楽とかを味あわせたりできるってことですよね」「もう攻殻機動隊でやってたみたいな、パチンコやってる人に何かを打ち込んで操作してどうこうする世界😆」「😆」「うちの子が大人になる頃には実用化されるかしら」「もっと早いかもですよ😆」
参考: 電脳化 - Wikipedia
後編は以上です。
バックナンバー(2020年度第2四半期)
週刊Railsウォッチ(20200413前編)最近macOSでRailsが遅い、トランザクションでのreturnやbreakなどが非推奨化、Rails監視ツールリスト2020年度版ほか
- 20200407後編 RubyのTracePointでデバッグ、Rubyとモナド、Gitノウハウ集、リモートワークほか
- 20200406前編 Ruby 2.7.1セキュリティ修正、RailsビューHTMLにテンプレート名を出力、Action Mailboxテスト用フォーム改良ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。