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

週刊Railsウォッチ: Prismの歴史と現況を振り返る、Steepの"narrowing"実装の内部ドキュメントほか(20240426後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

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

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

  • お知らせ: 来週および再来週の週刊Railsウォッチはお休みをいただき、通常記事を公開します。

🔗Ruby

🔗 Steepの"narrowing"実装の内部ドキュメントが公開


つっつきボイス:「ruby-jp Slackで知りました」「Rubyの静的型チェッカーSteepの内部挙動に関するドキュメントをsoutaroさん自ら書いたんですね、これはじっくり読んでみたい👍」「ユーザー向けのNarrowing guideはまだ作られていませんが、きっとこれを元に今後作るんでしょうね」

soutaro/steep - GitHub

「上と前後してsoutaroさんの転職記事も出ていました↓」「お〜フルタイムRubyコミッターとして仕事するのか、すごい🎉」「こうやって業務としてRubyコミッター活動に専念できる場がRubyの世界にあるのがいいですね👍」

🔗 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 リファレンスマニュアル)

現在のプラットフォームで実装されていない機能が呼び出されたときに発生します。
例えばfsyncforkのシステムコールに依存するメソッドが呼び出されたとき、OSまたはRubyの実行環境がそれらのシステムコールをサポートしていない場合、この例外が発生します。
forkNotImplementedErrorを発生させる場合respond_to?(:fork)falseを返すことに注意してください。
class NotImplementedError (Ruby 3.3 リファレンスマニュアル)より

参考: NotImplementedError -- Built-in Exceptions — Python 3.12.3 documentation

後で調べると、Javaは昔から抽象クラスでNotImplementedErrorを使っているので、Javaをやっていた人にとって紛らわしそうですね。

参考: NotImplementedError (Vavr 0.9.1 API)

「しかもRubyのNotImplementedErrorStandardErrorではなくScriptErrorを継承しているので↓、エラーがStandardErrorから継承されていることを前提としているrescue => eでキャッチできない」「記事では代わりにNoMethodErrorを使うとかデフォルトの振る舞いを実装するとかSorbetを使うとかいろいろ別案が示されていますね」


同記事より


「なお、こういう"使うときはこのメソッドとこのメソッドを実装しなければならない"みたいなパターンは、Javaだとabstract宣言やinterface宣言あたりを使えば実装を忘れてもコンパイル時の静的チェックで見つけられますし、実際Javaではとてもよく使われているんですけど、Rubyはそういう静的チェックを厳密にやりにくいし、そもそもRubyはJavaのようなカッチリした文化じゃないんですよ」

参考: Java Abstraction -- w3schools.com

「言われてみれば抽象クラス的なパターンはたまにしか見かけなかったような気もします」「Rubyでもちろんそういう実装は可能ですし実際にいろいろありますけど、世の中でよく事例として参照される"Javaの書き方"的なものは言語の機能サポートありきな部分もありますし、RubyでそういったことをやるにはRubyの書き方があるので、Javaによる実装をそのまま参考にするのはあまり相性が良くないというのはありますね」「なるほど」


つっつき後に、以下の本があることを教わりました(日本語訳は絶版)。

参考: Amazon | Design Patterns in Ruby (Addison-Wesley Professional Ruby Series) (English Edition) [Kindle edition] by Olsen, Russ | Languages & Tools | Kindleストア

なお、同書のRubyデザインパターンは以下のリポジトリで参照できます。

davidgf/design-patterns-in-ruby - GitHub

🔗 Prismの歴史と現況を振り返る


つっつきボイス:「Rubyの新しいパーサーPrismの作者の一人であるKevin Newtonさんの記事です」「お、Prismのたどった歴史がびっしり書かれていてすごい」「記事冒頭で、もうRipperとかは使わずにPrismを使いましょうという結論になってますね↓」

忙しい人向けの結論: 何らかの理由でRubyコードを解析する必要がある場合は、Prismライブラリを使いましょう。CRubyコアチームが今後どのような決定を下そうと、このライブラリはRubyパーサーAPIの決定版として恒久的に存続することが保証されています。Prismはドキュメントも充実していてエラー耐性もあり、すべての主要なRuby実装に移植可能で、将来の改善への明確な道筋があります。
同記事より抜粋

「CRubyのコミット番号まで書かれている項目もありますね」「JRubyやTruffleRubyでのPrism移行の現状とかも書かれてる」「これは力作」「RubyKaigi 2024の予習にもよさそうな記事👍」「たしかに今度のRubyKaigiでPrismに触れないはずはないですよね」

Rubyパーサーを一新するprism(旧YARP)プロジェクトの全容と将来(翻訳)

🔗 その他Ruby

つっつきボイス:「このMike McQuaidさんがHomebrewの中の人なんですね」「Homebrewいつもお世話になってます」「そういえばWindowsに乗り換えてから使ってなかった」


「neversaydieという名前、強い」「libsigsegvにアタッチしてSEGV(セグメンテーション違反)を無理やりrescueできるようにするgemか!」「名前からしてジョークgemでしょうか?」「libsigsegvの用途からしてデバッグやトレースとかでも使えるはずなので、ジョークなのは命名だけですね」「なるほど」

tenderlove/neversaydie - GitHub

参考: セグメンテーション違反 - Wikipedia
参考: ダウンロードファイル一覧 - GNU libsigsegv - OSDN

GNU libsigsegvはページフォールトを処理するためのライブラリです。ページフォールトは、プログラムが現在利用できないメモリ領域にアクセスしようとすると発生します。ページフォルトを補足し処理することは、ガーベジコレクタ、スタックオーバフロー ハンドラ、永続的データベース、分散共有メモリ等を実装するための有用な手法の一つです。
ダウンロードファイル一覧 - GNU libsigsegv - OSDNより


neversaydieの元ネタがありそうな気がしていたのですが、つっつき後にもしかすると以下あたりかもしれないというレスをもらいました。情報ありましたら@hachi8833または@techrachoまでお知らせください🙏。

参考: ネヴァー・セイ・ダイ - Wikipedia

🔗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]


つっつきボイス:「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をサポート

pnpm/pnpm - GitHub


つっつきボイス:「jsbundling-railsの更新情報を調べていたら、bun(ウォッチ20230926)に続いてpnpmというパッケージマネージャもサポートするようになっていることに気づきました」「以下の記事によると、npmのパッケージを重複して持たずに済むようにシンボリックリンクの形で持つらしい」「Performant NPMを略してpnpmなのね」

参考: JavaScriptパッケージ管理ツール「pnpm」の紹介

jsbundling-rails README(翻訳)

🔗言語/ツール/OS/CPU

🔗 情報科全教科書用語リスト


つっつきボイス:「情報科全教科書用語リストというのが公開されているそうです↓」「リンク先でGoogleスプレッドシート形式で公開されてるんですね」

参考: 情報処理学会 情報入試委員会 - 情報科全教科書用語リスト

「用語の解説が多少間違ってたりするのはあるあるだし今後修正されると思いますけど、それよりもここで"総意率"のようなカラムがあることの方が興味深いかも」「たどっていくと、総意率は各出版社が出している情報科の教科書にどのぐらい登場しているかという割合を表すみたいですね」「用語の普及率とかがこれでわかりそう」「こういう情報が公開されていることの方が貴重だと思いますし、何なら用語の解説文はなくてもいいくらい👍」


情報科全教科書用語リスト改240422改.xlsx - Google スプレッドシートより


後編は以上です。

バックナンバー(2024年度第2四半期)

週刊Railsウォッチ: RailsからOpenStructを削除、Playwrightベストプラクティスほか(20240425前編)

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

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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