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

週刊Railsウォッチ(20201209後編)Ractorベンチマーク記事、Railsで複合主キーを使う、AWS re:Invent 2020ほか

こんにちは、hachi8833です。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇

Ruby

Ractorはどのぐらい速いか(Ruby Weeklyより)


つっつきボイス:「RubyやRailsのベンチマーク記事↓でおなじみのNoah GibbsさんがRactorのベンチも取ってみたそうです」「お〜」

Railsアプリに最適なAWS EC2インスタンスタイプとは(翻訳)

「初期セットアップのオーバーヘッドの表↓を見た感じでは、Ractorのその部分はスレッドより速そう」


同記事より

「次のベンチマークの表↓を見ると、Ractorはスレッドとほぼ同じぐらいで、標準偏差が他の項目より大きいのか」「ホントだ」


同記事より

「記事の末尾には、Ractorは2コアだと最大で16%速いこともあると書かれてる」「記事にもあるようにRactorはこれからの技術ですが、この結果を見ると少なくとも遅くはならなさそうですし、Ractorに本格的に取り組んでみるのはよさそうですね👍」

この記事は翻訳してみたいです。

Rubyの内部関数のバグを修正した話(Ruby Weeklyより)


つっつきボイス:「-p-iのようなオプションはRubyのワンライナーで使われることがありますね」「どうやらRubyのそういうオプションをshebangに書いたときに内部でパースの結果をチェックしていなかったらしい↓」

# (同記事のshebangを無効な内容に置き換えたもの: これでも動いてしまう)
#!/some/invalid/dir/ruby -pi.bak

BEGIN {
  puts "It is starting!"
}

$_.gsub!(/perl/, "ruby")


同記事より

# 同記事より
$ echo "I like perl, it is my favourite language." > temp.txt

$ ruby script.rb temp.txt
It is starting!

$ cat temp.txt
I like ruby, it is my favourite language.

$ cat temp.txt.bak
I like perl, it is my favourite language.

参考: シバン (Unix) - Wikipedia

なお、-i.bakは拡張子を変えてバックアップするオプション、-p$_の値を出力するオプションだそうです。

参考: Rubyの起動 (Ruby 2.7.0 リファレンスマニュアル)

「こんなバグよく見つけましたよね」「shebangで-pi.bakみたいな指定って普通やらないと思いますけどね...自分はたぶん今後も使わないかも」「記事の最後でRubyにプルリク投げてマージされたそうです↓」

このバグ修正はRuby 2.6や2.7にもバックポートされるそうです(#17117)。

Rubyのdefault gemとbundled gemの違い(RubyFlowより)


つっつきボイス:「Bundlerのdefault gemとbundled gemの違いについて解説した記事です」「gem化されてないライブラリも含めると3種類になるとかがよく話題になりますね」「@hsbtさんのこの発表は、そのあたりや今後の動きについて詳しく解説してくれているのでとても参考になります↓」

参考: bundled gem と default gem の違い - @znz blog

DB

Railsで複合主キーを導入する(Ruby Weeklyより)

参考: 複合主キーとは - IT用語辞典 e-Words


つっつきボイス:「Shopifyの記事です」「記事の前半ではShopifyがマルチテナントアーキテクチャであることなどを考慮して、通常の主キーに代えてshop_idorder_idによる複合主キーを使う方向に寄せることを考えたという話などをしていますね」「ふむふむ」

# 同記事より
class Order < ApplicationRecord
  self.primary_key = :id
  # 省略
end

「そして上のモデルに対応するのが以下のSQLテーブル定義↓ですが、お〜、これを見ると複合主キーはあくまでデータのローカリティ(局所性)を高める、つまりインデックス用にだけ使うけど、Railsのサロゲートキーは変えずに残しておくという考え方のようですね」「あ、そういうことですか!」「PRIMARY KEYにはshop_ididを指定しているけど、idのAUTO_INCREMENTは変えずに残しているあたりがそういう感じ」

-- 同記事より
CREATE TABLE `orders` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `shop_id` bigint(20) NOT NULL,
  -- (他のカラムは省略)
  PRIMARY KEY (`shop_id`,`id`),
  KEY `id` (`id`)
  -- (他のセカンダリキーは省略)
)

「ちなみにRailsには昔からcomposite_primary_keysという複合主キーの定番gemがあるんですけど↓、こちらは他のgemとの組み合わせなどによっては副作用が生じることもあるので、そういうときには他のgem向けにRailsのサロゲートキーが別途欲しくなることも考えられそう」

composite-primary-keys/composite_primary_keys - GitHub

「Shopifyのようにサロゲートキーと複合主キーを両方持つやり方はちょっと特殊に思えますが、マルチテナンシーなどの要件がうまくマッチすれば、複合主キーをこのように使うこともあるのかもしれませんね」「なるほど」「Shopifyのような実装は、一般的な複合主キーの実装ではあまり見かけない感じに思えますが、いろいろ興味深いです👍」


