はじめに
競技プログラミングの精進中、電車の中とかで解法を思いついて急にコードを書きたくなることって、ありますよね。あることにします。
個人的に、そんなときに手元にはAndroidスマホ1台しかない、という状況がよくあるので、それでも最低限なんとかできる環境を整えてみました。
スマホの物理的に狭く誤操作しやすいスペースで、VSCodeなどのリッチなアプリを操作したり、複数のアプリを並行して使用するのが面倒だったので、できるだけ端末(CLI)1枚に閉じて完結する環境を目指した結果、自分なりには満足できる環境が整いました。
この記事はその作業メモです。
あくまで自分の環境ではこれで出来ましたよという記録です。構築手順や安全な環境を保証するものではありませんので、ご了承ください。
環境
- 端末: Xperia 10 VI SOG14
- Anodoid バージョン: 14
- 使用言語 : C++
動作イメージ
最終的にこんな感じになります。(gif 1分43秒)(クリックして拡大)
手順
termux をインストール
termux はAndroid上で使用できる端末エミュレータです。READMEなどによると、Googel Play ストアでの更新やサポートは終了しているということなので、F-Droid からダウンロードしてインストールします。
セキュリティ面のリスクは自己判断でお願いします
コンパイル環境を整える
C/C++ コンパイラと、使用したいテキストエディタをインストールします。
termux 内の環境はある種の疑似環境のようで、sudo などによるユーザ権限の切り替えは不要だそうです。使用するパッケージも termux 用にビルドされたものだそうなので、 pkg
というコマンドを使用します。使い勝手はほぼ apt と同様だと思います。
$ termux-change-repo
$ pkg upgrade -y
$ pkg install -y neovim
$ pkg install -y clang
コンパイルオプションのalias定義
コンパイル時にいちいちオプションを手書きするのが面倒なので bash
に alias 定義を追加しました。
clang
は gcc(g++)
とは別のコンパイルドライバですが、自身を gcc(g++) に見せかける状態をインストール時に作成するので、慣れた名前のそちらを使用します。
ついでに、スマホのソフトキーボードで +
を入力するのが地味に面倒だったので、普段は "gcc" を使用することにしました。
alias g++="g++ --std=c++20 -g -O0 -Wall"
alias gcc="g++"
atcoder-cli のインストール
結果からいうとそれほど特別なことはなく、atcoder-cliの開発者様のブログ など先達のノウハウを参考にさせていただいて構築できました。
ただし、termux の初期状態では、今どきの linux ディストロの最小インストールでも入るような、かなり基礎的なコマンドもインストールされていませんので、エラーになった場合は随時足りないパッケージを追加していく 必要があります。(今後の作業はすべて同様)
エラーになった場合は、ログをさかのぼるとエラーが出始めたあたりに「このコマンドが見つからない」という警告があるはずです。足りないと言われたコマンドを実際に投入してみると、このパッケージをインストールしろというメッセージが出る親切設計なので、難しいことはないと思います。
Node.js, Python3 のインストール
atcoder-cli と online-judge-tools 用に Node.js と Python3 をインストールします。
$ pkg install -y nodejs python3
npm
コマンドで atcoder-cli をインストールします
$ npm update -g npm
$ npm install -g atcoder-cli
online-judge-tools のインストール
pip3
コマンドで、online-judge-tools をインストールします。
$ pip3 install online-judge-tools
おそらく追加が必要なパッケージ
私の環境の場合は online-judge-tools のインストール時に以下のパッケージの追加が必要になりました。
- python-lxml
- rust
$ pkg install -y python-lxml rust
動作確認
コンテストディレクトリを作成
実際に AtCoder にコードを提出できるかを確認します。適当なコンテストを選んで acc new
で作業ディレクトリを作成します。
$ acc new abc001
おそらく追加が必要なパッケージ
私の環境では python の distutils
パッケージがないというエラーが発生しました。検索してみるとこちらは現在は廃止されたパッケージとのことでしたので、代わりに setuptools
モジュールを追加します。
$ pip3 install setuptools
提出用コードの作成
acc new コマンドが正常に終了したら作成されたディレクトリ配下で提出用のコーディングをします。
コーディングができたらローカルでコンパイルします。
$ cd abc001/a
$ vi main.cpp
$ g++ main.cpp
このタイミングで自分がコンパイルに使いそうなパッケージを追加でインストールしました。
- binutils
- ld
- ldd
$ pkg install -y binutils ld ldd
コンパイル時にライブラリが見つからないエラーがでる場合
clang
をインストールしたままのシェルで作業している場合は、いったんログアウトして termux を再実行すると解決するような気がします。
サンプルを使用したローカルテストの実行
oj t
コマンドを使用してあらかじめダウンロードされているサンプルを使用したテストを実行します。
$ oj t -d tests
テストの実行はできましたが、GNU time がないという警告が出たので追加しました。
$ pkg install -y time
オンラインジャッジへのコード提出
acc submit
コマンドを使用して、AtCoder にコードを提出します。
提出前に acc login
で AtCoder にログインしておきます。
$ acc login
$ acc submit main.cpp
ログイン状態に関するエラーが出る場合は、出力されている内容に従って、いったん oj login
コマンドで online-judge-tools 側でログインした実績を作れば、うまくいくと思います。
termux の場合上記のような「Webブラウザが実行できない」旨のエラーが出ると思いますが、前段が SUCCESS になっていれば提出は成功していますので、別のWebブラウザから提出結果にアクセスすれば、結果を確認できます。
以上で最低限の環境構築は終了です。ここからの環境改善は先達のノウハウと同様だと思いますので、ご自分の好みに合わせて環境を変更してください。
おまけの環境構築(非推奨部分)
bits/stdc++.h作成
競プロ勢が好んで使う bits/stdc++.h は本来 GNU が配置しているものなので、clang
を使用する本環境には存在しません。が、面倒くさいので自分は手で作ってしまいました。
具体的には、/data/data/com.termux/files/usr/include/c++/v1/bits/stdc++.h を勝手に作って、中身で c++/v1 配下にあるヘッダファイルを全部 include しただけのファイルを作成しています。
提出結果取得用Webスクレイピングスクリプト
ジャッジ提出時、提出結果を見るためにWebブラウザを操作するのが面倒だな、CLIで表示できないかな、と思ってしまったので、なんとかしようとしたら、なんとかなってこんな感じになりました。
不具合とかの責任を負いたくないので迷いましたがせっかくので GitHub に公開しておきました。GitHubの使用自体初めてなので、手違いなどはご容赦ください。使用は自己責任でお願いします。
コード提出時の確認プロンプト
online-judge-tools の仕様により、コードの提出時には確認プロンプトが表示されます。
ソースを覗いてみたところ、上記の警告は acc new
が作成するディレクトリパスと oj
側が想定しているパスが食い違っていることが原因のように見えましたが、環境を整えて警告がでないようにしたとしても、結局 Yes or No のプロンプトは出力されるようです。
自分の使い方の範囲で、acc
を使用して AtCoder のみを対象にしている限りはここでミスオペしている可能性はまずないはずなので、作者様に失礼かなと思いましたが、ローカルのスクリプトを少し弄ってプロンプトの表示を抑止しています。
具体的には、submit.py の run 関数内の confirm の処理部分をコメントアウトしています。
さいごに
有用なツールを公開してくださっている方々に感謝します。利用されている方は、ぜひ GitHub にスター★(いいね的なもの)をつけにいきましょう。