hotaruの蛍雪日記

競プロとゲームをしています

WSLでonline-judge-toolsを使う

2021年1月15日に加筆訂正 文体を修正・Codeforcesに提出できると読み取れるのでその文を修正

WSLでonline-judge-toolsを使いました。 最近サンプルケースも通らない提出をすることが増えたので、online-judge-toolsを導入することにした。 今までGUI環境がないWSLではonline-judge-toolsの多くの機能が使えないと勘違いしていました。 メモする。

この記事は2020年11月10日書かれたものですので、記事の内容は誤りになる可能性があります。

WSLとは

LinuxWindows サブシステムを使用すると、開発者は、従来の仮想マシンまたはデュアルブート セットアップのオーバーヘッドなしで、ほとんどのコマンド ライン ツール、ユーティリティ、アプリケーションを含む GNU/Linux 環境を変更せずそのまま Windows 上で直接実行できます。 アクセス日:2020年11月10日 https://docs.microsoft.com/ja-jp/windows/wsl/about

WindowsGCCを使うためにWSLを使います。 WSLの似たようなものとしてCygwinやMSYS2(MinGW)があります。 私にはWSLとCygwinとMSYS2(MinGW)のどれを選ぶべきなのかわかりません。 新しい・MSが力を入れている・知見の多いUbuntuを使える(この表現は怪しい)のでWSLを使います。

online-judge-toolsとは

oj コマンドは競技プログラミングを行う上で存在する典型作業を自動化するためのコマンドです。 アクセス日:2020年11月12日 https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md

次のことができる。

  • テストケースのダウンロード。
  • 自動テスト。
  • コマンドで提出。

online-judge-toolsを使おう

私は今まではonline-judge-toolsを使っていませんでした。 online-judge-toolsはコンテストサイトにログインするときにGUIを使います。 なのでGUI環境が無いWSLでは使えないと思っていました。 ですがWSLでも使えるようです。

まず(コンテスト中の問題を除いて)テストケースのダウンロードとテストはログインしていなくてもできる。 ログインだが、AtCoderCodeforcesCLIからログインできるし、他のサイトではWindowsからログインすればよかった。

公式ドキュメントを読もう

公式ドキュメント

下準備

  • OSはWindows 10。
  • ブラウザがインストールされているものとする。
  • Python3をインストール。
  • pipよりonline-judge-tools, Seleniumをインストール。
  • WebDriverをインストール。
  • Ubuntu(WSL)をインストール。
  • WSLのAPTよりpython3-pipをインストール。
  • WSLのpip3よりonline-judge-toolsをインストール。

次をすべて満たしたら下準備が終了です。

  • Seleniumを起動できる。
  • ojコマンドが使える。
  • WSLのojコマンドが使える。

WSLのpip3よりonline-judge-toolsをインストールすると、パスが通っていないという警告が出たので通しました。

# シェル: fish WSLのユーザー: hotaru_wsl
set -U fish_user_paths /home/hotaru_wsl/.local/bin $fish_user_paths

Python・WSL・Seleniumの準備はほかの解説を読んでください。

設定

online-judge-toolsはSupported websitessubmit codeが✔️のサイトに提出できる。

今回はyukicoderのこの問題に提出する。

サンプルケースのテスト

問題のサンプルケースをダウンロードする。

# WSL
oj d https://yukicoder.me/problems/no/9010

サンプルケースをテストする。

# WSL
# ./a.outがテストするプログラムとする。
oj t

提出

WSLより提出しようとするとログインしろとエラーが出る。

# WSL
# main.cppが提出するファイルとする。
oj s main.cpp


# 前略
[ERROR] You are not logged in. Please run $ oj login https://yukicoder.me/problems/no/9010

ログインしようとするとエラーが出る。

# WSL
oj login https://yukicoder.me/problems/no/9010


# 前略
[ERROR] No WebDriver is available.
[HINT] Please install a WebDriver.
See https://www.selenium.dev/documentation/en/webdriver/driver_requirements/

Detailed instructions:
    If you use Ubuntu:
        1. Run $ sudo apt install chromium-chromedriver firefox-geckodriver
    If you use Ubuntu under Windows Subsystem for Linux:
        1. Make a symbolic link from cookie.jar in WSL to cookie.jar out of WSL. For example, run $ ln -s /mnt/c/Users/%USERNAME%/AppData/Local/online-judge-tools/online-judge-tools/cookie.jar /home/ubuntu/.local/share/online-judge-tools/cookie.jar
        2. Use `oj login` outside of WSL
    If you use Windows:
        1. Install Chocolatey. See https://chocolatey.org/
        2. Run > choco install selenium-all-drivers
# 省略

エラーを読むとWSLの場合の対処法が書いてある。 これを行う。

シンボリックリンクを作成する。 例のコマンドの%USERNAME%WindowsのユーザーubuntuWSLのユーザーに置換して実行する。

# WSL
# Windowsのユーザー: hotaru_win WSLのユーザー: hotaru_wsl
ln -s /mnt/c/Users/hotaru_win/AppData/Local/online-judge-tools/online-judge-tools/cookie.jar /home/hotaru_wsl/.local/share/online-judge-tools/cookie.jar

Windowsでyukicoderにログインする。

# Windows
oj login https://yukicoder.me/problems/no/9010

では提出します。

# WSL
# main.cppが提出するファイルとする。
oj s main.cpp

おわり

  • online-judge-toolsをこれから使いこなしていきます。
  • 使いたいオンラインジャッジへの提出に対応していなかったのが少し残念(contributeチャンスですよ!)。
  • Codeforcesに提出する機能は消えました。詳しくはIssue参照。
  • ojするVSCodeのビルドタスクを作る。