AtCoderの挑戦環境構築(Java8)

# はじめに
AtCoderの挑戦環境が自分として満足できるところまで構築できたので
皆様のお役に立てるかはわかりませんが情報共有を兼ねて記事にまとめさせていただきました。

# モチベーション
- 自社風潮よりJavaを学習しておいたほうが良さそうに感じだしていた
- 3/1より本格的にJava学習を開始
- 習うより慣れよということで[CodingBat](https://codingbat.com/java)にて問題を解きまくり
- 問題の易しさもあり飽きが来ていたので情報収集から[AtCoder](https://atcoder.jp/?lang=ja)に到達
- 2020/3/14(土)開催の[パナソニックプログラミングコンテスト2020](https://atcoder.jp/contests/panasonic2020)にて初参加。<br>平方根の誤差調整ができずA,B2問のみという惨敗を喫した。
- その後過去問題の演習に励むが、はじめに利用していたCodingBatとは違い、<br>テストケースの容易や提出が徐々に手間と感じるようになる。<br>(問題選択ミスや言語選択ミスでのWAを何回も・・・）
- 各種情報を集めてローカル上から色々と操作できるように環境を構築。<br>問題に集中できるようになった。
- 同じ悩みを持っている人がいるかも？と思った。（今ここ）


# 対象環境
Windows10での構築をしました。
WSLでも構築できましたが、特に優劣ない状態になったのでどちらでも良いと思います。
構築後は以下のような状態になります。

- Windows10
    - Java(JDK)
    - VSCode
        - Java Extension Pack
    - WSL(選択の自由)
    - Python3(pip3)
        - online-judge-tools
    - Node.js(npm)
        - atcoder-cli

## 1. Javaのインストール
AtCoderではOpenJDK1.7.0またはOpenJDK1.8.0が使用できます。
私はJava SE 8をローカル環境にインストールしました。
1. [Java SE Downloads](https://www.oracle.com/java/technologies/javase-downloads.html)からインストーラのダウンロード
2. インストーラに従いインストール。
3. インストール場所を変えてる人も変えてない人もバージョン管理も兼ねて環境変数を調整することを推奨<br><新規> JAVA_HOME : [Javaをインストールした場所。Default:C:\Program Files\Java\jdk1.8.0_xxx]<br><更新> PATHに追加: %JAVA_HOME%\bin

## 2. VSCodeのインストール
省略。私の記事をリンクしておきます。
[Visual Studio CodeをオフラインPCで使用する](https://qiita.com/mekemeke421/items/98d5a3e2f2cc7517a6ab)
拡張機能はJava Extension Packがあれば足りると思います。
Eclipse使ってるとか他のエディタ使ってる場合は入れる必要ありません。

## 3. WSL
Microsoft Storeにて「WSL」で検索すればいくつかでてきます。
どれ入れたらいいかわからない方はUbuntu18.04で問題ないかと思います。（記事も多いです）
以降のPython3/Node.jsはWindowsに入れるか、WSLに入れるかで
参考とするページの内容も異なるかと思いますので、ここで決めておいたほうが良いでしょう。

## 4. Python3/online-judge-toolsおよびNode.js/atcoder-cli
[atcoder-cli](http://tatamo.81.la/blog/2018/12/07/atcoder-cli/)のページでこの４点の導入について優しく書いてありますので、従いながらインストールしていきます。

## 5. Javaでの提出を簡単にする工夫
上記でatcoder-cli/online-judge-toolsを導入したことで以下が簡略化しています。

- 問題に合わせたフォルダ作成(contestID/A～Fフォルダ)
- テンプレート設定したファイルの配置
- サンプルテストケース取得
- サンプルテスト判定

何かが足りません。そう、提出です。
設定方法が不足しているのか、今は機能不足で未対応なのかわかりませんが、Javaソースの提出をatcoder-cliから行うと「バージョン選択してね！」って怒られちゃいます。
online-judge-toolsでは言語指定できるので実行できるのですが、こちらだと毎回URL入力しないといけません。
・・・ブラウザのほうが楽。
なので、カバーするためにバッチを作りました。
atcoder-cliの提出操作`acc s`を借用して`accs`(空白なし)で作成しました。
(WSLの方はaliasやbashで対応できると思います。)

```accs.bat
@echo off
setlocal enabledelayedexpansion

rem --- メインシーケンス
setlocal
rem コマンド実行位置取得
FOR /F %%i in ('cd') do set pwd=%%i
rem コマンド実行位置に移動
cd %pwd%
rem ローカルパスからコンテストID、タスクIDを取得
rem 例) C:\AtCoder\abc123\a
set contest_id=%pwd:~-8,6%
set task_id=%pwd:~-1%
rem コンテストID、タスクIDをパラメータにして提出コール
call :Submit %contest_id% %task_id%
endlocal
exit /b

rem --- 提出シーケンス
:Submit
rem online-judge-toolsにて言語指定して提出
rem パラメータからURLを作成
oj submit -l Java8 --no-guess https://atcoder.jp/contests/%1/tasks/%1_%2 Main.java
exit /b
```

# まとめ
提出も無事、ローカルから出来るようになったので
ブラウザで問題確認後はVSCodeかじりつきで提出までいけるようになりました。
環境構築できた後は、ブラウザのコードテストページでコーディングしていた状況にはもう戻れません。


### 蛇足：なぜWSLでなくWindowsを選択したか
蛇足ではありますが、Windows/WSLの選択で、私がWindowsにした理由は
過去問題のテストケースファイルが名前バラバラなので、名前変更頻度が高く、
リネームコマンドの便宜性からWindowsにしています。
例1) inフォルダ内の01.txt, 02.txt, ... 20.txtを01.in, 02.in, ... 20.inにしたい
Windows: `ren *.txt *.in`
Linux: `rename txt in *.txt`

例2) inフォルダ内の01, 02, ... 20を01.in, 02.in, ... 20.inにしたい
Windows: `ren * *.in`
Linux: `rename 's/$/.in/' *`
Windowsのコマンドのほうが私には直感的なのでWindowsで作業しています。