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

週刊Railsウォッチ(20210113後編)Ruby 3.0 Ractor解説記事、Vercelホスティングサービス、教育用OS xv6ほか

こんにちは、hachi8833です。

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

TechRachoではRubyやRailsの最新情報などの記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチ

Ruby

@_ko1さんのRuby 3.0 Ractor解説


つっつきボイス:「こちらの記事も、昨年のRuby 3.0リリースイベント↓の中で@_ko1さんが『つい先ほど公開しました』と話していたことで知りました」「お、読んだ気がすると思ったら年越し前に同じくこのイベントで知ったので休みの間に読んじゃいました」「そうか、もう公開から2週間経ったんですね」「Ractorはいいと思います!」「とりあえずRactorの概要を知っておくことが大事ですね」

参考: Ruby 3.0 release event - connpass -- 終了

Ruby 3のFiber Schedulerを作った


つっつきボイス:「中国語が見える」「中国の方が書いたらしいですが、この記事は英語ですね」

後で「代码混音师」をGoogle翻訳にかけると「コードミキサー」と出たので、ブログドメイン名のcodemixer.comそのままでした。

「Ruby 3でFiber Schedulerをカスタマイズできるようになったので(ウォッチ20200609)、やってみたようです」「お〜、眺めた限りですが真面目にスケジューラを作ってるように見える」「スゴそう」

「記事の中でio_uringepollkqueueのようなLinuxの新しいAPIをチェックしている」「そういえばちょっと前にio_uringなどの話題になりましたね(ウォッチ20200804)」

参考: ソケットAPIが遅すぎる?新たなio_uringを試す!. 新しいAPIが作られるたびに、私たちは、古いAPIを置き換えるだけで高速化という… | by FUJITA Tomonori | nttlabs | Dec, 2020 | Medium
参考: Man page of EPOLL
参考: kqueue|kamezawa.hiroyuki|note


後で気が付きましたが、同記事末尾で著者がFiberをRactor-safeにするプルリクを投げたと書かれていて、見てみると既にマージされていました↓。

Fiber#schedulerは今のところ英語版のRubyドキュメントにのみ載っているようです↓。るりまサーチではまだ見つかりません。

Ruby 3.0.0 リリースノートでFiber Schedulerについて以下の動画を紹介していたのでここにも貼ります。

Rubyスレッドリークの隠れたコスト


つっつきボイス:「コードはよくあるApache Kafkaのconsumerのようですね」

参考: 開発者のための Apache Kafka サービス | Heroku
参考: Apache KafkaのProducer/Broker/Consumerのしくみと設定一覧 - Qiita

元記事中で使っているKarafkaはRuby向けのKafkaフレームワークです↓。

karafka/karafka - GitHub

# 同記事より: 問題が起きたコードの簡略版
class EventsConsumer < Karafka::BaseConsumer
  def initialize(...)
    super
    @processor = Processor.new
  end

  def consume
    @processor.call(params_batch.payloads)
  end
end

「上が時間とともにメモリリークしてパフォーマンスが落ちていったので、とりあえず下のように解決してしのいだそうです」「どうやら、上のProcessor.newがconsumerの数だけProcessorを増やしてしまっていたのを、Processor.instanceのようにシングルトンに変えて同じキューが使われるようにしたということのようですね」「マルチスレッド系のバグはコードを見るときに疑ってかからないと発見が難しいですね」

# 同記事より: 解決版
class Processor
  include Singleton

  # 略
end

class EventsConsumer < Karafka::BaseConsumer
  def initialize(...)
    super
    @processor = Processor.instance
  end

  # 略
end

「記事の最後は、何も対策しなかった場合にどうパフォーマンスが落ちるかをちょっと比較してみたそうです」「グラフは上に行くほど低い...のね」「お〜、JRuby以外はstaleしたスレッドが増えるとパフォーマンスが落ちてる」「CRubyはRuby 2.7.2より3.0.0-preview2の方が落ち方が少し増えてるのか」


同記事より

念のため元記事末尾の文を引用します。

Ruby 3.0(訳注: preview版です)の方がRuby 2.7.2より遅かったことに興味を惹かれたので、その理由について近々調べてみようかと思います。
注: 自分はこれがJITのベストなユースケースとは信じていませんので、どうか上のグラフを見てパフォーマンスについて騒ぎ立てないでいただきたく思います。
同記事より大意

