- 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 の Ractor を自慢したい - クックパッド開発者ブログ](https://t.co/H552uY0NkT)
— _ko1 (@_ko1) December 26, 2020
つっつきボイス:「こちらの記事も、昨年の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_uring
やepoll
やkqueue
のような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ドキュメント英語版:
Fiber#scheduler
-- Class: Fiber (Ruby 3.0.0)
Ruby 3.0.0 リリースノートでFiber Schedulerについて以下の動画を紹介していたのでここにも貼ります。
⚓ Rubyスレッドリークの隠れたコスト
つっつきボイス:「コードはよくあるApache Kafkaのconsumerのようですね」
参考: 開発者のための Apache Kafka サービス | Heroku
参考: Apache KafkaのProducer/Broker/Consumerのしくみと設定一覧 - Qiita
元記事中で使っているKarafkaはRuby向けのKafkaフレームワークです↓。
# 同記事より: 問題が起きたコードの簡略版
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独自のオートハイライトやオートインデントが効かなくなるのか」
2.7以降のirbで使われているのが以下のrelineというライブラリです(ウォッチ20191001)。
「ややこしいですけど、このオプションを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インフラ
参考: pip - Wikipedia
参考: npm (パッケージ管理ツール) - Wikipedia
後で探すと、既にやってみた人の記事を見つけました↓。
参考: AWS CloudShell で Terraform を実行してみた! - ForgeVision Engineer Blog
「ただ、AWS CloudShellはCloudWatch Logsなどにログが残らない残らないという話も見たんですよ」「あ〜、そうなんですか」「少なくとも今はなさそうなので、ログを残さないといけないというポリシーがある組織やプロジェクトだと合わない可能性がありますね」
「でもAWS CLIが使えるシェルが手軽に欲しいということは割とありますし、値段も安いので、トラブルシューティングのときとかにCloudShellを使うのは悪くないと自分は思いました」「そうですね」「さしあたってはAWS CloudShellというものがある、という存在を知っておけば後々いろんな使いみちがあるでしょうね👍」
⚓JavaScript
⚓ Vercel: Next.jsの開発元が立ち上げたホスティングサービス
- サイト: Develop. Preview. Ship. For the best frontend teams – Vercel
- サイト: Next.js by Vercel - The React Framework
Today we announce $40M in new funding to help everyone build the next web.https://t.co/Sa0uFgBkez
— Vercel (@vercel) December 16, 2020
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 (日本語訳)
🆕Next.jsの開発元でもあるZEITはこのたび社名変更しVercelになりました。
🎉2100万ドルの資金調達も発表。
👨🏻💻私はご縁があり2月に開発者としてジョインしました。🤔「○○は今後どうなるの?」というご質問につきましては、こちらのNotionドキュメントをご一読ください!→ https://t.co/eCwc23gIzo https://t.co/2bXLzGzEda
— Shu Uesugi (@chibicode) April 21, 2020
「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はどうやってWebを加速するか? TCP、TLS、HTTP/2の問題とHTTP/3での解決策~Fastly奥氏が解説(前編) - Publickey(Publickeyより)
- 元記事: HTTP/3はどうやってWebを加速するか? TCP、TLS、HTTP/2の問題とHTTP/3での解決策~Fastly奥氏が解説(後編) - Publickey
つっつきボイス:「お、HTTP/3の話」「H2Oの作者であるFastlyの@kazuhoさんによるHTTP/3の講演をPublicKeyががっつり解説記事にしていました」
「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というドキュメントはなかなか便利ですね👍」
HTTP を使うサーバクライアントアプリ作ってる人が、HTTP 的にどうするのが正しいのかな、と迷った時、見るべきドキュメントは BCP56bis かな、という話をした。HTTP の仕様ではなく、どのように使うべきかを説明した文書 (BCP56) の第2版草稿です https://t.co/InBEresgsD
— Kazuho Oku (@kazuho) January 5, 2021
「いわゆるRFCの仕様はHTTPサーバーを実装する側向けのドキュメントですが、BCP56はHTTPを利用してコンテンツやアプリケーションを作る側にとってのベストプラクティス的なことが盛り込まれていて、Webアプリの本来あるべき姿が示されているのはありがたいです」「お〜」「@kazuhoさんも続きでまさに同じことをおっしゃってますね↓」「こういうドキュメントがあると設計の議論がしやすくなりそう」
RFC 7231 とかプロトコル仕様は、HTTP を実装する技術者向けの情報が多いので、HTTP を利用する技術者にとってはノイズが多いのです
— Kazuho Oku (@kazuho) January 5, 2021
「BCP56はかなり新しいドキュメントみたい」「ドキュメントの日付を見ると2021年01/07...って今日?」「上のツイートを見つけたのが昨日なのに?」「ドラフトなので更新の日付でしょうね」「あ、更新中ですか」
「このBCP56和訳しませんか?」「翻訳してる間に本家がガンガン更新されそうな予感です😆」「でしょうね」「BCP56の一部をピックアップして解説する記事はあってもいいでしょうね」
⚓言語/ツール/OS/CPU
⚓ xv6: 教育用のミニUnix実行系
参考: xv6 - Wikipedia
つっつきボイス:「このxv6は、Railsチュートリアルでお馴染みのYassLabの安川さん↓に教えていただいたもので、コードベースがとても小さいので教育用のUnix系OSとして米国の大学でとてもよく使われているんだそうです」「へ〜!」
パートナー法人の1社として携わっている https://t.co/bX1kMeYsyH 開発の2020年ふりかえり記事を出しました!📜✨ https://t.co/PhGmdoSQTZ
2020年1月〜12月にかけて出してきた各種 Pull Request と、その背景について動画で説明しています 🗣✨
ソースコード付きの開発事例に興味ある方はぜひ! 😉 pic.twitter.com/bbBCGhxTxq
— YassLab 株式会社 🏝 (@YassLab) December 6, 2020
「昔は教育用といえばMINIXが使われてましたけど、あれも巨大化しちゃいましたよね」「昔はMINIXのソースコードをみんなで読んで勉強してましたけど、その現代版という感じ」「xv6のリポジトリを見てみたんですが、OSと思えないぐらいコードが少なくて、ちゃんと最小限のシェルまであるみたいです」「シェルがないと使えませんから😆」
「そういえばこの間のRuby 3.0.0リリースイベントが終わった後の雑談で安川さんがこのあたりの話をしてたような覚えがうっすらあります」「そうでしたか!私は力尽きて雑談まで見られなかった...」
「xv6もリポジトリが14 years agoとかあるので結構歴史ある感じ」「POSIXに準拠してるみたい」「MINIXは1980年代だからさらに古いですけどね」
「xv6、コマンドやシェルを除くとたしかにとても小さそう」「これなら印刷して読める分量ですね」「たしかに」
「お、xv6のRISC-V版の方がディレクトリが整理されているっぽい↓」「更新もされてますね」「FreeBSDやNetBSDなどのコードも拝借してると書かれてる」
⚓ 『詳解UNIXプログラミング』
「以下は直接関係ありませんが貼ってみました」「お〜なつかしい、と思ったけど第3版は自分が読んだ頃と表紙が違う気がする...」「もっと色少なかったですよね」
昔この本を何度も繰り返し読んでUnixのいろんなシステムコールの振る舞いとかを理解しようとしてたのが、いまだにめちゃくちゃ役に立ってる。多分このカテゴリの決定版みたいな本じゃないかなぁ。 https://t.co/EdlqTMNkEi
— Rui Ueyama (@rui314) December 22, 2020
「自分が読んだのはこれだ↓」「そうそう、これですよ」「どちらも筆でざっくり描いたようなところが共通点かも」
「他にもUnixプログラミングの定番の名著はいくつかあるんですけど、タイトルが似通っているものが多くて今うまく見つけられない...」「探しにくいですよね」「この種の本は現代の人が学ぶときに環境設定などで効率はよくない面はあるけど、やはり名著」
「システムコールは増えることはあっても減ることはないので、こういう本に書かれているものは今でも動くのがいいですよね」「そうそう」「ユーザーアプリケーションから見て下のレイヤにあるシステムコールでどんなことができるのかを知っておくと、たとえばアプリでこれをやろうとするとどうやってもボトルネックに引っかかる、みたいなことがわかってくるので、よいと思います」
「シェルのコマンドをつなぐときも、システムコールの種類や特性を知ったうえでやるといいですよね」「その一方で、さっきのepoll
みたいな新しいシステムコールに気づかないまま古いものを使ってしまうこともあったりしそうですけど😆」「Linuxは今でもシステムコール増えてますよね」
「Rubyのアップデートでも、新しいシステムコールが出たので使いました、ということがありますよ」「へ〜」「RubyのリリースノートやRailsウォッチを追っていると、そういう新しいシステムコールを知る機会にもなりますね」
後編は以上です。
バックナンバー(2021年度第1四半期)
週刊Railsウォッチ(20210112前編)Active Recordの範囲指定バリデーション改善、soleとfind_sole_byメソッド、AlgoliaとRailsほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。