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

週刊Railsウォッチ: childprocess gemで子プロセスを制御、Ruby 2.6〜3.0で動くdelegationほか(20210623後編)

こんにちは、hachi8833です。RubyKaigi Takeout 2021のプロポーザル提出とスポンサー募集は今月いっぱいで締め切りだそうです。どうぞお早めに。

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 childprocess: Rubyで子プロセスを制御(Ruby Weeklyより)

enkessler/childprocess - GitHub


つっつきボイス:「お〜、Rubyで手軽に子プロセスの管理(Ruby側からのプロセス終了待ちやexitコードの取得)やシグナルの送信を行えるのか、なるほど」

# 同リポジトリより
process = ChildProcess.build("ruby", "-e", "sleep")

# 親プロセスからstdout/stderrを継承
process.io.inherit!

# またはIOを渡す
process.io.stdout = Tempfile.new("child-output")

# 子のenvを変更する
process.environment["a"] = "b"
process.environment["c"] = nil

# 子のワーキングディレクトリを設定
process.cwd = '/some/path'

# プロセススタート
process.start

# プロセスステータスのチェック
process.alive?    #=> true
process.exited?   #=> false

# プロセスが終了するまで待つ
process.wait
process.exited?   #=> true

# exitコードを取得
process.exit_code #=> 0

# またはexit + 強制終了をポーリング
begin
  process.poll_for_exit(10)
rescue ChildProcess::TimeoutError
  process.stop # プロセスkillの方法をだんだん荒っぽくしてゆく
end

process = ChildProcess.build("ruby", "-e", "sleep")でビルドしてから各種設定を行い、それからprocess.startでプロセスを開始するという流れのようですね」「プロセスの終了方法もいろいろあるんですね」「RubyにもOpen3.#popen3というライブラリが以前からありますけど、これはPOSIXのpopenライクなインターフェースなので、制御インターフェースがRubyっぽくない部分もあったりします」「なるほど」「このchildprocess gemは、process.waitなどのようにRubyらしく直感的に書けるのがよさそう👍」

参考: Open3.#popen3 (Ruby 3.0.0 リファレンスマニュアル)
参考: Man page of POPEN

🔗 Ruby 2.6〜3.0のどれでも動くdelegationとは


つっつきボイス:「最新の話題ではありませんが、Ruby 2.6〜3.0のどのバージョンでもdelegationを動かすにはruby2_keywordsrespond_toで確認する必要があるという記事でした」「Railsでもruby2_keywordsを使って互換性を保つようにしていますね」

# 同記事より: 2.6〜3.0で動く
def foo(*args, &block)
  target(*args, &block)
end
ruby2_keywords :foo if respond_to?(:ruby2_keywords, true)

参考: Module#ruby2_keywords (Ruby 3.0.0 リファレンスマニュアル)

「こういう書き方だと動かないバージョンがあるのね↓」

# 同記事より
# 2.6と2.7で動かない
def foo(*args, **kwargs, &block)
  target(*args, **kwargs, &block)
end

# Ruby 3以降で動かずRuby 2.7でwarning
def foo(*args, &block)
  target(*args, &block)
end

