Docker上にRustの競技プログラミング環境を作る

# はじめに

こちらに改善したものを書きました。よろしくお願いします。
https://qiita.com/rokoooouribo/items/76a0057c75694fd943f5

Docker要素は少なめです。
# 環境構築
Doker、cargo-competeなどのツールを使用します。

## Dockerのインストール

Dockerのインストール方法はこちらをどうぞ
https://www.youtube.com/watch?v=lZD1MIHwMBY

# コンテナの立ち上げ
Dockerのインストールが終われば、vscodeの拡張機能からDockerをインストールし、左下にある緑のマークをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302637/9b1e3df0-92cc-fd5e-f209-54a02e653605.png)
そうするとOpen Folder in Cointanerと出てきますのでクリックし、空のフォルダを作成して開いてください。私はフォルダ名をatcrに設定しました。後にパスの指定に使用しますので気をつけてください。次に検索欄にRustと打ち込んで選び、後の選択肢ではbuster、チェックを入れないでそのまま起動してください。そうすれば簡単なRust環境の完成です。

## vscodeに関する設定
### 補完機能
rust-analyzerアンインストールして拡張機能のRustをインストールしてください。
デフォルトの設定ではrust-analyzerになっていますが、コンテナの接続を切り、再び接続し直すと補完が使えなくなったためこちらを使います。


2022/12/05 追記
cargo-competeを使用するときに必要なrust-toolchainをインストールするとrust-analyzerが使えなくなることを確認しました。


### デバッグ設定
次にホームディレクトリ直下に以下のデバッグ設定ファイルを作成してください。
```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "sourceLanguages": [
                "rust"
            ],
            //"preLaunchTask": "cargo build",
            "internalConsoleOptions": "openOnSessionStart",
            "program": "${workspaceRoot}/target/debug/abc252-${fileBasenameNoExtension}",
            "args": [],
            "stdio": [
               "${workspaceFolder}/input.txt"
            ],
        }
    ]
}
```

コンテストごとにabc-252の部分を現在参加しているコンテストに書き換えてください。
例:
abcコンテスト108回 → abc-108
ホームディレクトリ直下にinput.txtを作成し入力を貼り付けてください。
そしてデバッグしたいファイルを開きF10キーを押せば開始できます。

### スニペット作成
スニペットを使うことでコードを書くことをかなり楽にしてくれます。
詳しくはこちらをご覧ください。
https://qiita.com/12345/items/97ba616d530b4f692c97
ファイル→ユーザ設定→スニペットを選択し、コマンド欄にrustと打ち込みrust.jsonを開いて、よく使うコードを書きましょう。
私はテンプレートとして以下のスニペットを登録しています。
```json:rust.json
{
    "template": {
        "prefix": "tmplt",
        "body": [
            "#[allow(unused_imports)]",
            "use proconio::{marker::*, *};",
            "#[allow(unused_imports)]",
            "use std::{cmp::*, collections::*, *};\n",
            "#[fastout]",
            "fn main(){",
            "\tlet mut ans:usize = 0;",
            "\tinput!{",
            "\t\tn:usize,",
            "\t\ta:[usize;n]",
            "\t}\n",
            "\tprintln!(\"{}\",ans);",
            "}"
        ],
        "description": "テンプレート"
    },
}
```

## cargo-competeでの設定、使い方
cargo-competeはRustで競技プログラミングを行う際のCLIの補助ツールです。
インストール方法は以下のコマンドを入力することでできます。
```bash:
$ cargo install cargo-compete
```
2022/12/6追記
コンテナが消えた時再び同じフォルダでビルドをすると思いますが、rust-toolchainのファイルがあるとcargo-competeがインストールできなくなる問題を発見しました。この場合rust-toolchainを消してからインストールしましょう。インストールした後はrust-toolchainファイルを作成してrust-toolchainをインストールしましょう。

cargo-competeを使用するのに必要なrust-toolchainをインストールしましょう。
https://doc.rust-jp.rs/atcoder-rust-resources/atcoder-env/installing-rust-toolchain.html

rust-tochainというファイルを作成し、で以下の内容を書いてください。
```rust-toolchain:
1.42
```

ファイルを作成したあとcargoのコマンドを何でもいいので実行してください。

例
```bash:
$ cargo -V
```

これでcargo-competeが使用できるようになります。

2023/2/12追記
この記事を書いたときは大丈夫だったのですがテストを実行しようとすると
error: toolchain '1.42.0-x86_64-unknown-linux-gnu' is not installed
と出てくるようになりました。ということで次のコマンドを打ってインストールしましょう。
次のコマンド
```bash:
$ rustup install 1.42.0
$ rustup install 1.42.0-x86_64-unknown-linux-gnu
```
を打つとcargo-competeでテストができるようになります。


ここからはcargo-competeを使った環境設定を行います。

```bash:
$ cargo compete i atcoder
```
とコマンドを打つことでatcoder用の環境ファイルが設定されます。

```bash:
$ cargo compete login
```
でサイトにログインを行い、

コンテストに参加するなら
```bash:
$ cargo compete participate
```
とコマンドを打ちましょう

```bash:
$ cargo compete n abc108
$ cd abc108
```
とすることでコンテスト用のフォルダ、ファイルが作成されます。
そしてコードを書き終えたら
```bash:
$cargo build
```
でビルドし
```bash:
$cargo compete t 問題のアルファベット
```
でサンプルのテストを行いましょう。ここでc問題を解いているならコマンドの問題のアルファベットの部分をcとしてください。

提出は
```bash:
$cargo compete submit 問題のアルファベット
```
で行えます。

コマンドを打つのが大変なのでスクリプトを書きました。
ホームディレクトリ直下においてください。


まず、
```bash:
$ chmod a+x build_test.bash
$ chmod a+x submit.bash
```
で実行権限を与えてから使ってください。

ビルドとテストを行うもの
```bash:build_test.bash
#!/bin/bash
contest="abc"
num=$1
aplha=$2
cd /workspaces/atcr/${contest}${num}/src/bin/
cargo build & cargo compete t ${aplha}
```
build_test.bash コンテスト 問題のアルファベット
として入力してください

例 abcコンテスト208回のd問題のビルドとテストをしたいとき
```bash:
$ build_test.bash 208 d
```

提出用
```bash:submit.bash
#!/bin/bash
contest="abc"
num=$1
aplha=$2
cd /workspaces/atcr/${contest}${num}/src/bin/
cargo compete s ${aplha}
```
こちらも同様に提出するときは
submit.bash コンテスト 問題のアルファベット
で実行してください
例
```bash:
$ build_test.bash 208 d
```


# その他インストールしたもの
ここまでコマンドが多く負担が大きいと感じたため補完機能が優れたfishシェルをインストールしました。インストールは以下の記事を見てください。ビルドやテストが楽になります。
https://qiita.com/koji9412/items/7e2a15c330c387fc5b3b

強力な補完ツールのTabnineをインストールしました。
kiteとどちらを使うか迷いました。
ローカルだとTabnineは動かないこともありますがDocker上だと安定してますね。
proconioのinput!マクロの補完できるのはいいですね。
ただし毎回Tabnineにサインインしないといけないみたいですが...。

# 今後行いたいこと
1  ビルド、テストが手打ちの部分で負担が大きいためtaskrunnerなどを使用してGUIからコマンド入力できるようにする。
2 Dokerfileでいままでの環境構築を自動化するように書き込む。
3 デバッグをコンテストごとに書き換えなくてすむようにする。
4 abc、arc、agc以外のコンテストでもテストなどができるようにする
5.cargo equipなどで外部のライブラリを使用できるようにする