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

週刊Railsウォッチ(20200414後編)Ruby 3で"endレス"メソッド定義構文が追加、ECMAScript 2020の新機能、紛失防止デバイスほか

こんにちは、hachi8833です。今日はMatzの誕生日と今朝Facebookが知らせてきました🎉。

それはそうとZoom背景がすっかり大喜利化してますね。

今朝はジブリのかぐや姫にしてみましたが、やっぱりこっちにしました↓。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内や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を作っていることを以下のツイートで知りました↓」「用法が今後変わる可能性があると書いてありますね☺️」

「実用というより、作ってみたかったから作ってみた感じかな」「そうかも」「これはflat_mapさえ実装すれば後はこのgemをincludeするだけでモナドを使えるようになるヤツですね: この間話したeachを実装すればRubyのEnumerableを使えるのと似たノリで(ウォッチ20200407)」「あ、そういうことですか😳」「とてもRuby的な実装だと思います😋」

提案: 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)にマージされました。

Rubyで「モンティーホール問題」を納得する(Ruby Weeklyより)

参考: モンティ・ホール問題 - Wikipedia


つっつきボイス:「数学ネタはkazzさんにと思ったんですが今日はお休みでした」「あまりに直観に反しているので発表当時に数学者も続々間違えたことで有名な問題ですね」「いわゆるベイズ理論を学ぶと必ずと言っていいほど出てきますけど、納得するのが難しい😆」「まさに😆」「扉が100個になったらどうなる😆」「扉を増やす方がわかりやすいという説明をどっかで見たことあった気がします🤔」

参考: ベイズの定理 - Wikipedia

「でモンティーホール問題をRubyでやってみたら、たしかに扉を変える方が確率が上がると↓😆」「😆」「こうやってモンテカルロ法的にシミュレーションしてみるのはひとつのアプローチですね😋」

# 同リポジトリより
ruby monty_hall.rb 1000
#=> {"stay"=>343, "switch"=>657}

参考: モンテカルロ法 - Wikipedia

ruby.hを分割整理


つっつきボイス:「5000行削って6万行足す🤣」「思わず笑っちゃいました🤣」「がっつり整理した感」「プルリクのこの図がわかりやすいです↓」


同PRより

「この規模で大整理やったらこうなるでしょうね😆」「このグラフえらいことになってる😆」「maybe_unused.hとかサイコー🤣」「す、スゴすぎ🤣」「🤣」「Rubyはこんだけスゴいことになってるというのがよくわかる😆」「ある程度は自動化したんでしょうけど☺️」

こちらもその後マージされました。

提案: Struct.newimmutable: 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.newimmutable: 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あたりがいきなり爆上げするとは考えにくいですが😆、カツカツの料金で運営しているサービスなんかが上げてくる可能性はあるかなと: 上の記事はそのつもりで貼りました」「なるほど」「文字どおり自分らの業務に影響する話なので🧐」

その他リモートワーク

つっつき後のツイートです。

クラウド/コンテナ/インフラ/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↓に出した論文」「意外に短いですね」


usenix.orgより

「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);

Rubyのぼっち演算子はRailsの`Object#try`より高速(翻訳)

「そしてBigInt型」「およ、数値の後ろにnを付けるのか!😳」「これも実際に見たらビックリしそう😆」「たぶん使わないかな〜☺️」

// 同記事より
const bigNum = 100000000000000000000000000000n;

console.log(bigNum * 2n); // 200000000000000000000000000000n

CSS/HTML/フロントエンド/テスト/デザイン

Chromeのデフォルトコントロール改善とSameSite Cookieの一時ロールバック


つっつきボイス:「また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ゲームの!」「そうそう、自分のマークが@になるヤツ」

参考: NetHack - Wikipedia

tmuxとかあるぐらいなので割と新しそう」「メンテされてるのかしら?」「たぶん最近作ったんでしょう😆: インターネットミームまみれでもなくて割と真面目に書かれてるっぽい」「そんな感じですね」「まあトリビアですけど🤣」「年代別でも探せると嬉しいかも😋」「たしかに!」「最近はまともなコマンド名が増えましたけど、昔になるほど意味不明なコマンド名多いですし😆」

「昔何かで読んだんですが、Unix古参の人がcreat()関数にeを付けなかったのは失敗だったと悔やんでたような覚えがあります」「昔のlibcとかにもそういうのありますね、strなんちゃら系で母音を削ったみたいな話😆」「😆」

参考: C言語では、createではなく、creat

その他言語

つっつきボイス:「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は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年度版ほか

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

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

Ruby Weekly

StatusCode Weekly


CONTACT

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