「トリプルドット...記法を使ったdelegationなら複数バージョンのRubyで使えるかなと思ったけど、記事によると使えるのはRuby 2.7からか」「そういえばRuby 3.0で(arg, ...)のように...の前に1個以上引数を置けるように拡張されていましたね」「その拡張記法も後からRuby 2.7.3にバックポートされたと記事に書かれてた(#16378): Ruby 2.7.3以降でよければ(...)(arg, ...)でdelegationできますね」

参考: 全引数を別のメソッドに引き渡す...引数が導入された -- サンプルコードでわかる!Ruby 2.7の主な新機能と変更点 Part 3 - 新機能と変更点の総まとめ - Qiita

参考: Feature #16378: Support leading arguments together with ... - Ruby master - Ruby Issue Tracking System

🔗 JRubyが9.2.19.0にアップデートしてRuby 2.5.xに対応


つっつきボイス:「JRuby頑張ってますね」「JRubyを自分で使ったことはないな〜」「RubyKaigiが現地開催だった頃にJRubyのセッションをよく見に行ってたのを思い出して懐かしくなってきました」

「JRubyはどういう層で使われているんでしょう?」「推測ですが、主にエンタープライズ分野かなと思います: TomcatのようなJavaのWebコンテナを動かすインフラ環境が共通基盤として既に整備されている企業だと、Rubyのプロセスを動かせるサーバー環境を新たに導入するより、RailsをWARのWebコンテナにパッケージングして普通のJavaアプリと同じようにデプロイおよび管理できるJRubyの方が社内手続き的にも運用体制的にも導入しやすいかもしれませんね」「なるほど」

参考: Java Servlet - Wikipedia

🔗 RBSとGitHub linguist


つっつきボイス:「@st0012さんが上げたissueで、RBSがGitHubでシンタックスハイライトされるようにGitHub linguist↓に登録してはどうかと提案していました」「なるほど、RBSもシンタックスハイライトされるといいですね」

github/linguist - GitHub

「以下のドキュメントによると、GitHub linguistに言語を追加するには自分以外のリポジトリでその言語が使われていることが望ましいそうです」「拡張子には限りがあるので、レビューを通さないと収拾がつかなくなりますよね😆」「たしかに」「言語を追加できるかどうかは使われている行数とかで決めるのかなと思ったら、リポジトリの数なのね」

参考: linguist/CONTRIBUTING.md at master · github/linguist

言語の追加は、GitHubである程度使われるようになってから行われます。ほとんどの場合、新しい拡張子につきユニークなリポジトリ(:user/:repo)200個以上でその言語が使われていることが望ましいと考えています。
同ドキュメントより大意

「linguistに追加された言語は、GitHubのサイドバーにこういう感じで表示されるようになるはず↓」「あ、むしろそっちがメインかも」「言語検出の設定とシンタックスハイライトの設定は別物ですね」


ruby/rbsより

「GitHubに言語を追加する手順がこうやって公開されているのは好感が持てます👍」


つっつき後、上のissue #682に@soutaroさんもレスを付けていました。なお、以下のdependency graphを見ると本記事公開時点では149リポジトリでRBSが使われています。6日前は139リポジトリだったので順調に伸びてますね。

参考: Network Dependents · ruby/rbs

🔗 その他Ruby

つっつきボイス:「選択肢がもうちょっと欲しいかな〜」「私もprintデバッグですが"その他"で回答しました」「ruby_jardは使ったことありませんが以前ウォッチで取り上げましたね(ウォッチ20200818)」



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

🔗 AWS Proton


つっつきボイス:「またAWSの新しいサービスが出たそうです」「AWSには似たようなサービスがいろいろあるけど、Protonはコンテナのデプロイ周りまで面倒を見てくれるようですね」


aws.amazon.comより

参考: AWS Proton (コンテナとサーバーレスデプロイメントのための自動管理) | AWS

「GitHubにある公式のサンプルテンプレート↓に沿って構築できる分、プレビュー版では細かなことは多少やりにくいらしいという話も耳にしています」

aws-samples/aws-proton-sample-templates - GitHub

参考: AWS Protonのサンプルプロジェクトを試す - Qiita

「サービスの構築はデプロイ体制を整えるまでの作業にインフラ周りの経験値を要求されるので、Protonはそういう部分をテンプレでやれるのはよさそうかな」

🔗 Krustlet(Publickeyより)

deislabs/krustlet - GitHub

参考: WebAssembly | MDN
参考: Rustで書かれたKubernetesのためのWASM実行環境Krustletとは? | Think IT(シンクイット)


つっつきボイス:「KubernetesのノードとしてDockerコンテナの代わりにWebAssemblyのランタイムを用使える、つまりWebAssemblyアプリをKubernetesのPodとして動かせるということか」

参考: Podとノードについて | Kubernetes

「WebAssemblyは、どことなくかつてJavaが夢見たものを思わせますね: JavaがJVMを舞台としていたのが、WebAssemblyの場合はブラウザでそれをやろうとしているノリで」「Javaの"write once, run anywhere"ですね」「もちろんWebAssemblyはブラウザだけに限定されないと思いますが、WebAssemblyはサンドボックス内で動くから、普通のDockerコンテナならできるけどWebAssemblyではできないこともまだあるでしょうね」「そうですね」

参考: Write once, run anywhere - Wikipedia

「Krustletは純粋な計算処理を少ないリソースで高速実行するにはよさそうかな: ファイルアクセスとかミドルウェアを使おうと思ったらDockerコンテナの方がいいと思いますが、WebAssemblyが普及したら今後パッケージ管理や入出力周りが拡張されていくかもしれませんね」「なるほど」「WebAssemblyがこういうふうにクラウド化されていけば、Dockerコンテナよりも多重化の度合いを上げやすそうなので、より安くサービスを提供されるようになるかも」

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

🔗 target="_blank"


つっつきボイス:「たぶんもう知られていると思いますが、最近のブラウザはtarget="_blank"を指定して開いた別ウィンドウではデフォルトで親タブを操作できないようになっていたことを今頃知りました」「target="_blank"で開いたウィンドウがデフォルトでrel="noopener"になったのは割と前からですね」

参考: rel=noopener | Can I use... Support tables for HTML5, CSS3, etc
参考: 新規タブリンクの恐ろしい仕様、Chrome 88で変更へ ~Safari/Firefoxに合わせた安全な仕様に - やじうまの杜 - 窓の杜

🔗言語/ツール/OS/CPU

🔗 Mathpix


つっつきボイス:「Mathpixは画像の数式や手書きの数式をキャプチャして整形してくれるアプリか」「これはマジ凄いですね」「TeXのコードも生成できるとは賢い」

「そうそう、LaTeXはこういうふうに分子の構造式も描けますね↓」「言われてみたらなるほどですが知りませんでした!」「構造式を記述するLaTeXパッケージの追加が必要だったと思います」

参考: XyMTeX - Wikipedia

「数式であるとわかっているパターンなら認識しやすいのかな: それでもkとギリシャ文字のκとか、xとギリシャ文字のχあたりは区別が大変そうですが」「人間でも間違えそうですね」「LaTeXはかなり書き慣れてこないと描画を想像しにくいので、こうやって画像認識で生成するのはのは理にかなってそう👍」


後編は以上です。

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

週刊Railsウォッチ: Active Storageのvariantsをeager loadingするメソッドが追加、Hotwire専用Discuss、AnyCable Proほか(20210621前編)

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

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

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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