競プロに便利なCLIツールのすすめ

皆さん、こんにちは、Yuyoといいます。

簡単に自己紹介すると、
・競プロ初めて半年の灰コーダー（Yuyo1984という名前でやってます、24/3/12時点でレーティング339です。）
・主要言語はPython
・好きなエディタはvim
・趣味はコンテンツ漁りとダーツとガジェット集め
・可愛い物好き、特に推しは初音ミク！

こんな感じの人間です。よろしくお願いします。

早速ですが、本題に入りましょう。
皆さん、CLIってなんだかご存知ですか？
CLIっていうのはこういうやつです。

![Screenshot 2024-04-08 14.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568092/12574764-6d3f-f041-4790-0bc792d01d8b.png)

シンプルに文字だけですね。海外映画のハッカーとかがよく使ってそうです。
CLI、通称コマンドラインインターフェイスではこの黒い画面にコマンドを打ち込んで、PCに指示を出しています。
Mac/Linuxでは「ターミナル」、Windowsでは「コマンドプロンプト」がそれに該当します。
皆さんが普段使ってるブラウザやVSCodeなどのモダンなエディタはGUI、通称グラフィカルユーザーインターフェイスと呼ばれており、こちらはアイコンや画像をクリックすると、PCに指示が出されます。
GUIの方がお手軽ですし、見やすさも上なので、現在ではGUIを使う人が多いです。
むしろ、GUI無しでは多くの一般ユーザーにここまでPCは普及しなかったと思います。

では、そんな時代に何故私がCLIを薦めるのか。
それは以下に挙げる利点があるからです。

１.コマンドを覚えるとGUIより操作がしやすい
皆さん、フォルダの中のファイルを別のフォルダに移動するときどうやってますか？
大半の人はエクスプローラーもしくはFinderを二つ開いて、ドラッグ＆ドロップしてると思います。
しかし、ターミナルでmvコマンドを使えば同じことがマウスを使うことなくできてしまいます。
しかも、複数ある場合でもちゃんと指定してあげれば一発で移動が出来ます。
もちろん、GUIでも複数を囲んであげれば一発で出来ますが、操作がうまく出来ず、移動できなくてやり直すこともあると思います。
CLIでは、ちゃんと使う必要はありますが、指示したことはしっかりやってくれるのでそういったストレスとは無縁です。
ファイル名の複数変更、ディレクトリの新規作成、ファイルの中身の閲覧。
何気ない作業を軽くこなせるようになるのがCLIの長所だと私は思ってます。

2.動作が軽い
突然ですが、皆さん、エディタが固まった・重くなった経験はございますか？
私は低スペックPCでEclipseを動かそうとして、何度もPCをフリーズさせたことがあります。
一方、ターミナルが負荷で固まった経験が今のところありません。
私の場合、ターミナルが固まるのは、大抵己の操作ミスです。
もちろん、メモリが極端に少ない中、機能を追加しまくったりしたら重くなるかもしれませんが、大抵のPCならCLIを使っていて固まることはそうそう無いと思います。
GUIだと、グラフィカルをよく見せる為、どうしてもPCに負荷がかかってしまう面もありますが。CLIだとその心配を抱くことは少なくなります。

３.シンプルで扱いやすい
モダンなエディタは便利な機能が色々搭載されていて有り難いですが。その反面、どうすれば何の機能が使えるのかなかなか分かりづらい部分もあるかと思います。
中には便利機能があったのに、それを知らずに使い続けて、後で知って後悔！なんてケースも。
CLIだと、最初は真っさらな状態でスタートします。そこから自分の使い方に合わせてコマンドを覚えたり、機能を追加したり。
そして、その覚えたコマンドを使えば、PCは素直にあなたの指示をこなしてくれます。
どこをクリックすれば、gitにコミット出来るのか、どうやれば使いたいファイルを素早く見つけられるのか。
迷う必要は無くなります。それはあなたの作業効率を上げてくれるかもしれません。

