- Ruby / Rails関連
週刊Railsウォッチ: Prismの歴史と現況を振り返る、Steepの"narrowing"実装の内部ドキュメントほか(20240426後編)
こんにちは、hachi8833です。
- お知らせ: 来週および再来週の週刊Railsウォッチはお休みをいただき、通常記事を公開します。
🔗Ruby
🔗 Steepの"narrowing"実装の内部ドキュメントが公開
つっつきボイス:「ruby-jp Slackで知りました」「Rubyの静的型チェッカーSteepの内部挙動に関するドキュメントをsoutaroさん自ら書いたんですね、これはじっくり読んでみたい👍」「ユーザー向けのNarrowing guideはまだ作られていませんが、きっとこれを元に今後作るんでしょうね」
「上と前後してsoutaroさんの転職記事も出ていました↓」「お〜フルタイムRubyコミッターとして仕事するのか、すごい🎉」「こうやって業務としてRubyコミッター活動に専念できる場がRubyの世界にあるのがいいですね👍」
4月からタイミーで仕事をしています。https://t.co/FixsAnowXX
— Soutaro Matsumoto (@soutaro) April 18, 2024
🔗 Rubyの抽象メソッドでNotImplementedErrorを使わないこと(Ruby Weeklyより)
つっつきボイス:「以下のような抽象クラスで誤ってNotImplementedError
が使われがちと記事にありました」
# 同記事より
class BaseSetting
def to_html
raise NotImplementedError
end
end
class Text < BaseSetting
def to_html
"<input type='text'>"
end
end
class Number < BaseSetting
# Forgot to implement to_html
end
TextSetting.new.to_html #=> "<input type='text'>"
NumberSetting.new.to_html #=> 💥 NotImplementedError
「NotImplementedError
というエラーの名前からして、いかにも抽象クラスを継承したときにメソッド実装を促す使い方をしそうに見えるけど、実はその機能がプラットフォームやOSに実装されていないことを示すためのエラーなのでそもそも場違いということか」「記事によるとPythonにもNotImplementedError
というエラーがあるけど、こっちは期待通り抽象クラスでそういう形で使うためのものだそうです」
参考: class NotImplementedError
(Ruby 3.3 リファレンスマニュアル)
現在のプラットフォームで実装されていない機能が呼び出されたときに発生します。
例えばfsync
やfork
のシステムコールに依存するメソッドが呼び出されたとき、OSまたはRubyの実行環境がそれらのシステムコールをサポートしていない場合、この例外が発生します。
fork
がNotImplementedError
を発生させる場合respond_to?(:fork)
はfalse
を返すことに注意してください。
classNotImplementedError
(Ruby 3.3 リファレンスマニュアル)より
参考: NotImplementedError
-- Built-in Exceptions — Python 3.12.3 documentation
後で調べると、Javaは昔から抽象クラスでNotImplementedError
を使っているので、Javaをやっていた人にとって紛らわしそうですね。
参考: NotImplementedError
(Vavr 0.9.1 API)
「しかもRubyのNotImplementedError
はStandardError
ではなくScriptError
を継承しているので↓、エラーがStandardError
から継承されていることを前提としているrescue => e
でキャッチできない」「記事では代わりにNoMethodError
を使うとかデフォルトの振る舞いを実装するとかSorbetを使うとかいろいろ別案が示されていますね」
同記事より
「なお、こういう"使うときはこのメソッドとこのメソッドを実装しなければならない"みたいなパターンは、Javaだとabstract
宣言やinterface
宣言あたりを使えば実装を忘れてもコンパイル時の静的チェックで見つけられますし、実際Javaではとてもよく使われているんですけど、Rubyはそういう静的チェックを厳密にやりにくいし、そもそもRubyはJavaのようなカッチリした文化じゃないんですよ」
参考: Java Abstraction -- w3schools.com
「言われてみれば抽象クラス的なパターンはたまにしか見かけなかったような気もします」「Rubyでもちろんそういう実装は可能ですし実際にいろいろありますけど、世の中でよく事例として参照される"Javaの書き方"的なものは言語の機能サポートありきな部分もありますし、RubyでそういったことをやるにはRubyの書き方があるので、Javaによる実装をそのまま参考にするのはあまり相性が良くないというのはありますね」「なるほど」
つっつき後に、以下の本があることを教わりました(日本語訳は絶版)。
なお、同書のRubyデザインパターンは以下のリポジトリで参照できます。
🔗 Prismの歴史と現況を振り返る
I wrote (somewhat extensively) about the current state of the Ruby language frontend, including Prism, LRama, "universal" parser, and much more.
I hope this post is able to answer all of the questions I keep getting about where everything is heading.https://t.co/d6it5weNt3
— Kevin Newton (@kddnewton) April 16, 2024
つっつきボイス:「Rubyの新しいパーサーPrismの作者の一人であるKevin Newtonさんの記事です」「お、Prismのたどった歴史がびっしり書かれていてすごい」「記事冒頭で、もうRipperとかは使わずにPrismを使いましょうという結論になってますね↓」
忙しい人向けの結論: 何らかの理由でRubyコードを解析する必要がある場合は、Prismライブラリを使いましょう。CRubyコアチームが今後どのような決定を下そうと、このライブラリはRubyパーサーAPIの決定版として恒久的に存続することが保証されています。Prismはドキュメントも充実していてエラー耐性もあり、すべての主要なRuby実装に移植可能で、将来の改善への明確な道筋があります。
同記事より抜粋
「CRubyのコミット番号まで書かれている項目もありますね」「JRubyやTruffleRubyでのPrism移行の現状とかも書かれてる」「これは力作」「RubyKaigi 2024の予習にもよさそうな記事👍」「たしかに今度のRubyKaigiでPrismに触れないはずはないですよね」
🔗 その他Ruby
5月に沖縄で開催される #RubyKaigi、Homebrewのプロジェクト・リーダーが登壇するジャン!!!!!! いつもメッチャお世話になってます...😭💖
Using "modern" Ruby to build a better, faster Homebrew https://t.co/CUB9syUvys
(ということを #rubyist_meguri で松田さんに教えてもらいました 😌✨) pic.twitter.com/Hsin9xj9G1
— 安川要平/Yohei Yasukawa (@yasulab) April 17, 2024
つっつきボイス:「このMike McQuaidさんがHomebrewの中の人なんですね」「Homebrewいつもお世話になってます」「そういえばWindowsに乗り換えてから使ってなかった」
Today I'm proud to announce the release of Homebrew 4.2.0.
The major things this release are us finally getting off the ancient Ruby 2.6 onto shiny Ruby 3.1 and a bunch of nice other performance improvements.https://t.co/5ValU1C9DO
— Mike McQuaid (@MikeMcQuaid) December 18, 2023
名前のセンスが良過ぎるw
— joker1007 (アルフォートおじさん) (@joker1007) April 17, 2024
「neversaydieという名前、強い」「libsigsegvにアタッチしてSEGV(セグメンテーション違反)を無理やりrescue
できるようにするgemか!」「名前からしてジョークgemでしょうか?」「libsigsegvの用途からしてデバッグやトレースとかでも使えるはずなので、ジョークなのは命名だけですね」「なるほど」
参考: セグメンテーション違反 - Wikipedia
参考: ダウンロードファイル一覧 - GNU libsigsegv - OSDN
GNU libsigsegvはページフォールトを処理するためのライブラリです。ページフォールトは、プログラムが現在利用できないメモリ領域にアクセスしようとすると発生します。ページフォルトを補足し処理することは、ガーベジコレクタ、スタックオーバフロー ハンドラ、永続的データベース、分散共有メモリ等を実装するための有用な手法の一つです。
ダウンロードファイル一覧 - GNU libsigsegv - OSDNより
neversaydieの元ネタがありそうな気がしていたのですが、つっつき後にもしかすると以下あたりかもしれないというレスをもらいました。情報ありましたら@hachi8833または@techrachoまでお知らせください🙏。
🔗DB
🔗 sqlite3-rubyでRuby 2.7以下のサポート終了
つっつきボイス:「小ネタですが、sqlite3-rubyでRuby 2.7以下のサポートが終了したそうです」
その後早くも2.0.1がリリースされていました。
参考: Release 2.0.1 / 2024-04-20 · sparklemotion/sqlite3-ruby
🔗 設計・セキュリティ
🔗 WEB+DB PRESS総集編[Vol.1~136]
【新刊】2024年4月18日発売『WEB+DB PRESS総集編[Vol.1~136]』本体3,000円+税,WEB+DB PRESS編集部 編,2000年から23年間,Web開発の現場を取り上げ続けたバックナンバーを全号収録!https://t.co/Rm9DpnCK1b pic.twitter.com/lRCC4xVFAe
— 技術評論社販売促進部 (@gihyo_hansoku) April 9, 2024
つっつきボイス:「Rubyコミッターのko1さん(笹田耕一)も寄稿していることをruby-jp Slackで知りました」「総集編は何度か買ったことあります」「貴重な歴史ですね」「PDFの量が凄そう」「タイトルを抽出してAIに渡したら便利に使えるかも」
つっつき後に以下の記事を見かけました。
参考: WEB+DB PRESS 総集編を読んだ, 駐車場を変えた, 構図がわかれば絵画がわかる を読んだ - HsbtDiary(2024-04-22)
🔗クラウド/コンテナ/インフラ/Serverless
🔗 Tailscale SSH正式版リリース(Publickeyより)
つっつきボイス:「Tailscale SSHがついに正規版になった🎉」「Tailscaleはほんと便利だしいつも使ってる」「Tailscaleは以前詳しく取り上げたことがありますね(ウォッチ20221116)」「このときもボクいたのにTailscaleのことすっかり忘れてた😅」
🔗JavaScript
🔗 jsbundling-railsでpnpmをサポート
つっつきボイス:「jsbundling-railsの更新情報を調べていたら、bun(ウォッチ20230926)に続いてpnpmというパッケージマネージャもサポートするようになっていることに気づきました」「以下の記事によると、npmのパッケージを重複して持たずに済むようにシンボリックリンクの形で持つらしい」「Performant NPMを略してpnpmなのね」
参考: JavaScriptパッケージ管理ツール「pnpm」の紹介
🔗言語/ツール/OS/CPU
🔗 情報科全教科書用語リスト
情報処理学会の「情報科全教科書用語リスト」、けっこう間違いもあるようですね。メンションしていただければ関係者に伝えます。とりあえずJPEGは256**3=16777216色 https://t.co/fIa6ikmOEJ
— Haruhiko Okumura (@h_okumura) April 16, 2024
DDoS攻撃とDoS攻撃が両方とも「特定サイトに多くのPCから集中してアクセスを行う攻撃方法」になってしまっています。
Distributedかどうかの違いや、攻撃を行う側がPCに限定していたり攻撃を受ける側がサイトに限定しているという問題があると思います。
— 小川晃通(あきみち)PhD。YouTubeでIPv6やTCP/IPの解説動画作ってます! (@geekpage) April 16, 2024
つっつきボイス:「情報科全教科書用語リストというのが公開されているそうです↓」「リンク先でGoogleスプレッドシート形式で公開されてるんですね」
参考: 情報処理学会 情報入試委員会 - 情報科全教科書用語リスト
「用語の解説が多少間違ってたりするのはあるあるだし今後修正されると思いますけど、それよりもここで"総意率"のようなカラムがあることの方が興味深いかも」「たどっていくと、総意率は各出版社が出している情報科の教科書にどのぐらい登場しているかという割合を表すみたいですね」「用語の普及率とかがこれでわかりそう」「こういう情報が公開されていることの方が貴重だと思いますし、何なら用語の解説文はなくてもいいくらい👍」
後編は以上です。
バックナンバー(2024年度第2四半期)
週刊Railsウォッチ: RailsからOpenStructを削除、Playwrightベストプラクティスほか(20240425前編)
- 20240423後編 Kamalはゲームチェンジャーになるか、Solid Queueで使われているfugitほか
- 20240416前編 ジョブのエンキューをトランザクション完了時まで自動先延ばしほか
- 20240410後編 SeleniumでRubyの全クラスとモジュールにRBSが追加ほか
- 20240409前編 Rails公式の"rails-new"ツールでRailsプロジェクトをセットアップほか
- 20240402 solid_queueとmission_control-jobsが正式にRailsのgemに、Rubyの"チルド"文字列ほか
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)