Pythonで始めるAtCoder環境構築【初心者向け】

PythonでAtCoderを始める方に向けた環境構築を説明します。

本記事のレベル感としては、「Pythonを勉強したいからとりあえず競プロで勉強しよう!」ってぐらいの人向けです。

前提として、環境構築は人によって好き嫌いがあってあたりまえで、ここに書かれている方法のみが正しいわけではないです。あくまで、わたしが一番しっくりきた方法になります。また、ご使用のマシンや今後のソフトウェアアップデートで動作しない可能性があるのでご注意ください(エンジニアなら自分でなんとかしてね!)。

動作環境・ソフト

  • Windows10
  • Visual Studio Code
  • Docker Desktop
  • docker-compose

できるだけ操作を簡単に提出したい

AtCoderの詳しい説明は不要かと思いますが、始めたての頃にわたしが感じたことは、以下のようなことでした。

  • コピペ、めんどくさい
  • 実行時にテスト値を何回も打ち込むのがめんどくさい
  • ファイル管理、どうしよう….
  • 出先でも作業したいなぁ(=複数マシンで作業環境を共有したい)

AtCoderはとにかくコピペの回数が多いです。提出のたびにコードをペーストする時間的なロスは計り知れません。そこで先人たちがどのように工夫しているかを調べた結果、online-judge-toolsという拡張を使っていることがわかりました。こちらのツールを使うと、提出の自動化、サンプルデータのダウンロード、テストの実行、がコマンドで簡単に実行できるようになります。

また、出先のちょっとした空き時間にAtCoderを解きたいという個人的な需要があったので、自宅に置いたメインデスクトップのみならず、お出かけ用のノートパソコン、オフィスで借りたマシン、といったいろいろなところで環境構築できる工夫が必要でした。そこで、dockerによるセットアップにまとめることにします。

dockerで環境構築

dockerによるpython環境の構築について解説していきます。今回用意したDockerFileは以下のとおりです。

FROM python:3.8.2-buster

ENV PYTHONUNBUFFERD 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONPATH /code

RUN mkdir /code/
WORKDIR /code
COPY .devcontainer/requirements.txt /code

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install -r requirements.txt

ほとんど手のついていないシンプルなdockerファイルになります。ソフトウェア開発するわけではないので、これで十分です。さらに、dockerファイルがrequirements.txtを見るように記述してあるので、以下のようなファイルを同じ階層に追加します。

online-judge-tools
Selenium

Seleniumがなくてもonline-judge-toolsは動作するのですが、警告を出力してしまうので、その回避のためにインストールしておきます。

次に、コンテナを簡単に起動するためのdocker-compose.ymlです。こちらも同じくシンプルな記述になります。

version: '3'

services:
  atcoder:
    build:
      context: .
      dockerfile: .devcontainer/Dockerfile
    tty: true
    volumes:
      - .:/code
    ports:
      - "8000:8000"

dockerコンテナ上でVisual Studio Codeを動かす

dockerによるpythonの実行環境が用意できました。しかし、このままではかなり不便なことがあります。それは、pythonの実行がコンテナ内のcuiのみでしか確認できないということです。実際にVisual Studio Codeのターミナルからpythonを実行してみると、エラーが出力されるはずです。

これは、Visual Studio Codeがメインマシン上で実行されているため、dockerが管理するコンテナにアクセスできていないことが原因です。

そのため、Visual Studio Codeの拡張であるDev Containersというプラグインを使用します。

Dev Containersをインストールしたら、Dev Containers用の設定ファイルを追加します。追加する場所は、プロジェクトのルートに.devcontainerというフォルダを作ってそこに配置します。また、先ほど作成したDockerFileとrequirements.txtをここに移動しておきます。

AtCoder_python // ルートディレクトリ
└─.devcontainer // Dev Containers用のファイル格納場所
        ├─devcontainer.json // リモートコンテナ用の設定ファイル
        ├─DockerFile
        └─requirements.txt // コンテナにインストールさせるプラグイン一覧 

最後に、Visual Studio Codeを起動します。ただし、DockerDesktopが起動していないと、以下のように起動に失敗するので注意してください。

以上で、AtCoder向けのpython環境の構築は完了です。

提出までのワークフロー

さて、ここまで紹介してきた環境を使用して、実際にどのようにAtCoderを解いていくのか、その実際の運用を説明していきます。

