- Ruby / Rails関連
週刊Railsウォッチ: childprocess gemで子プロセスを制御、Ruby 2.6〜3.0で動くdelegationほか(20210623後編)
こんにちは、hachi8833です。RubyKaigi Takeout 2021のプロポーザル提出とスポンサー募集は今月いっぱいで締め切りだそうです。どうぞお早めに。
You know what~?!?! Just 1 week left until the deadline to submit your proposal and become a sponsor for #rubykaigi !! Don’t miss your opportunities~ 🥡💨https://t.co/D12sUK402D
— Kakutani Shintaro (@kakutani) June 23, 2021
🔗Ruby
🔗 childprocess: Rubyで子プロセスを制御(Ruby Weeklyより)
つっつきボイス:「お〜、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_keywords
をrespond_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
🔗 JRubyが9.2.19.0にアップデートしてRuby 2.5.xに対応
JRuby 9.2.19.0 released. download from: https://t.co/rIrYJfuZ6L programming #ruby #rails #java via @jruby
— Carlos Quintanilla (@carlosqt) June 20, 2021
つっつきボイス:「JRuby頑張ってますね」「JRubyを自分で使ったことはないな〜」「RubyKaigiが現地開催だった頃にJRubyのセッションをよく見に行ってたのを思い出して懐かしくなってきました」
「JRubyはどういう層で使われているんでしょう?」「推測ですが、主にエンタープライズ分野かなと思います: TomcatのようなJavaのWebコンテナを動かすインフラ環境が共通基盤として既に整備されている企業だと、Rubyのプロセスを動かせるサーバー環境を新たに導入するより、RailsをWARのWebコンテナにパッケージングして普通のJavaアプリと同じようにデプロイおよび管理できるJRubyの方が社内手続き的にも運用体制的にも導入しやすいかもしれませんね」「なるほど」
🔗 RBSとGitHub linguist
つっつきボイス:「@st0012さんが上げたissueで、RBSがGitHubでシンタックスハイライトされるようにGitHub linguist↓に登録してはどうかと提案していました」「なるほど、RBSもシンタックスハイライトされるといいですね」
「以下のドキュメントによると、GitHub linguistに言語を追加するには自分以外のリポジトリでその言語が使われていることが望ましいそうです」「拡張子には限りがあるので、レビューを通さないと収拾がつかなくなりますよね😆」「たしかに」「言語を追加できるかどうかは使われている行数とかで決めるのかなと思ったら、リポジトリの数なのね」
参考: linguist/CONTRIBUTING.md at master · github/linguist
言語の追加は、GitHubである程度使われるようになってから行われます。ほとんどの場合、新しい拡張子につきユニークなリポジトリ(
:user/:repo
)200個以上でその言語が使われていることが望ましいと考えています。
同ドキュメントより大意
「linguistに追加された言語は、GitHubのサイドバーにこういう感じで表示されるようになるはず↓」「あ、むしろそっちがメインかも」「言語検出の設定とシンタックスハイライトの設定は別物ですね」
「GitHubに言語を追加する手順がこうやって公開されているのは好感が持てます👍」
つっつき後、上のissue #682に@soutaroさんもレスを付けていました。なお、以下のdependency graphを見ると本記事公開時点では149リポジトリでRBSが使われています。6日前は139リポジトリだったので順調に伸びてますね。
参考: Network Dependents · ruby/rbs
🔗 その他Ruby
Ruby使ってる方何でdebugしているのだろう#ruby #debug
— KaaS🏠 (@kaito2280) June 15, 2021
つっつきボイス:「選択肢がもうちょっと欲しいかな〜」「私もprintデバッグですが"その他"で回答しました」「ruby_jardは使ったことありませんが以前ウォッチで取り上げましたね(ウォッチ20200818)」
Ruby bizグランプリ2021エントリー募集を開始いたしました!
「Ruby」を使った商品・サービス等、ビジネス事例を募集しています。
応募締め切りは9月17日(金)です。
詳しくは公式サイトをご覧ください。https://t.co/i1eX3NVbpD
ご応募お待ちしております。— Ruby biz Grand prix (@RubybizGP) June 14, 2021
MatzさんのDX(Developer Experience)論が聞けるオンラインイベントが6/24にあるらしいので、見ます。楽しみ。#exp_day https://t.co/oHI3aI4ZF8 pic.twitter.com/tm698D7DT3
— gami@デジタル教育系YouTuber兼エンジニア (@jumpei_ikegami) June 17, 2021
🔗クラウド/コンテナ/インフラ/Serverless
🔗 AWS Proton
つっつきボイス:「またAWSの新しいサービスが出たそうです」「AWSには似たようなサービスがいろいろあるけど、Protonはコンテナのデプロイ周りまで面倒を見てくれるようですね」
参考: AWS Proton (コンテナとサーバーレスデプロイメントのための自動管理) | AWS
「GitHubにある公式のサンプルテンプレート↓に沿って構築できる分、プレビュー版では細かなことは多少やりにくいらしいという話も耳にしています」
参考: AWS Protonのサンプルプロジェクトを試す - Qiita
「サービスの構築はデプロイ体制を整えるまでの作業にインフラ周りの経験値を要求されるので、Protonはそういう部分をテンプレでやれるのはよさそうかな」
🔗 Krustlet(Publickeyより)
参考: WebAssembly | MDN
参考: Rustで書かれたKubernetesのためのWASM実行環境Krustletとは? | Think IT(シンクイット)
つっつきボイス:「KubernetesのノードとしてDockerコンテナの代わりにWebAssemblyのランタイムを用使える、つまりWebAssemblyアプリをKubernetesのPodとして動かせるということか」
「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 Snip
行列も書けるし、texに変換できるので、overleafなりに貼っつけて、手書きで微妙に違った箇所を修正すれば完成、手書きの手間の1.3倍くらいでいける
— あかげふ (@AkaGhef) June 16, 2021
つっつきボイス:「Mathpixは画像の数式や手書きの数式をキャプチャして整形してくれるアプリか」「これはマジ凄いですね」「TeXのコードも生成できるとは賢い」
「そうそう、LaTeXはこういうふうに分子の構造式も描けますね↓」「言われてみたらなるほどですが知りませんでした!」「構造式を記述するLaTeXパッケージの追加が必要だったと思います」
「数式であるとわかっているパターンなら認識しやすいのかな: それでもk
とギリシャ文字のκ
とか、x
とギリシャ文字のχ
あたりは区別が大変そうですが」「人間でも間違えそうですね」「LaTeXはかなり書き慣れてこないと描画を想像しにくいので、こうやって画像認識で生成するのはのは理にかなってそう👍」
後編は以上です。
バックナンバー(2021年度第2四半期)
- 20210615後編 RubyのRBSを理解する、シンボルがGCされないとき、Terraform 1.0リリースほか
- 20210608後編 RubyでAppleのLZFSE圧縮データ解凍、AWS Lambda Extensionsが正式リリース、unixgame.ioほか
- 20210607前編 ActiveRecord::Relationのone?とmany?が高速化、RubyKaigi Takeout 2021登壇者募集開始ほか
- 20210601後編 Python使いから見たRuby、MySQLのインデックス解説、GitHubが採用したOpenTelemetryほか
- 20210531前編 RailsConf 2021の動画が公開、GraphQLのN+1を自動回避、Ruby 3のJITとRailsほか
- 20210525後編 Rubyのオブジェクトアロケーション改善、RubyKaigi Takeout 2021開催日発表、AWS App Runnerほか
- 20210524前編 Active Supportの知られてなさそうな機能5つ、RSpecの歴史、書籍『Practicing Rails』ほか
- 20210518後編 RubyのGCを深掘りする、Psych gemのbreaking change、11月のRubyConf 2021ほか
- 20210517前編 Bootstrap 5リリース、productionでSQLiteがwarning表示、rails-ujsの舞台裏ほか
- 20210511後編 AWS Lambda関数ハンドラをDSLで書けるyake gem、VPC Peeringが同一AZ転送量無料化ほか
- 20210510前編 属性メソッドをキャッシュして最適化、Railsのガバナンスに関する声明、bundle install高速化ほか
- 20210427後編 RactorでUDPサーバーを作る、JSONシリアライザalba gem、AppleのAirTagほか
- 20210420後編 ShopifyのJITコンパイラYJIT、PicoRuby、DynamoDBの3つの制約ほか
- 20210419前編 RailsのN+1クエリを定番以外の方法で修正する、GitLabのセキュリティ修正リリースほか
- 20210413後編 RubyMineのRBSサポートとCode With Me、GitHub ActionとDockerレイヤキャッシュほか
- 20210412前編 Active Record属性暗号化機能がRails 7にマージ、RailsNew.ioでrails newオプションを生成ほか
- 20210407後編 エイプリルフールのRuby構文プロポーザル、AWSのVPC Reachability Analyzerほか
- 20210406前編 GitHubが修正したRailsセッションハンドリングの競合、erb/haml/slimの速度比較ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)