その他Ruby


つっつきボイス:「へ〜、Ruby 2.7以降ではIRB.confでUSE_READLINEを指定すると、irbでライブラリのreadlineが使われてしまって、irb独自のオートハイライトやオートインデントが効かなくなるのか」

参考: それ行けLinux~readline~

2.7以降のirbで使われているのが以下のrelineというライブラリです(ウォッチ20191001)。

ruby/reline - GitHub

「ややこしいですけど、このオプションをtrueにするとrelineの機能がirbで使えなくなるということでしょうか?」「はい、そういうことですね」「記事にもありますけど、以前はreadline付きでRubyをビルドするのに苦労することもあったりしたようですね」「今ならそういう苦労なしにRuby 3.0をインストールできるのに昔は大変だったんだな...」

後でRuby 3.0.0でやってみました↓。

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

AWS CloudShell

参考: 待望の新サービス AWS CloudShell がリリースされました! #reinvent | Developers.IO


つっつきボイス:「BPSの社内Slackに貼っていただいた記事です」「AWS CloudShellは、AWSが提供するコンテナのLinuxシェル環境にログインできるもので、ホームディレクトリに容量制限はあるものの、CloudShellを使うとAWS CLIなどが使えるシェルにアクセスできます: 言い換えると、自分の手元ではEC2インスタンスを1個も立ち上げずに、AWS CLIをコマンドラインで使うためだけのコンソールを使えるようにするサービスですね」「なるほど、ちょっと想像が付きました」「それをブラウザでできるんですね」「はい、ブラウザ以外でもできるかどうかはまだよくわかりませんが」

参考: AWS コマンドラインインターフェイス(CLI: AWSサービスを管理する統合ツール)| AWS

「あとお値段の方も、リージョン1つにつき最大10コンカレントシェルまで無料とあるので、普通の使い方をしていれば基本的に無料」「ありがたい!」「その代わりホームディレクトリは1GBまでという容量制限があるので、ここにソースコードを置いてあれこれ変えるようなユースケースはあまり想定されていないと思います」

「AWS CloudShellでTerraformを実行するぐらいはできるかな?: デフォルトでは入ってなさそうですが、npm(Nodejsのパッケージマネージャ)やpip(Pythonのパッケージ管理ソフトウェア)がインストール済みとあるからできるかも」

参考: Terraformとは?基本知識とTerraformのメリット4つを紹介 | テックマガジン from FEnetインフラ

hashicorp/terraform - GitHub

参考: pip - Wikipedia
参考: npm (パッケージ管理ツール) - Wikipedia

後で探すと、既にやってみた人の記事を見つけました↓。

参考: AWS CloudShell で Terraform を実行してみた! - ForgeVision Engineer Blog

「ただ、AWS CloudShellはCloudWatch Logsなどにログが残らない残らないという話も見たんですよ」「あ〜、そうなんですか」「少なくとも今はなさそうなので、ログを残さないといけないというポリシーがある組織やプロジェクトだと合わない可能性がありますね」

「でもAWS CLIが使えるシェルが手軽に欲しいということは割とありますし、値段も安いので、トラブルシューティングのときとかにCloudShellを使うのは悪くないと自分は思いました」「そうですね」「さしあたってはAWS CloudShellというものがある、という存在を知っておけば後々いろんな使いみちがあるでしょうね👍」

JavaScript

Vercel: Next.jsの開発元が立ち上げたホスティングサービス

Next.jsの他にVueでお馴染みのNuxt.jsやAngularなども公式にサポートしているそうです↓。

参考: Deploying a Static Nuxt.js App with Vercel - Vercel Guides


つっつきボイス:「お、今日のWebチームミーティングのチーム内発表に登場したVercelですね」「はい、ウォッチで扱ったことがありそうでありませんでした」

「発表によればVercelはNext.jsの開発元が作った、フロントエンド向けのHeroku的なホスティングサービスということでしたが、後発だけあって使い勝手などがかなりよくできている印象でしたね」「そうですね、stagingとproductionが最初から使えるとか、アカウントもGitHubでもGitLabでもBitBucketでも使えるとか」

元々ZEITという社名だったのがVercelに社名変更したそうです↓。

参考: Vercel (日本語訳)

