VSCode+WSL2でAtCoderコンテスト用C++環境を構築してみる&おまけ【サマーブログリレー2021 7日目】
この記事はICONサマーブログリレー2021 7日目の記事です。
はじめに
こんにちは、プロ班?の 杞憂 です。
ネタがないので、以前のプロ班勉強会で「今度記事にするね」と言ったままほったらかしにし温めていた「AtCoderコンテスト用のローカルのC++実行環境の構築」についてご紹介しようと思います。なんか他にも「今度記事にするね」案件がいくつもあったような気がしますが、チョットヨクワカラナイデス。
4月の新歓で新入生にAtCoderを布教するときの資料として使われることも考慮しているため、説明が多めです。なので、ある程度わかっている人は適宜読み飛ばしてください。
- はじめに
- そもそもAtCoderとは?
- ローカル実行環境構築のモチベーション
- 注意事項
- 動作環境
- C++環境の全体像
- 実現したいフロー
- C++環境構築手順
- ちなみに…
- 参考文献
- おわりに
- おまけ:途中だけど記事にした理由
そもそもAtCoderとは?
AtCoderとは、競技プログラミングサイトです。AtCoder社が運営しています。このサイトでは、競技プログラミングコンテストが開催されていたり、コンテストの成績で就職が有利になるAtCoderJobsというサービスが展開されていたりします。
競技プログラミングコンテストとは、与えられた課題を解くプログラムを早く正確に書くことをみんなで競うイベントです。コンテストの開始と同時にいくつかの課題が出題されます。コンテストの参加者は、この課題の要求を満たすプログラムを制限時間内にできるだけ多く作成します。
やってみるとこの気持ちがわかってもらえると思うのですが、与えられた課題を解くプログラムを書くのは
楽しい!
です。(自分にとって)やや難しい問題をいろいろ考察して、ゴリゴリ実装して、バグとって提出してACした瞬間の「通った!!」という達成感はたまらないです。解けなかったとしても、解説記事や解説放送を見て考え方や実装方法を学んで、次に似たような問題が出題された際に解けたときは、自分の成長を感じます(またしても解けないこともありますが…)。自分のプログラミング能力を測ることもできます。
コンテストで競うのも楽しいのですが、AtCoderでは、コンテスト終了後もコンテストの過去問を解くことができます。コンテストはだいたい毎週土曜日or日曜日の夜に開催されますが、コンテスト開催まで待たなくても今すぐ過去問を解いてみることができます。
AtCoderへの登録方法などは以下の記事で説明されています。今すぐ解こう!
ローカル実行環境構築のモチベーション
「よっしゃ!さっそくAtCoderのコンテストの問題を解いてみるぜ!」
…と思ったとき、書いたプログラムが要求を満たしているかどうか試す環境が欲しくなると思います。残念ながら、私を含め多くの人間は、全くバグのないプログラムを初見で書くことはできません。さらに、提出したプログラムが不正解だった場合、ペナルティもあります(AtCoderコンテストでは提出時間に「5分×間違えた回数」のペナルティが加算される)。
そんなときすぐに利用できるツールとして、コンテストページのコードテストページが挙げられます。AtCoderのコンテストページには、コードテストページが用意されています。ちゃんと言語も選べるし、シンタックスハイライトもされてますし、コードを試すには十分だと個人的には思っています。実際、私も最初の頃はこのページでコード1書いて試してました。
別にこちらを利用し続けてもいいとは思いますが、自分のPCにコードを書く・試す環境をつくると、自分の使い慣れたエディタを使ってコードを書くことが出来ます。使い慣れたエディタであれば、コードを書きやすいですし、コードを試すのも簡単なので、結果的に早くコードを提出することができます。コード補完やデバッグ機能もあるので、ミスもしづらいです。コードを書くスピードと正確さを競うのですから、これは重要な要素です。
ということで、コードを書く・書いたコードを自分のPC上で試すために、C++環境2を構築していきます。「他の言語がいい!」という人も、似たような方法でできる…と思います(試してないので保証はありませんが…)。
今回の記事ではエディタとしてVSCodeを使いますが、Atomなど別のエディタでも似たような方法でできると思います。
注意事項
- この記事では、あえてコンパイルにかかる時間や実行ファイルの実行時間などの「処理速度」について言及していません。後者についてはそこまで遅くはないはずですが、前者は(あくまで私個人の体感ですが)ちょっと遅いかもしれません。いずれにしろ、ちゃんと測ってないので速度についてあまり言及できないというのが正直なところです。
- この記事は書きかけなので、内容を予告なく修正・加筆する可能性があります。
動作環境
Windows10 Home: version 21H1 (build 19043.1237)
VSCode: version 1.60.0
WSL: version 2
Ubuntu: 18.04LTS(20.04LTSでも大丈夫だと思います)
ハードは私が学部1年生のときの大学指定ノートPCです。なので、私より若いみなさんがお持ちのPCなら大丈夫なはずです。
C++環境の全体像
C++コードをコンパイルして実行ファイルを生成することができる環境が必要です。Windows環境に直接作るのはちょっとめんどうなので、WSL2のLinux環境に作っていきます。
Windows側のVSCodeからWSL2のLinux環境への接続には、拡張機能のRemote-WSLを利用します。
実現したいフロー
先に、完成形をお見せします。
- AtCoderの問題を解きながらVSCodeでC++コードを書く
- コードが完成したら、
Ctrl+Shift+B
で自動コンパイル - コンパイルされて生成された実行ファイルを統合ターミナルで手動実行
- AtCoderの問題ページのサンプルケースをコピって統合ターミナルにペースト
- 出力結果を出力例と比較して確認
- 必要に応じてコードを修正し2に戻る
- コードをコピーしてAtCoderのページから提出
(GIF画像を貼るつもりが、GIF画像のサイズが3MBもあったのでアップロードできなかった…)
(A問題に数分もかけてるのは気にしないでください)
C++環境構築手順
ここまで紹介してきたC++環境を構築していきます。手順は次の7ステップです。
- WSL2を使えるようにする
- WSL2上のUbuntuにgcc/g++をインストール
- WindowsにVSCodeをインストール
- VSCodeに必要な拡張機能をインストール&有効化
- Ubuntuでの作業ディレクトリの構造
- VSCodeの設定
- ALCを使えるようにする
(作業ディレクトリやVSCodeの設定ファイルなどを登録したGitHubリポジトリは、鋭意作成中です。少々お待ち下さい…)
1. WSL2を使えるようにする
WSL(Windows Subsystem for Linux)は、Windows上にLinux(とほぼ同等)の環境を構築できるWindowsの機能です。WSL version 2は、Windows10 ver.1903以降、ビルド18362以上であれば動きます。ほとんどの人は動くと思いますが、ダメだったらWindows Updateしてください。
Windowsのバージョン、ビルドは「設定>システム>詳細情報」から確認できます。
WSL2を使えるようにする方法の詳細は、MicrosoftのWSL2インストールガイドや、他の記事を見てください。ざっくりやることだけ箇条書きで挙げます。
- Linux用Windowsサブシステムと仮想マシンプラットフォームを有効化する
- WSLの規定のバージョンを2にする
- 好きなLinuxディストリビューション3を入れる
私はUbuntu18.04LTSを入れました4が、特に事情がなければ最新の長期サポート(Long Term Support)版であるUbuntu20.04LTSを選べばいいと思います。あと、試してないですけどCentOSやDebianなどの他のLinuxディストリビューションでも多分大丈夫だと思います。
2. WSL2上のUbuntuにgcc/g++をインストール
gcc/g++は、C/C++コードをコンパイルして実行ファイルに変換するコンパイラを呼び出すコマンドです。
Ubuntu18.04LTSには多分デフォルトで入っていたような気がします(私の環境ではgcc/g++のバージョンは両方7.5.0でした)。
$ gcc --version gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ g++ --version g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
もしgcc/g++がない場合は下のコマンドを実行してインストールしてください5。
sudo apt-get update sudo apt-get install build-essential
ちなみに、WSL2のUbuntu18.04LTSにアクセスしてコマンドを実行するには、
すればいいです。黒い画面のウィンドウが表示されるので、ここにコマンドを打ち込んでください。初回起動時はUbuntuのユーザ設定が始まり、「ユーザ名とパスワード決めて」と求められます。半角英数で自分の好きなユーザ名とパスワードを設定しておけばまず大丈夫だと思います。…やっぱり不安なので他の記事を見てください。
この記事を書いている(2021年9月18日)時点では、AtCoderコンテストのC++のGCCバージョンは9.2.1みたいなので、気になる人は自分で9.2.1を入れてください。私は今のところ困っていないのでデフォルトのgcc/g++のままです。
一応、GCC 9系を別に入れる場合は、
sudo apt-get update sudo apt-get install gcc-9 g++-9
を実行してください。あと、後述するtasks.json
内の"/usr/bin/g++"
を"/usr/bin/g++-9"
に、c_cpp_properties.json
内の"/usr/bin/gcc"
を"/usr/bin/gcc-9"
に書き変えてください。
3. WindowsにVSCodeをインストール
公式からインストールしてください。詳細は他の記事に譲ります。再インストールしたくないんです許してください
英語が苦手な方は日本語化も出来ます。私も日本語化してます。
4. VSCodeに必要な拡張機能をインストール&有効化
インストール&有効化するのは次の3つです。
- Remote-WSL:WSL2のLinuxディストリビューション(今回はUbuntu18.04LTS)に接続するアドオン
- C/C++:VSCodeでC/C++開発のためのコード補完やデバッグ機能を提供するアドオン
- C++ Intellisense:C++コード補完やデバッグ機能を強化するアドオン?ほんとに?
注意点:2.と3.についてはWindows側ではなく、WSL2のUbuntu側で有効化してください。
5. Ubuntuでの作業ディレクトリの構造
ホストマシンであるWindows側ではなく、WSL2上のUbuntu側のディレクトリ6にC++コードや設定ファイルを置きます。次のような構造になるように、ディレクトリやC++コード、設定ファイルなどを置きます。
atcoder/ #ユーザディレクトリ直下 ├ .vscode/ #VSCodeの設定ファイルたち │ ├ c_cpp_proprtties.json #Intellisense │ ├ launch.json #Debug │ └ tasks.json #Build ├ ABC/ #AtCoder Beginner Contest │ ├ (略) │ ├ 217/ #ABC217 │ └ 218/ #ABC218 │ ├ a.cpp #A問題 │ ├ b.cpp #B問題 │ ├ (略) │ └ h.cpp #H問題 ├ ac-library/ #AtCoder Library ├ AGC/ #AtCoder Grand Contest ├ ARC/ #AtCoder Regular Contest ├ abcsetup.sh #2xxディレクトリを作るスクリプト ├ problem.exe #出力された実行ファイル ├ problem.in #Debug時の入力 └ template.cpp #C++コードのテンプレ
コンテストの種別ごとにディレクトリを分けていて、さらにその中で第何回のコンテストかでディレクトリを分けています。このディレクトリの中に、A問題ならa.cpp
、B問題ならb.cpp
というファイル名でC++コードファイルを作成します。
C++コードの実行ファイルはatcoder
ディレクトリ直下に、problem.out
という名前で生成されるようにします7。これは、統合ターミナルでいちいちカレントディレクトリを移動したり、解いた問題に対応した実行ファイルをいちいち探す手間を省くためです。
VSCodeのデバッグ機能は、テストケースを統合ターミナルから入力することはできないみたいです。このため、problem.in
というファイルにテストケースを入れておき、このファイルをデバッグ時の入力とするよう設定します(この記事ではデバッグ機能については省略しています)。
6. VSCodeの設定
自動コンパイルの設定
まず自動コンパイル設定から。VSCodeはコンパイルしたいC++コードを選択した状態(C++コード内でカーソルが点滅してる状態)でCtrl+Shift+B
を押すと、設定ファイルに従ってVSCodeが自動でそのC++コードをコンパイルしてくれます(ビルドと呼びます)。このビルドの設定はtasks.json
に書きます。
tasks.json
{ "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "/usr/bin/g++", "args": [ "-std=gnu++17", "-Wall", "-Wextra", "-O2", "-DONLINE_JUDGE", "-I/opt/boost/gcc/include", "-L/opt/boost/gcc/lib", "-I${workspaceFolder}/ac-library", "-o", "'${workspaceFolder}/problem.exe'", "'${file}'", ], "group": { "kind": "build", "isDefault": true } } ] }
"args"
の中のコンパイルオプションは、下のページのC++(GCC 9.2.1)でのコンパイルコマンドを参考にしています。
${workspaceFolder}
は、VSCodeの設定ファイル内で使える変数の1つで、VSCodeで開いているフォルダのパスが入っています。私の場合は、Ubuntu上のatcoder
ディレクトリを開いていて、このディレクトリはユーザディレクトリ直下に置いているので、変数の中身は/home/ubuntu18/atcoder
となります。
この変数を使うことで、atcoder
ディレクトリの位置が違っても大丈夫なようにしています。ABC
ディレクトリとかproblem.exe
とかが入っているディレクトリをVSCodeで開いていれば、このディレクトリがユーザディレクトリにあろうがもっと深いところにあろうが対応できます。ディレクトリの名前がatcoder
ではなくても大丈夫です。
インテリセンスの設定
次はインテリセンスの設定です。C++コード補完が効くようになります。
c_cpp_properties.json
{ "configurations": [ { "name": "WSL", "includePath": [ "${workspaceFolder}/ac-library/", "${workspaceFolder}/**" ], "defines": [], "compilerPath": "/usr/bin/gcc", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "linux-gcc-x64" } ], "version": 4 }
この設定は、C言語とC++言語の両方を対象としているため、コンパイラにはC言語ファイルもC++言語ファイルとしてコンパイルしてしまうg++
ではなく、区別してくれるgcc
を用います。
7. ACLを使えるようにする
ACL(AtCoder Library)とは、AtCoder側が様々なアルゴリズムをC++で実装したライブラリです。多くのAtCoderコンテストで使用できます。ACLを使うと、自分で実装するのは大変なアルゴリズムを、コード実装時に比較的簡単に利用することが出来ます(しかし、当然アルゴリズムをある程度は理解していないと、問題を解くときに「このアルゴリズムが使えるかも」や「こういう特性があったはずだからこう工夫すればできる」といった思考ができないです。あくまで実装を支援してくれるものです)。
実は前述のディレクトリ構造、tasks.json
、c_cpp_properties.json
に既にACLを使うための配置・設定が書かれています。上のページからダウンロードしてきたファイルを展開して、ac-library
ディレクトリをatcoder
ディレクトリ直下に置きます。そして、2つのVSCode設定ファイルにac-library
ディレクトリのパスを書きます("-I${workspaceFolder}/ac-library",
、"${workspaceFolder}/ac-library/",
の部分です)。
あとは、C++コード内に#include <atcoder/all>
と書くだけで使えるようになります。
ちなみに、拡張子の無いC++標準ライブラリのヘッダーを読み込む場合は本来C++に関連付ける必要がありますが、VSCodeのC/C++拡張機能が勝手にやってくれます。その際にsettings.json
に以下が書き込まれます。「いつの間にかsettings.json
が作成されてた」という現象が起きたら、これが原因かもしれません。
settings.json
{ "files.associations": { "ostream": "cpp", "iostream": "cpp" } }
ここからは、私が個人的にやっている工夫を2つ紹介します。
C++コードのテンプレ
C++コードには、よく使うファイルのインクルードや、よく使うマクロとかがあります。以前までは毎回コピペしていましたが、コンテストのたびにコピー元を開いてコピーしてコードにペーストして…めんどくさいと感じていました。なので、これらをtemplate.cpp
に書いておき、a.cpp
やb.cpp
を作成するときにcp
コマンドでコピーするようにしました。
template.cpp
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rep1(i, n) for (int i = 1; i < (int)(n+1); i++) using ll = long long; using P = pair<int,int>; using Graph = vector<vector<int>>; using mint = modint1000000007; int main() { int n; cin >> n; int ans = 0; cout << ans << endl; return 0; }
cp
コマンドでコピーして生成するときは、統合ターミナルで次のように書いて実行します(実際は、矢印キーで過去のコマンドを呼び出して、ちょこっと書き換えて実行してます)。
cp -n template.cpp ABC/219/a.cpp
ちなみに-n
のオプションは、既に作成したいファイルがあったときに上書きしてしまわないようにするためです。
2xxディレクトリ&C++ファイル作成を簡単に
とはいえ、マウスで手動で「新規作成」とかのボタンをポチポチしたり、mkdir
コマンドとかcp
コマンドとか何回も実行したりしてディレクトリやC++ファイルを作成するのは面倒くさいので、ABC
ディレクトリ下に2xx
ディレクトリとA問題からH問題までのC++ファイルの作成をしてくれるシェルスクリプトabcsetup.sh
を書きました。
abcsetup.sh
#!/bin/bash if [ $# -ne 1 ]; then echo "Usage: $0 2xx" 1>&2 exit 1 fi if ! [[ "$1" =~ ^[1-9][0-9]{,2}$ ]]; then echo "Usage: $0 2xx (x=[0-9])" 1>&2 exit 1 fi if [ ! -e ABC ]; then echo "Error: directory 'ABC' not exists." 1>&2 exit 1 fi mkdir -p ABC/$1 cp -n template.cpp ABC/$1/a.cpp cp -n template.cpp ABC/$1/b.cpp cp -n template.cpp ABC/$1/c.cpp cp -n template.cpp ABC/$1/d.cpp cp -n template.cpp ABC/$1/e.cpp cp -n template.cpp ABC/$1/f.cpp cp -n template.cpp ABC/$1/g.cpp cp -n template.cpp ABC/$1/h.cpp exit 0
コマンドライン引数とは、コマンドを実行する際に与えられる文字列の集合のことです。例えば、command
という架空のコマンドを実行することを仮定します。command 123 abc
と入力して実行した場合は文字列123
と文字列abc
がコマンドライン引数です。この場合コマンドライン引数は2個です。command def
であればdef
がコマンドライン引数で、数は1個です。command
であればコマンドライン引数は無し、数は0個です。
7~10行目で、入力されたコマンドライン引数が期待された値かどうかをチェックします。具体的には、1~999であればOKです。
12~15行目で、実行したディレクトリ下にABC
ディレクトリがあるかどうかチェックします。存在すればOKです。
17行目で、入力されたコマンドライン引数の名前でディレクトリを作成します。作りたいディレクトリがすでにある場合は、エラーメッセージを出力して終了します。
19~26行目で、作ったディレクトリ下にa.cpp
からh.cpp
までの8つのC++ファイルを作成しています。
使い方は、例えばABC219の問題を解きたい時は、
./abcsetup.sh 219
と統合ターミナルに入力して実行すれば、下のように219
ディレクトリとその下にa.cpp
からh.cpp
までのC++ファイルが作成されます。
ABC/ └ 219/ ├ a.cpp ├ b.cpp ├ c.cpp ├ d.cpp ├ e.cpp ├ f.cpp ├ g.cpp └ h.cpp
ちなみに、カレントディレクトリ直下にABC
ディレクトリが存在しなかったり、すでに作りたいディレクトリ(今回の例では219
ディレクトリ)が存在している場合は、ディレクトリとファイルの作成はせずに、エラーメッセージだけ出力して終了します。
以上で環境構築は終了です。
ちなみに…
Windows上にgcc/g++をインストールしたい
MinGWというソフトウェアでWindows環境にGCCを入れる方法もあるみたいです。
GCCって何?
余談ですが、GCC(GNU Compiler Collection)とは、C、C++、Fortranなどのいくつかの言語のコンパイラを集めたものです。
gcc/g++は、このGCCのcompiler-driverです(つまり、コンパイラを呼び出すコマンドです)。
gccとg++は、ファイルタイプによってC/C++のコンパイラであるcc1/cc1plusのどちらを呼び出すか選択します。
ACLを別の場所に置きたい
例えば、boost
(Boost C++ライブラリ)と同じ様に/opt
直下に置いた場合は、tasks.json
、c_cpp_properties.json
の"-I${workspaceFolder}/ac-library",
、"${workspaceFolder}/ac-library/",
の部分を"-I/opt/ac-library",
、"/opt/ac-library/",
と変更します。
参考文献
参考文献一覧
おわりに
- WSL2のUbuntu上にC++実行環境をつくった
- VSCodeからUbuntu上のC++コードを作成・編集できるようにした
- C++コードをコンパイルして生成した実行ファイルを、VSCodeの統合ターミナルから入力を与えて実行できるようにした
- ABC用のディレクトリ・C++コードを簡単に生成できるようにした
デバッグとコード整形については、また別の記事に書きたいな~と考えています。
ここまでお付き合いいただきありがとうございました!
おまけ:途中だけど記事にした理由
「記事にするね」と言ってから時間が空いてしまった理由の一つに「完璧に準備を整えてから書こう」という気持ちがありました。
デバッグやコード整形もちゃんと使いこなせるようにならなきゃ。C++コードのビルド時間もちゃんと測って比較しないと。Remote-WSLでWindows側のVSCodeとWSL上のインスタンスが通信してるっぽいけど、WSL上のインスタンスとWindowsのデータの通信方法も詳しく知らないからちゃんと理解しないと。/mnt/c/
のパスでアクセスするのと何が違うのだろう。。。
そんなことを思っていた私は、とある動画に出会いました8。
この動画のお二人のプロ意識にも感銘を受けたのですが、この動画のコメント欄で、漫画「ベルセルク」の有名なセリフが取り上げられていました。
それとも お前 何十年も修行して
達人にでもなるのを待ってから戦場に出るつもりか?
気の長げェ話だな
(中略)
だったら
今 手持ちのコマでやりくりするしかねェだろ
-- 漫画「ベルセルク」主人公 ガッツ
その通りだと思いました。WIPの文化があることも、とにかくまずアウトプットしろってのも知識としては知っていたけど、気を抜くとすぐ私はこのことを忘れてしまう。
この影響を受けて、この記事をさっさと公開しようと思いました。
ちなみに本編はこちらです。私は絵描きを目指してるわけではないのですが、私には刺さりました。長年プロとして第一線で活躍されている方々の経験談には、もっと抽象化されて広く応用できる要素が多く含まれているなぁと感じました。
-
この記事ではコードをプログラムと読み替えてもほとんど困らないと思います。↩
-
C++を選んだのは、C++の書き方を知っていると競技プログラミング関連の情報を入手しやすいからです。公式解説放送も(「問題の考え方」の部分はあまりプログラミング言語関係ないですが)実装例はC++、ACLも公式の実装はC++(有志が実装した他言語版ACLも存在する)、あとなぜか競プロerはC++ユーザが多いらしい[要出典]。とはいえ、他の言語での情報も充実してきています。AtCoderコンテストに参加してるICONメンバーも、C、Java、Python、C#などなど、みんな好きな言語でやってます。ぶっちゃけどの言語でやってもいいと思います。よくよく考えると、私にはC++&DxLibやOpenSiv3Dでのゲーム制作でC++の経験があった、というのも大いに影響しているような気がしてきました。↩
-
Linuxディストリビューションとは、OSのコアであるLinuxカーネルとそれ以外の様々なソフトウェアを組み合わせ、これを使いやすい状態にして配布されているものです。本来、Linuxカーネル(これだけでは実際に使えるOSとしては成立しない)と様々なソフトウェアを1から自分で組み合わせるのは大変です。しかし、配布されているLinuxディストリビューションを利用すれば、ユーザは簡単に実際に使えるOSを動かすことが出来ます。詳細は第2回 ディストリビューションとは|Linux技術者認定機関 LPI-Japan [エルピーアイジャパン]↩
-
WSL2は複数のインスタンスを作ることが出来て、それぞれに別のディストリビューションを入れられます。私はUbuntu20.04LTSが入ったインスタンスを別の用途で使っていたので、新しくUbuntu18.04LTSが入ったインスタンスを作成して追加しました。↩
-
正確には、この2つめのコマンドを実行するとgccとg++の他にdpkg-devやlibc6-devやmakeもインストールされてしまいます。今回の記事では使いませんが、あると便利なので入れました。どうしても気になる人は、2つめのコマンドを実行する代わりに「sudo apt-get install gcc g++」としてください。↩
-
基本的に、複数の問題の実行ファイルを両方保持しておきたいケースってほぼないです。たいてい該当コードを修正してからコンパイルして実行ファイルを生成するので、1つで十分です。少なくとも私は1つで十分でした。↩
-
私には、絵が描きたくなる時期が周期的にやってきます。今はまさにそのシーズンです。この動画には、お絵描きの練習方法が以前調べたときと大きく変わってないかを確認していたときに出会いました。↩