4.カスタマイズの幅が広い
先ほども言ったことなのですが、CLIは最初更地です。苗を植えてあなた好みの菜園を作れます。
エディタも色々ありますし、拡張機能も膨大な数がネットの海を漂ってます。
その中には、きっとあなたに合ったものがあるでしょう。
ターミナルそのものもフォントやカラーテーマをいじって好みに合わせられますし、シェルスクリプトを組んで、自分のやりたいことを自動化させるなんて芸当も頑張れば出来ます。
可能性は無限大です。あなたの色にCLIを染め上げてください。

5.コンピュータと仲良くなれる
これは私個人が思うことなのですが、CLIを使いこなそうとして、色々学んだ結果、得た知識や触れた知識はとても多く、技術の理解に大きく役立ってます。シェルスクリプトの書き方やファイル検索するときの正規表現の使い方、設定ファイルをどう書くか、ファイルをどうバックアップするかなど、様々な事を学んだことで、私の作業環境、作業効率はとても良い方向に向かいました。
学習コストは高いですが、一度学んでしまえば、その知識は長く使えるものになります。
コンピュータ君ともっと深く関わってみたい方は是非お試しください。

長々と喋ってしまってすいません。以上が私がCLIを勧める理由になります。

では、本題である、競プロに便利なCLIツールを皆さんにお教えしたいと思います。
それはatcoder-cliとonline-judge-toolsです。
これらのツールを使うことで、競プロerは

・コンテスト用のディレクトリの作成
・テストケースのローカル環境への導入
・提出用ソースコードのテンプレートの作成
・ローカル環境でのコードテスト
・コンテストへのコード提出
がスムーズに行うことが出来ます。

詳しい使い方は各ドキュメントを読んでいただきたく思いますが、このツールを使ってから、私は入れる前から30秒から1分あたり提出まで時間を縮められてると感じています。
それだけでパフォーマンスが上がり、結果レーティングを上げることに繋がってるのであれば、このツールの導入は良い選択でした。
何より、コンテストのソースコードの管理、テンプレートの作成はかなり便利で、振り返りやちょっとした改善を試せるなどとても充実した競プロライフになってます。

以下は各ツールのリンクになってますので、導入したい方はそちらを覗いてみてください。
atcoder-cli
http://tatamo.81.la/blog/2018/12/07/atcoder-cli/

online-judge-tools
https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md

各インストール方法もこちらのリンクから見られますが、分かりやすいようにこちらにも貼っておきます
atcoder-cli
http://tatamo.81.la/blog/2018/12/07/atcoder-cli-installation-guide/

online-judge-tools
https://github.com/online-judge-tools/oj/blob/master/docs/INSTALL.ja.md

後日、私も各環境でインストールを検証して、画像を貼っておきますので、少々お待ちいただければと思います。

一つ添えておくと、Win環境の方はWSLというWindows上にLinux環境を構築するツールを使う事をお勧めします。
慣れてない方には、割とWinの環境構築は大変なので！（私も昔挫折しました泣）

また、ターミナルにはシェルというコマンドを受け取り、それをOSに送って実行させ、結果を出力するものがあります。
有名なものではbash/zshなどです。これらの設定ファイルであるbashrc/zshrcに色々と書き込むことで便利に扱いやすくすることが出来ます。
そのうちの一つとして、エイリアスというものがあります。
これはスニペットのようなもので、コマンドに紐付けた文字列を打ち込むことでそのコマンドを実行させることが出来ます。
例えば、本来、atcoder-cliで新しくコンテスト用のディレクトリを作成する際はacc new コンテスト名と打つ必要があるのですが、これをsc = acc newと紐づけることで、sc コンテスト名で同じことができるようになります。
7文字が2文字になって、少し楽になりました。もっと長いコマンドもあるので、そういったものを自分の使いやすいようにエイリアスを設定しておくととても楽になるので、是非調べてみて色々設定を弄ってみるといいと思います。
参考までに私のzshrcを貼っておきますので、良ければ見てみてください。
https://github.com/Yuyo1984/dotfiles/blob/master/.zshrc

以上で今回の話を終わりたいと思います。
便利なものは使うと楽しいし、より楽が出来ます。
CLIに限らず、皆さんも色々と自分の環境をより良くしていくのをこの記事を読んで試してみようと思っていただければ、私にとってはとても嬉しいです！
これからも新たな発見があれば追記したり、新しく記事を書いていきますので、良ければまた読んでいただけると幸いです。ここまでご拝読ありがとうございました。