Dev Containerの起動

まず、Visual Studio Codeを開きます。そして、左側のサイドバーからOpenFolderで開発環境のルートを開きます。

すると、右下にReopen in Containerというボタンが出てくるので、これをクリックします。もし誤ってボタンを消してしまった場合は、左下の緑のボタンからでも同じ操作ができます。

Dev Containerで起動する
左下からでも同様の操作になります

Dev Containerの起動に成功すると、左下の緑のボタンにDev Containerと表示されます。

online-judge-toolsの使い方

online-judge-toolsの使い方は、以下の通りです。わたしがよく使用するコマンドだけを抜粋しました。

AtCoderへのログイン
    oj login https://atcoder.jp/

各問題のサンプルデータのダウンロード
    oj d https://atcoder.jp/contests/abc256/tasks/abc256_a

テストの実行
    oj t -c "python3 abc256a.py" -d test

コードの提出
    oj s https://atcoder.jp/contests/abc256/tasks/abc256_a abc256a.py 

順番に使い方を説明していきます。まず、Visual Studio Code内でターミナルを起動するため、メニューのTerminal > New Terminalをクリックします。

このように、エディターの下部にターミナルが出現するので、そこにコマンドを打ち込んでいきます。

はじめは、作業ディレクトリの作成とディレクトリの移動です。以下のコマンドを実行します。

mkdir works/abc/abc256/abc256a //ここでは例としてAtcoderBeginnersContest256回のA問題を解く場合を想定しフォルダを作ります
cd works/abc/abc256/abc256a //カレントディレクトリをworks/abc/abc256/abc256aに移動させる

次は、online-judge-toolsを使ってサンプルデータをダウンロードしてきます。前述のコマンド集から、

oj d https://atcoder.jp/contests/abc256/tasks/abc256_a

を使用します。ojはonline-judge-toolsのグローバルコマンドで、オプションのdでデータをダウンロードを指示します。このコマンドを使用すると、カレントディレクトリにtestというフォルダが作成され、そのなかにサンプルデータが格納されます

次に実際にコードを記述していくファイルを作成します。カレントディレクトは移動せずに、問題のタイトルを冠したpythonファイルを作成します。

touch abc256a.py

問題の解き方等はここでは紹介しませんが、回答が出来上がったと仮定します。次は、そのできあがったスクリプトをテストします。テストするには、以下のコードを打ちます。

oj t -c "python3 abc256a.py" -d test

すると、ターミナルに実行結果が出力されるので、それらがACになっているかを確認してください。もしWAやREになっているとスクリプトに間違いがあるので、修正してください。(ここらは普通にAtCoderを解く場合と同じです)

さて、十分にテストしてスクリプトを提出する段階になったら、以下のコマンドを打って提出します。なお、提出の実行にはログインが必要です。

oj login https://atcoder.jp/     //AtCoderにログイン

oj s https://atcoder.jp/contests/abc256/tasks/abc256_a abc256a.py   //abc256aの問題ページにabc256a.pyを提出

提出までの一連の流れは以上になります。

ディレクトリ構成の全容

一連のワークフローを説明してきましたが、ディレクトリ構成についての全容がわかりにくいので、改めて説明します。もしABC以外のコンテスト(例えば初心者向けのAtCoder Beginners Selection)に参加する場合は、works以下にabsといったフォルダを作り、同じように答案用ファイルとサンプルを配置していきます。

AtCoder_python // ルートディレクトリ
├─.devcontainer // Dev Containers用のファイル格納場所
│
├─works // 作ったスクリプトの保存場所
│ └─abc // コンテストの種類
│   └─abc256 // 参加するコンテストのタイトル
│     └─abc256a // 回答する問題のタイトル
│       ├─test // online-judge-toolsがダウンロードしてくるサンプルデータ
│       │   ├─sample-1.in
│       │   └─sample-1.out
│       │   
│       └─abc276a.py // 回答用のスクリプト
│
├─docker-compose.yml
└─etc...

見本リポジトリ

ここで説明した環境は以下のリポジトリからご覧いただけます。ぜひ参考にしてください。また、環境を流用しても構いません。

まとめ

プログラミング初心者が躓きやすい環境構築ですが、意外にネットの参考記事は多くなく、この記事が誰かの役に立てば幸いです。競プロで強強エンジニアを目指しましょう!

返信を残す

メールアドレスが公開されることはありません。