pockestrap

Programmer's memo

福岡Rubyist会議03 Proposal: ⁠外部コマンド実行入門

福岡Rubyist会議03に応募したプロポーザルです。このプロポーザルは採択されました。

タイトル

トークのタイトルを 30 文字以内で書いてください。これは公式サイトに記載されます。

⁠外部コマンド実行入門

トーク概要(100文字以内)

トークの概要を 100 文字以内で書いてください。これは公式サイトに記載されます。

Rubyからコマンドを起動する方法は数多くあります。systemメソッドなどがその代表です。ですが往々にしてそれらはうまく使い分けられていません。 このトークでは、それらの使い分けを解説します。

トーク詳細

トークの詳細を記載してください。これは外部に公開されません。審査員のみが参照します。

Rubyでは、外部コマンドを実行する方法が数多く用意されています。たとえば組み込みライブラリや標準添付ライブラリだけでも、以下のメソッドが挙げられます。(ざっと思い出せるものだけなので、まだあるかもしれません)

  • Kernel
    • system
    • exec
    • spawn
    • `
  • Open3
  • IO.popen
  • PTY

このように多くのメソッドが用意されていることで、用途に応じて適切なメソッドを使い分けることができます。コマンドの出力が必要なのか、終了ステータスが必要なのか、実行は同期的に行いたいのか、出力は文字列として扱いたいのかIOとして扱いたいのか、などなど。

ですが現実では、これらのメソッドが適切に使い分けられていないケースが散見されます。本来の意図と異なった使い方をすれば、その意図を汲み取りづらくなり、可読性の低下に繋がります。

また外部コマンドの実行はセキュリティの問題を生みやすいものです。間違った方法で実装してしまうと、重大なセキュリティリスクが発生するかもしれません。

このトークではこれら外部コマンドの使い分け方を解説します。それによって聴講者が正しくRubyから外部コマンドを実行できるようになることを目指します。

このトークは「Rubyで外部コマンドを実行するなら、これさえ見ておけば大丈夫」という内容になります。そのためこのトークの内容はスライドだけにとどまらず、別途清書をして記事などの形でも公開する予定です。

⁠アピールポイント

本カンファレンスで「なぜこのトークをしたいのか」「なぜあなたがこのトークをすべきなのか」を書いてください。これは外部に公開されません。審査員のみが参照します。

トーク詳細でも述べたように、外部コマンドの実行はあまりよく理解されないまま使われており、かつ重大なセキュリティ問題につながりやすいところでもあります。そこに対して永久保存版となるようなトークをすることはRubyist、とくにRubyにまだ習熟していないようなRubyistにとって大きな価値があると考えています。

私には長年のRubyでの経験があり、とくに外部コマンドに関しても多くの経験があります。以前私が行っていた仕事では、RuboCopなどの多くのLinterをRuby on Railsのコードから実行するようなアプリケーションを書いていました。またそれ以外にもRubyからコマンドを起動するようなプログラムを多く書いており、この分野に関して詳しいです。