「VercelにはServerless functionsという機能もあって、pages/apiディレクトリにバックエンドの処理も置けるそうですが、サーバーサイド側がどこまで使えるかが知りたいところですね」「商用で使う前に、自社内用のツールをVercelにホスティングしていろいろ試してみてもいいなと思いました」

「お値段も、カスタムドメイン、Continuous Deplyment(CD)、CDN(Contents Delivery Network)、API制限なし、Serverless Functionsまで使えて無料なんですよね」「お〜!」「メンバーが10人を超えたら有料なのか」「自分の趣味プログラムをホスティングするなら事実上無料ですね」

「お、もうひとつありがたいことが書かれていますね: 登録にクレジットカードが不要だそうです」「へ〜!」「自分は大学でWeb開発を教えているんですけど、学生に使ってもらうときにとても大事なポイントなんですよ: クレジットカードを持ってる大人は関係ありませんけど、学生がクレジットカードを持っているとは限らないので使ってもらいにくい」「なるほど!」

「GoogleのGCPやAWSだと、1円も課金しないで使うとしてもクレジットカード登録が必要なんですよ」「クレカ登録が不要なら小学生でも使えますね」

注: Vercelのサービス規約上未成年でも利用できるかについては確認していません。ご利用の際はクレカの有無だけでなく各サービスの利用規約についても各自ご確認をお願いします。

「あとはVercelが今後もサービスを継続できるかどうかでしょうね」「発表のときもVercelが資金調達したことが話題になってましたね(本項冒頭のツイート)」「つい最近なんですね」

「Next.js自体も@mizchiさんなどが推していてReactのフルスタックフレームワークとして現時点で出来がいい方らしいので、VercelはそのNext.jsの開発元が公式に提供しているホスティングサービスということで、筋はよさそうに思えますね」

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

@kazuhoさんが解説するHTTP/3


つっつきボイス:「お、HTTP/3の話」「H2Oの作者であるFastlyの@kazuhoさんによるHTTP/3の講演をPublicKeyががっつり解説記事にしていました」

参考: H2O (Webサーバ) - Wikipedia

「HTTP/2の登場が2015年とあるから、もう5年も経ったのか」「2016年にHTTP/2対応したのを思い出しました」「優先順位をExtensible prioritiesで設定できるようになるのか: 今までネットワークレイヤでやってた制御がここに上がってきた感じ」

「HTTP/2の時点で、1個のTCPコネクションの中でマルチストリームができるようになりましたけど、HTTP/3ではその優先順位をこれで制御するんだろうな」「通信を多重化するとたいていQoS(Quality of Service)をやりたくなりますよね」

参考: Quality of Service - Wikipedia

「HTTP/3のEarly Hintsは、そういえばRailsもHTTP/2のときに対応してましたね↓」「Changelogで見た覚えあります」(以下レイテンシやパケットロスの話題など延々)

【速報】Rails 5.2.0正式リリース!Active Storage、Redis Cache Store、HTTP/2 Early Hintほか

「HTTP/3も実用の段階が近づきつつあるんですね」「この辺の技術を有効に使い尽くそうとすると、たぶんRailsのようなモデルよりも最近のフロントエンドのようなモデルにしないとなかなかやりづらいだろうなと感じるところはあります」「そうなんですね」「ゲーム業界のように速度を果てしなく追求する分野だと、RailsのようにサーバーでHTMLをレンダリングして返すモデルは上限に突き当たるのが早そうな予感がします」

「ソシャゲでRails使って応答速度を追求するのはしなさそうですね」「もちろん、ゲーム業界でも極端な応答速度を求められない機能ならRailsや他のフレームワークで作るというのはあるでしょうが、そうするとサーバーサイドが複数言語のハイブリッド構成になって複雑化してしまうんですよ: それなら最初から全部JavaScriptやGolangを使って書くことで言語はひとつにしたい、というのが昨今のRailsやめたい勢の意見のひとつかなと感じています」

「あと、AWSのALBがHTTP/3にどう対応するかも気になるところですね」

参考: Application Load Balancer とは - Elastic Load Balancing

BCP56

「以下はHTTP/3と直接関係ありませんが、@kazuhoさんのツイートを拾いました↓」「このBCP56というドキュメントはなかなか便利ですね👍」

