ICPC アジア地区予選での環境構築

2019/01/08 追記: JetBrains がスポンサーになったおかげで (?) 環境が劇的に改善し、JB 製 IDEAtom, Sublime が使えるようになりました。 VM が配布されているので試してみて不都合なければこの記事の内容は不要です。

Computing Environment for the Contest | ACM-ICPC 2018 Asia Yokohama Regional


あと数ヶ月で ICPC アジア地区予選つくば大会が開かれます.例年通りならば,アジア地区予選では運営が用意したパソコンを使わなければいけないので,競技開始後に選手は必要に応じて設定ファイルを書き,そのパソコンに入っているエディタでコードを書かなければいけません.Visual Studio とか,濃厚にカスタマイズされた Vim はダメなので注意してください.(Eclipse などのフリーの IDE が使えることはあります.)

そのため,素の Gedit を使うとかでもない限り準備が必要で,各チームで打ち合わせておく必要があります. Twitter 上でそのへんどうしようかなーという話を見かけたので,私が行っていた設定を紹介してみます.2015 Asia Taipei regional, 2016 Asia Tsukuba regional で使ったもので,両方共,当時最新の Ubuntu LTS でした (今年の環境もそのうち公開されるでしょう).

エディタ (Emacs)

ICPC ではパソコンが 1 台しか使えないので,チームメイトのエディタを揃えたほうが有利です.World Final 2017 の放送を眺めると分かりますが,チームによって様々です.私は Emacs を使っていたので,Emacs の設定方法のみ紹介します.

~/.emacs

Emacs の良い点は,数行の設定を書けば,自動インデントやコンパイルエラーのハイライト,gdb との連携などの最低限の機能と,軽さ,シンプルさが両立できる点です.

ホームディレクトリに .emacs というファイルを作成し,次のように記述してください.もちろんチームの Emacs ユーザーに聞いて追記・削除してください (いないなら使うべきではない).

(global-set-key "\C-z" 'undo)            ;; C-z で Undo
(global-set-key "\C-s" 'isearch-forward) ;; C-s で検索
(global-set-key "\C-r" 'query-replace)   ;; C-r で置換
(global-set-key "\C-j" 'dabbrev-expand)  ;; C-j で補完
(global-set-key "\C-h" 'keyboard-quit)   ;; C-h (ヘルプ) の誤爆は頻発するので keyboard-quit か delete-backward-char に当てる
(global-linum-mode t)                    ;; 行番号を表示
(setq inhibit-startup-message t)         ;; 起動時のメッセージを無効化
(show-paren-mode t)                      ;; 対応する括弧の表示
(add-hook 'c++-mode-hook 'flymake-mode)  ;; C++ のコードを開いたときに flymake を有効にする

Emacs の設定を書く場所は他にも複数あり~/.emacs.d/init.el 等がそうです.Emacs を初めて起動した際に ~/.emacs が無ければ ~/.emacs.d/init.el が自動で作成されます.~/.emacs が優先されるのでそのままでもいいのですが,混乱防止のため消してしまっても良いですし,そちらに書いてもいいです.

~/Desktop/Makefile

コンパイルエラーのハイライトは Emacs 組み込みの flymake という拡張機能で実現できます.使えるようにすると,コンパイルエラーを解析して行番号などの情報を取得し,エディタ上に表示してくれます.ICPC の環境では,インターネット上のパッケージが使えないので,Makefile を使った設定が最もシンプルでおすすめです.

コードと同じ場所 (後述の理由で Desktop がおすすめ) に Makefile という名前のファイルを作り,次のように記述します.インデントは必ずタブにしてください.(はてなブログに貼ると勝手にスペースになってしまう…)

check-syntax:
    g++ -Wall -Wextra -fsyntax-only -std=c++11 $(CHK_SOURCES)

g++ に与える引数のうち,-fsyntax-only$(CHK_SOURCES) は必須です.-Wall, -Wextra は,未使用の変数があるとかの警告を最大限に出すようにする設定です.うるさいと思ったら適当に消すなどしてください.-std=c++11 は,C++ 11 を有効にする設定で 03 で良いなら消してください.

以上の設定をすると,GCC が検出できた変なところに下線が付き,マウスカーソルか,エディタ上のカーソルを持って行くと説明がポップアップで表示されます.Clang の方が賢いので使えるなら g++clang++ に変えた方が良いです (本番ではたぶん使えない?).

f:id:tubo28:20171003200106p:plain

Bash

Bash が使えます.~/.bashrc に次のように書いていました.

bind 'set completion-ignore-case on'        # 大文字小文字を無視して tab 補完
ulimit -s 1048576                           # スタックメモリ 1GB でオーバーフロー防止
alias g="g++ -Wall -Wextra -std=c++11 -g"   # 積極的に警告・C++11・デバッグ情報を埋め込み
alias a="./a.out"
alias l="ls"
alias k="ls"
alias e="emacs -nw"                         # Emacs をターミナル内で起動

キーボード

本番前の話です.公式の発表がないので分かりませんが,いつも使っている物は使えないかもしれないので,英字配列の練習が必要かもしれません.私のときはなんかブヨブヨする英語のキーボードでした (持ち込み可にしてほしいなあ).

その他

  • 前日の練習セッションでどれだけ WA を出してもいいので,新しい C++ は使えるか,スタックは深いか,実行速度はどのくらいかなどを見ておく.
  • Ctrl+Super+Left, Ctrl+Super+Right とか Unity の使い方を覚えておく.
  • チームで少なくとも 1 人は PythonRuby (irb) の使い方を覚えておく.電卓として使えますし,乱数ケースがサッと作れるので便利です.
  • 下の画像は Codeforces ですが,Firefox でファイルを提出するとき,ボタンにドラッグアンドドロップしても選択したことになります.だから Desktop で作業すると楽です.

f:id:tubo28:20171003193957p:plain

まとめ

以上です.準備もコンテスト時間に含まれるのであまり高度なことはできませんが,チームで相談して,最低限の手順リストのようなものは用意しておいた方が良いと思います.他にこういうのもいいよーというのがあれば教えてください.

選手の皆さんの検討を祈ります.