「ところで、記事の中でlhm(large hadron migrator)という粒子加速器みたいな名前のツールが紹介されていました↓」「見た感じでは、Shopifyが作った独自のデータマイグレーションツールのようで、複合主キーとは直接関係なさそうかな」「Percona Toolkitを使った似たようなマイグレーションツールがあったかも」

shopify/lhm - GitHub

jbravata/percona_migrator - GitHub

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

AWS re:Invent 2020での各種発表(Publickeyより)

aws/eks-distro - GitHub


つっつきボイス:「そのうちまとめ記事が出そうですが一応」「今回のAWS re:Inventも、AWS LambdaがDockerコンテナをサポートしたとかいろいろ発表されていますね: この見出しの他には、AWS Lambdaの課金が100ミリ秒単位だったのが1ミリ秒単位に変わったという発表もありました↓」「あ、そうでしたか」「1ミリ秒課金になったことで、重いDockerコンテナを使うよりもAWSの既存のランタイムを使う方がよい局面も出てくるかもしれませんね(どこまでやるかにもよりますが)」

参考: [アップデート] Lambdaの実行時間の課金単位が1ミリ秒に短縮されました #reinvent | Developers.IO

「見出し最後のEC2 Macインスタンスは力技で面白かった」「社内Slackでbabaさんが『Mac miniを物理的にずらっと並べてるのか』ってウケてたヤツですね↓」「AWSのアナウンスにも、仮想化したmacOSではなくてMac miniコンピュータを使っていると書かれていますね」

「ただEC2 Macインスタンスはアナウンスにも書かれているようにminimum host allocation durationが24時間なので、ビルドのときだけ立ち上げるような使い方だとコストがかさみそうなのは今後改良して欲しいかな」「出先でPCとMacを両方使いたいけど2台も持ち運んでいられないような人にはありがたいかも」「将来M1のインスタンスも使えるようになったらまた違ってきそうですね」「これでリモート開発やリモートデバッグができるようになって、Macを買わなくてもiPhoneアプリを開発できるようになったらよさそう(Appleのライセンスでそこまで許されるかどうかにもよるでしょうけど)」

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

2021年度のWebデザイントレンド


つっつきボイス:「来年のWebデザイントレンドか」「以下に日本語のまとめ記事もあります↓」

参考: ついに出た!2021年注目のWebデザイン人気トレンド9個まとめ - PhotoshopVIP

「Neumorphismは、新しいSkeumorphismということらしい」「スキュー?」「だいぶ昔のiPhoneのアイコンなどで使われていた実物っぽいデザインがたしかSkeumorphismと呼ばれていましたね」「Neumorphismの影の付き方とかがそれっぽいかも」

以下はつっつき後に見つけたツイートです。

「Abstract Art Compositionは、20世紀前半のモンドリアンの絵みたいな感じなのかな」「こういう感じのデザインはSVGで軽量に作りやすそうですし、CSSのレンダリングやアニメーションと相性がよさそうなので、それもあって流行りつつあるのかなと思いました」

参考: Broadway Boogie Woogie - Wikipedia

「主に海外の流行のようなので、ものによっては日本に入ってくるまで時間差があるかもしれませんが、こういう記事を一度眺めておくと、今後デザイナーに「XXのような感じでお願いします」と大枠の指定を出したりするときに役立つと思います👍」

その他

Big SurとRuby


つっつきボイス:「ついに@jnchitoさんも開発環境をBig Surに移行」「そういえばHomebrewもBig Surで動くようになったらしいので↓、MySQLを複数入れたりもできるでしょうね」

参考: 「macOS Big Sur」に対応、M1での動作も可能になった「Homebrew 2.6.0」 - 窓の杜

「昔はMySQLやぽすぐれをHomebrewで複数バージョンインストールして管理してましたけど、今ならもうDockerでやりたい」「そうですよね」「もちろんローカル環境でたくさんのプロジェクトを扱うのでなければ今までどおりHomebrewなどでインストールすればいいと思いますけど、自分の場合はいろんなプロジェクトを扱っているので、昔みたいにMySQLやPostgreSQLやRedisのバージョンが3つずつぐらい同居すると、メモリを食いすぎるので手動で起動したりとかいろいろつらい」「ポート番号も使い分けないといけないのもつらいです😢」「Dockerはやっぱりありがたい」

なお、Docker Desktop for MacもBig Surに対応したそうです↓。

参考: Docker for Mac Stable release notes | Docker Documentation


後編は以上です。

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

週刊Railsウォッチ(20201124)strict loading violationの振る舞いを変更可能に、Railsモデルのアンチパターン、quine-relayとさまざまなクワインほか

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

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

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Publickey

publickey_banner_captured


CONTACT

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