「いわゆるRFCの仕様はHTTPサーバーを実装する側向けのドキュメントですが、BCP56はHTTPを利用してコンテンツやアプリケーションを作る側にとってのベストプラクティス的なことが盛り込まれていて、Webアプリの本来あるべき姿が示されているのはありがたいです」「お〜」「@kazuhoさんも続きでまさに同じことをおっしゃってますね↓」「こういうドキュメントがあると設計の議論がしやすくなりそう」

「BCP56はかなり新しいドキュメントみたい」「ドキュメントの日付を見ると2021年01/07...って今日?」「上のツイートを見つけたのが昨日なのに?」「ドラフトなので更新の日付でしょうね」「あ、更新中ですか」

「このBCP56和訳しませんか?」「翻訳してる間に本家がガンガン更新されそうな予感です😆」「でしょうね」「BCP56の一部をピックアップして解説する記事はあってもいいでしょうね」

言語/ツール/OS/CPU

xv6: 教育用のミニUnix実行系

mit-pdos/xv6-public - GitHub

参考: xv6 - Wikipedia


つっつきボイス:「このxv6は、Railsチュートリアルでお馴染みのYassLabの安川さん↓に教えていただいたもので、コードベースがとても小さいので教育用のUnix系OSとして米国の大学でとてもよく使われているんだそうです」「へ〜!」

「昔は教育用といえばMINIXが使われてましたけど、あれも巨大化しちゃいましたよね」「昔はMINIXのソースコードをみんなで読んで勉強してましたけど、その現代版という感じ」「xv6のリポジトリを見てみたんですが、OSと思えないぐらいコードが少なくて、ちゃんと最小限のシェルまであるみたいです」「シェルがないと使えませんから😆」

参考: MINIX - Wikipedia

「そういえばこの間のRuby 3.0.0リリースイベントが終わった後の雑談で安川さんがこのあたりの話をしてたような覚えがうっすらあります」「そうでしたか!私は力尽きて雑談まで見られなかった...」

「xv6もリポジトリが14 years agoとかあるので結構歴史ある感じ」「POSIXに準拠してるみたい」「MINIXは1980年代だからさらに古いですけどね」

「xv6、コマンドやシェルを除くとたしかにとても小さそう」「これなら印刷して読める分量ですね」「たしかに」

「お、xv6のRISC-V版の方がディレクトリが整理されているっぽい↓」「更新もされてますね」「FreeBSDやNetBSDなどのコードも拝借してると書かれてる」

mit-pdos/xv6-riscv - GitHub

『詳解UNIXプログラミング』

「以下は直接関係ありませんが貼ってみました」「お〜なつかしい、と思ったけど第3版は自分が読んだ頃と表紙が違う気がする...」「もっと色少なかったですよね」

「自分が読んだのはこれだ↓」「そうそう、これですよ」「どちらも筆でざっくり描いたようなところが共通点かも」

「他にもUnixプログラミングの定番の名著はいくつかあるんですけど、タイトルが似通っているものが多くて今うまく見つけられない...」「探しにくいですよね」「この種の本は現代の人が学ぶときに環境設定などで効率はよくない面はあるけど、やはり名著」

「システムコールは増えることはあっても減ることはないので、こういう本に書かれているものは今でも動くのがいいですよね」「そうそう」「ユーザーアプリケーションから見て下のレイヤにあるシステムコールでどんなことができるのかを知っておくと、たとえばアプリでこれをやろうとするとどうやってもボトルネックに引っかかる、みたいなことがわかってくるので、よいと思います」

「シェルのコマンドをつなぐときも、システムコールの種類や特性を知ったうえでやるといいですよね」「その一方で、さっきのepollみたいな新しいシステムコールに気づかないまま古いものを使ってしまうこともあったりしそうですけど😆」「Linuxは今でもシステムコール増えてますよね」

「Rubyのアップデートでも、新しいシステムコールが出たので使いました、ということがありますよ」「へ〜」「RubyのリリースノートやRailsウォッチを追っていると、そういう新しいシステムコールを知る機会にもなりますね」


後編は以上です。

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

週刊Railsウォッチ(20210112前編)Active Recordの範囲指定バリデーション改善、soleとfind_sole_byメソッド、AlgoliaとRailsほか

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

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

Publickey

publickey_banner_captured


CONTACT

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