Ubuntu Weekly Recipe

第551回 asciinemaで端末操作を「録画」し共有する

この記事を読むのに必要な時間:およそ 4 分

皆さん,Advent Calendar書いてますか! 今回は計算機系Advent Calendar向け記事を書く上で,⁠端末上の操作」を動画として保存・公開できるasciinemaコマンドについて紹介します。

端末を「録画」する

Advent Calendar(アドベントカレンダー)の本来の由来はともかくとして,日本の技術系界隈では12月1日あたりから計算機系記事が充実するイベントとして定着しつつあります。

さて,計算機系の記事を書く上で頻出するのが,コマンドライン上での操作です。大抵の場合はpreタグのように整形済みテキスト(PREformatted text)として,文書の中に埋め込むことでしょう。しかしながらそれでは静的なテキストであって,⁠実行した結果がどのようなタイミングで表示されるか」はわかりません。もちろんアニメーションGIFやAPNGにしたり,YouTubeにアップロードすれば動画にはなるものの,今度は実行内容を手元にコピーアンドペーストできません。

そこで今回紹介するのが,Python製の端末録画ツールであるasciinemaです。

「端末の操作を保存する」ツールはasciinemaに限らず古くからたくさん存在します。たとえばUbuntuであれば最初からインストールされているscriptコマンドはその代表格ですし,ttyrecも古くから使われています。ttystudioは直接GIFやAPNGに生成できますし,Ruby製のShelrやPython製のTermRecordなど同様のツールは枚挙にいとまがありません。

その中でも今回紹介するasciinemaには,次のような特徴があげられます。

  • 録画データの再生結果からテキストをコピーアンドペーストできる
  • 録画データを専用のWebサイトへにアップロード・公開・再生・共有できる
  • YouTubeのように自前のWebサイトで上記アップロード結果を埋め込み表示できる
  • 自前のアップロードサイトを構築可能
  • ローカルプレイヤーでも早送り・コマ送り・一時停止が可能
  • JSONファイルnewline-delimited JSONとして保存される
  • ホスト間のストリーミング再生も可能
  • パッケージリポジトリからかんたんにインストールできる
  • キー入力を保存するかどうか選択可能(v2フォーマットから)

一部は他の録画ツールでもサポートしていますし,他のソフトウェアと組み合わせたら大抵の機能は実現可能ではあります。ただこれらすべてをひとつのツールで実現するとなると,asciinemaが有力な選択肢となってくるのです。

ちなみに「保存したキー入力」を再生時に表示する仕組みは,まだ存在しません。今のところ,録画時にオプションを指定すればJSONデータにキー入力の情報が保存されるようにはなっているものの,プレイヤー側の対応が進んでいない状況です。

基本的な録画と再生の方法

まずはasciinemaをインストールしましょう。Python製のツールなので様々なインストール方法が存在しますが,Ubuntu 18.04 LTS以降ならリポジトリからパッケージをインストールする方法が一番かんたんで確実でしょう。

$ sudo apt install asciinema

asciinemaは「asciinema サブコマンド」形式で実行します。録画は「asciinema rec ファイル名」です。ファイル名を省いた場合,録画終了時に録画した結果が共有サイトにアップロードされます(アカウントは不要。共有サイトについては後述を参照)⁠あとからuploadサブコマンドでもアップロード可能ですので,基本的にはファイル名を指定してローカルで保存しておきましょう。

$ asciinema rec sample.cast
asciinema: recording asciicast to /dev/fd/63
asciinema: press <ctrl-d> or type "exit" when you're done

試しに日本語入力やキャリッジリターンのようなカーソル位置がジャンプする操作,さらにはVimのようなスクリーンエディタも動かしてみましょう。録画が終了したら「Ctrl-D」もしくは「exit」で終了してください。

recサブコマンドは,実行したシェルの表示結果をすべて記録します。しかしながら実行時に-c コマンドを指定すると,そのコマンドの出力結果だけ記録されるのです。たとえばasciinema -c "man asciinema" asciinema.castのように使います。

録画データは「asciinema play ファイル名」で再生できます。

$ asciinema play sample.cast

実際にWebプレイヤー上で再生した結果は次のとおりです。

ポイントは再生中の文字列を選択・コピーできる点です。適当なタイミングで一時停止し,Webブラウザー上の他の文字列と同じように,マウスで文字列を選択してみましょう。

ちなみにgihyo.jpは本文の横幅が狭いため,横80桁幅の録画データを再生しようとすると右端が切れてしまいます。画面全体を確認したいならプレイヤー右下のボタンから全画面表示するか,asciinema上で再生してください

ローカルでもWebプレイヤーでもスペースキーで一時停止・一時停止解除できます。ローカルプレイヤーの場合は一時停止中に「.」と入力することで,コマ送り(asciinema上の1フレームごとの再生)が可能です。playサブコマンドに-s 数字を指定すると数字の数だけ倍速で再生します。

実際に中身を見ていると,ただのJSONファイルになっていることがわかります。

JSONファイルの先頭には,フォーマットバージョンや端末のプロパティが記録されています。⁠newline-delimited JSON」なため,いずれの行もvalidなJSONです。言い方を変えると,個々の行を削除しても再生時に表示される内容が変わるだけで,フォーマットとしては問題ありません。よって不要な出力を手作業であとから整理できるのです。

さらに録画時に--stdinオプションを付けることで,標準入力のキー操作も記録可能です。たとえばsudoコマンド時のパスワードもそのまま残ります。前述のように今のところまだプレイヤーが対応していないものの,将来的には端末の操作に合わせてキー入力をプレイヤーが表示するようになるかもしれません。

なお,⁠asciinema cat ファイル名」を使うとレンダリングした結果をダンプできます。記事を書くにあたって,実行結果のみをコピーアンドペーストしたい際に便利でしょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入