📽️

Julia の REPL でのキーボード入力作業を自動化する(Replay.jl)

2021/11/17に公開
1

本日は

  • Replay.jl の紹介です. 2021/11/20 ごろには公式パッケージとして使えるようになります.
  • スターとか github sponsor とか投げ銭とかあると中の人は喜びます.

モチベーション

  • Julia のパッケージ(ライブラリやアプリケーション,研究に用いたコードの紹介も含む)を作ったとします.
    • 「新しい Julia パッケージを作った.」みんなの前で紹介したい!
    • 「REPL だとこうやって触るんですよ!」というよな手続きを見せたい! とします.
  • REPL での作業を見せるとき,普通は手作業(具体的にはキーボードを使って手打ち)で入力する様子を画面をキャプチャーするソフトなどを使って録画すると思います. その時は緊張しませんか?
  • やるからには綺麗に見せたいし正確にタイプした様子を見せたいですよね. 変にタイプミス・タイポすると映えないし(それはそれで人間味がありますが), N > 1 行前のコードに誤りがあった場合は最初からやり直す必要があります. そもそもキャプチャーするスイッチをオンにしてなくて録画すらされてなかったり.

Replay.jl の紹介

REPL の上でタイピングしているかのような様子を見せることができます:

実行例

百聞は一見に如かずという言葉に従って動作する様子を見せましょう:

文章を REPL でチマチマ入力する例です. この時点でどういうことができそうかってのは想像できたと思います.

もう少し綺麗なバージョンは こちらの YouTube にて閲覧できます. (面白ければチャンネル登録お願いします 1000 人になったら収益化できるらしいのでスパチャもらってチヤホヤされたいです!)

みなさんの手元で行う方法

まずはインストール

公式パッケージになれば下記のようにできます.
公式パッケージになっていない段階で (2021/11/17日~20日)すぐ使いたい人は次のセクションのようにして git clone しましょう.

  • Julia の REPL で行う場合:
julia> using Pkg; Pkg.add("Replay")
  • bash/zsh などで行う場合:
$ julia -e 'using Pkg; Pkg.add("Replay")'

使ってみよう

examples という場所に例があります.

$ https://github.com/AtelierArith/Replay.jl.git
$ cd Replay.jl
$ julia --project=@. -e 'using Pkg; Pkg.instantiate()'
$ julia --project=@. ./examples/readme/app.jl # README にある例
$ julia --project=@. ./examples/use_ghostwriter/app.jl # Zenn で紹介した例

app.jl に書いている内容は下記が基本になります:

# app.jl
using Replay # replay を使えるようにする
instructions = """
# ここに REPL で行う動作を書いておく
"""
replay(instructions)

これだけでOKです. キーワード引数に use_ghostwriter=true を仕込むとあなたの代わりにタイピングしている様子を見せることができます. ヴァイオレットエバーガーデンに思いを馳せながら試すと良いと思います.

実装アイデアは?

https://github.com/JuliaLang/julia/blob/v1.6.3/test/testhelpers/FakePTYs.jl
https://github.com/JuliaLang/julia/blob/v1.6.3/contrib/generate_precompile.jl

にある Julia 本体にあるコードを切り貼りして使いやすくしました.

  • REPL に入力するコードを実行するプロセスを立ち上げる. (app.jl を実行するプロセスと別に立ち上げます. これを FakePTYs.jl が担います.)
  • そのプロセスに instructions に入力した文字列を入力として与える
  • 実行して得られた出力を文字列として受け取り app.jl を実行しているメインのプロセスに出力します.
  • ここに書いてある 方法でタイピングする様子を表現しています.

元々 generate_precompile.jl は Pkg.jl などの標準ライブラリを含める sysimage を生成するするために使用されるスクリプトです.

この行debug_output = stdout と変更し julia のリポジトリ直下で make コマンドを実行すると Replay.jl と同じことをしている様子を観察できます.

おまけ

  • 今回はREPLでの操作を自動化したものになります. 操作を自動化した結果をキャプチャーするのは人間がする必要があります. 動画にするのであればそれでいいですけれど, website に載せる時は https://asciinema.org/ みたいなことしたいですよね.
  • 頭の中では termynal というものを連携できないかな? と期待しています: https://github.com/ines/termynal
  • termynal は Python で有名な FastAPI のドキュメント,例えば, pip install fastapi にあるタイピングさせる仕組みに使われています. FastAPI に梱包されているJS/HTMLのコードを流用すれば Franklin.jl や Documenter.jl で作成する Julia ドキュメントシステムに組み込める余地があります.

例えば color=:no キーワードとリダイレクトを利用することで

$ julia -e 'using Replay; replay(instructions, color=:no)` > out.txt

とすれば out.txt を入力とすることで色々できるわけです.

つまりもう一つパッケージを作れるネタが生まれたわけです.

GitHubで編集を提案

Discussion