3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-06-06

はじめに

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

Docker要素は少なめです。

環境構築

Doker、cargo-competeなどのツールを使用します。

Dockerのインストール

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

コンテナの立ち上げ

Dockerのインストールが終われば、vscodeの拡張機能からDockerをインストールし、左下にある緑のマークをクリックしてください。
image.png
そうするとOpen Folder in Cointanerと出てきますのでクリックし、空のフォルダを作成して開いてください。私はフォルダ名をatcrに設定しました。後にパスの指定に使用しますので気をつけてください。次に検索欄にRustと打ち込んで選び、後の選択肢ではbuster、チェックを入れないでそのまま起動してください。そうすれば簡単なRust環境の完成です。

vscodeに関する設定

補完機能

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

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

デバッグ設定

次にホームディレクトリ直下に以下のデバッグ設定ファイルを作成してください。

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を開いて、よく使うコードを書きましょう。
私はテンプレートとして以下のスニペットを登録しています。

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の補助ツールです。
インストール方法は以下のコマンドを入力することでできます。

$ 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というファイルを作成し、で以下の内容を書いてください。

1.42

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

$ cargo -V

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

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

$ rustup install 1.42.0
$ rustup install 1.42.0-x86_64-unknown-linux-gnu

を打つとcargo-competeでテストができるようになります。

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

$ cargo compete i atcoder

とコマンドを打つことでatcoder用の環境ファイルが設定されます。

$ cargo compete login

でサイトにログインを行い、

コンテストに参加するなら

$ cargo compete participate

とコマンドを打ちましょう

$ cargo compete n abc108
$ cd abc108

とすることでコンテスト用のフォルダ、ファイルが作成されます。
そしてコードを書き終えたら

$cargo build

でビルドし

$cargo compete t 問題のアルファベット

でサンプルのテストを行いましょう。ここでc問題を解いているならコマンドの問題のアルファベットの部分をcとしてください。

提出は

$cargo compete submit 問題のアルファベット

で行えます。

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

まず、

$ chmod a+x build_test.bash
$ chmod a+x submit.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問題のビルドとテストをしたいとき

$ build_test.bash 208 d

提出用

submit.bash
#!/bin/bash
contest="abc"
num=$1
aplha=$2
cd /workspaces/atcr/${contest}${num}/src/bin/
cargo compete s ${aplha}

こちらも同様に提出するときは
submit.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などで外部のライブラリを使用できるようにする

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?