ターミナル操作のデモ動画作成用のツール (ghostplay) を作った

こういうのをやりたかったんですよ。

これは https://shellspec.info に載せているデモ動画です。何も知らない初見さんに対して、実際に使ってもらうことなくどういう事ができるというのをぱっと見せることが出来ます。

この動画は、動画の右下にも書いてあるように asciinema - Record and share your terminal sessions, the right way というサービスを利用しています。 shellspec が大きく影響を受けている rspec で使っているのを見て知りました。実はこれ画像ではなくテキストなのでコピペできるんですよ。

asciinema はターミナル操作を録画して、それをシェアするためのツールです。

ただですね? ターミナルを操作するのは人間なんですよ。

ライブコーディングとか一発勝負、ミスも含めて全部録画。みたいなのであればそれでも良いのですが、プログラム紹介のデモ動画にそこまでの緊張感やライブ感はいりません。また将来修正が入るかもしれませんし、そのたびに長い文章を何度も入力するなんで面倒な作業ですよね?

ということで作ったのが、スクリプトの自動入力ツール ghostplay です。

github.com

使い方は簡単で、

1. 適当なシェルスクリプトを書きます。

[example/script.sh]

#!/bin/sh
echo This is your script.
echo ghostplay types your script and execute.

2. ghostplayを使用して実行します。

ghostplay example/script.sh

するとこのようにスクリプトを1文字1文字入力して実行します。(まるで幽霊が演奏するかのように)

f:id:koichi_nakashima:20190304181428g:plain

↑これは asciinema ではなく ttyrec で録画したものを seq2gif でアニメーションGIFに変換しています。GitHubのREADME.md に乗せる場合に便利です。

ghostplay 自体はスクリプトの自動入力ツールなので、ターミナル操作の録画を行う時は asciinema や ttyrec と組み合わせて使います。 asciinema と ttyrec の両方に録画開始と同時にコマンド実行するオプションがあるので以下のように簡単に連携させることが出来ます。

asciinema

# Record terminal
asciinema rec -c "ghostplay example/script.sh"

ttyrec & seq2gif

# Record terminal to a file "ttyrecord'
ttyrec -e "ghostplay example/script.sh"

# Convert to animated gif
seq2gif -i ttyrecord -o demo.gif

類似ソフト

spielbash

似たようなソフトに spielbash というのを見つけました。リポジトリが複数あって分かりづらいのですが以下のような関係みたいです。

  1. https://github.com/redhat-cip/spielbash オリジナル? 2016年頃に開発。Python製
  2. https://github.com/justinazoff/spielbash 1.をフォークして2017年頃に修正を加えたもの
  3. https://github.com/Malinskiy/spielbash 1.をRubyで書き直したもの。2018年頃に開発。多分一番高機能。

おそらく機能的には spielbash の方が上です。ghostplay ではシェルスクリプトで自動実行できるものを対象としているため vim や irb 等の対話型ツールを自動操作できませんが spielbash (3.のやつ) では scenario_1.yaml を見る限り、それができるようです。

それに対する ghostplay の優位性はスクリプトファイルの記述が簡単であるという点です。ghostplay のスクリプトファイルはシェルスクリプトそのものです。(実際にシェルスクリプトとしてシェル上で実行しています。)操作内容を書いたシェルスクリプトを作成すれば、それがそのまま(もしくはわずかな修正で) ghostplay のスクリプトファイルとして使用できます。