その2 URL https://qiita.com/Wing2C1/items/216691583c1767c60d70
その3 URL https://qiita.com/Wing2C1/items/e11cf2e2ce938205d130
その4 URL https://qiita.com/Wing2C1/items/dbb2c728a8300c3b2919
0.動機
友人が学校の祇園祭で作ったやつ(それはGo言語だった)は、まさしくAtcoderのような競技プログラミング風ジャッジシステムだったんですが、それを見て作りたくなったなーって。今回は、Debianの仮想マシンを使ってローカルでジャッジできるようにしたいっていう試み。せっかくだし、やったことない人でもわかるような解説を心がけてみようと思う。
1.目指したいこと
ホストマシン上にの仮想マシンを構築する。ユーザーから受け取ったファイルを使って正誤判定してユーザーに返す、というものを作る。そして、ユーザーが不正にサーバーにアクセスすることが出来ないようにもしておきたい。
2.共通の環境構築
まず、最初にホストマシンの推奨スペック。満たさない場合、制作は難しいといっていいだろう。このの情報は、Windowsの設定、システム、バージョン情報から確認できる。CPUのコア数に関しては自分で調べてほしい。
| 名称 | 推奨 |
|---|---|
| 空きストレージ(バックアップ含む) | 70GB以上 |
| 空きストレージ(バックアップなし) | 40GB以上 |
| メモリ(RAM) | 16GB以上 |
| CPU | 8コア(16スレッド以上) |
そして最初に、今回はWindowsユーザーを前提として話をすすめること。今回の記事にあたっての画像は2025/11/07, 2025/11/21のときのものであることを断っておこう。
仮想化ソフトウェアのインストール
ホストマシン(今あなたが使っているPC本体)上に、ソフトウェアで構築された仮想のマシンに、ゲストOSをダウンロードしてさも一台のPCとして振る舞うというようにしたい。そのためには仮想化ソフトウェアというものが必要なのだが、代表的なものとしてVirtualBoxが挙げられる。
Oracle VM VirtualBoxは、PC上に仮想のPC環境を構築して他のOSをインストールすることができるフリーソフト。一つのPCで複数のOSを稼働させたいこの状況にピッタリ。
以下サイトにアクセス。
https://www.virtualbox.org/

Download を押すと以下のページへ飛ぶ。

私のホストOSはWindowsだからWindows hostsを押してダウンロード。
ここで、右のVirtualBox Extension Packもダウンロードしておくといいだろう。これは、USBデバイスのサポート、リモートデスクトップ(RDP)機能、仮想ディスクの暗号化などの拡張機能を追加してくれる代物なので、あって損はない。

ところで、ダウンロードが正常に行われたのか不安なときがあるかもしれない。そういうときは真ん中にあるFile ChecksumsからSHA256 checksumsを見てみよう。クリックすると、以下の画像が表示される。

左が、任意のデータから256ビット(64文字)の固定長ハッシュ値を生成する、暗号学的ハッシュ関数(SHA256)を用いて作られたハッシュ値。右がそれに対応したファイル名だ。ここでは、SHA256の具体的な内容の説明は省く。これは、ダウンロードされたデータを基に出されるため、もしダウンロードの不具合があったならばこれとは違う値となり正常にダウンロードされなかったといえる。つまり、等しければ正常にダウンロードされたという意味なのだ。
今回はそれも確認してみよう。検索からpowershellを検索して実行する。そうすると、以下のようになるはずだ。
PS C:\Users\[username]>
ここからのターミナルの操作はこれからインストールする仮想マシン内でも多分に用いる。基本的にはコマンドは書いていくが、わからないところは調べること。
次は、cdコマンドを使って移動する。基本的に、Downloadsディレクトリに入っていると思うので、
cd "C:\Users\[username]\Downloads\"
または、
cd .\Downloads\
などで移動する。この2つの違いは絶対パスと相対パスの違いによるものだ。絶対パスと相対パスの違いとは、絶対パスが住所で、相対パスが自分の位置からの情報みたいなものだ。厳密には、絶対パスはrootという一番上位にあるディレクトリからの完全な経路を記述し、どの場所からでも同じファイルを指す。相対パスは、現在いるディレクトリの位置を基準に、目的のファイルまでの経路を記述するものだ。ここでいうrootはWindowsだと基本的にCドライブだろう。.\(このあと解説するが、Debianだと./)で現在のディレクトリからという意味になる。また、.を二回つけて..\とすると一つ上位のディレクトリという意味になる。
lsコマンドを用いると、そのディレクトリ内のファイルを確認できる。
ls
あることを確認したら、先程ダウンロードした2つのファイルに対し、次のコマンドを打つことでそのハッシュ値を確認できる。
CertUtil -hashfile <ファイル名> SHA256
これで出た値が等しければ大丈夫だということになるだろう。
PS C:\Users\wing2c1\Downloads> CertUtil -hashfile VirtualBox-7.2.4-170995-Win.exe SHA256
SHA256 ハッシュ (対象 VirtualBox-7.2.4-170995-Win.exe):
22988be9792f39c8e07068504612bd83aae8f8317e2aaf7515079f5cd9421675
CertUtil: -hashfile コマンドは正常に完了しました。
PS C:\Users\wing2c1\Downloads> CertUtil -hashfile Oracle_VirtualBox_Extension_Pack-7.2.4.vbox-extpack SHA256
SHA256 ハッシュ (対象 Oracle_VirtualBox_Extension_Pack-7.2.4.vbox-extpack):
b80ee54252442ec025d6a7b2b9c3f32526ab5c2d91a0ffa2385be3ed83bcff0b
CertUtil: -hashfile コマンドは正常に完了しました。
私は等しかったので良かったといえる。
さて、では今度はインストーラーを用いてインストールしよう。先程ダウンロードしたファイルの内、最初にダウンロードしたであろうVirtualBox-...から始まるファイルを実行してインストール。
今回はいじらずに愚直にインストールをすることにしよう。









正常にインストールできた場合、以下のようになりVirtual Box Managerが開く。

さて、VirtualBox Extension Packも同様にインストールしよう。同様にすると以下のようになる。

同意してあげるとパッケージがインストールされる。

この表示が消えたら、インストール完了だ。
仮想マシンの作成
次に、OSをダウンロードしなくてはならない。そもそもの基盤となるOSのデータがないと、何もできないからだ。今回は、無料で使えるOSの代表格であるLinuxディストリビューションの一つであるDebianを使うことにする。
Debian(日本語の紹介)
https://wiki.debian.org/ja/DebianIntroduction
Debian公式サイト

早速ダウンロードすることにしよう。今回は最小版をダウンロードしてほしいアプリは自分でダウンロードすることにしよう。ところで、Debian自体のサーバーは日本から遠く離れたところにある。これだと、通信が遅くなってダウンロードも時間がかかることは明確だ。
そこで、同じファイルが保管されている日本のミラーリング用サーバーからダウンロードするとより早くできる。今回は理化学研究所のサーバーからダウンロードしよう。日本には他のサーバーにもあることもわかったが、興味があれば調べてみてもいいだろう。理化学研究所のサーバーのサイトにアクセス。
https://ftp.riken.jp/Linux/debian/debian-cd/

2025/11/07時点での最新版はバージョン13.1.0のため、13.1.0/にアクセス。

amd64をダウンロードしたいので、amd64/にアクセス。

iso-cdへアクセス。

どうやらSHA256用のchecksum用のファイルもあるようだ。今回は上のCDマークである
debian-13.1.0-amd64-netinst.iso
をダウンロードする。そしたら正しくダウンロードされたか確かめてみよう。先程のページのSHA256SUMSをクリック。

Virtual Boxのときと同様にして確かめてみる。
PS C:\Users\wing2c1\Downloads> CertUtil -hashfile .\debian-13.1.0-amd64-netinst.iso SHA256
SHA256 ハッシュ (対象 .\debian-13.1.0-amd64-netinst.iso):
658b28e209b578fe788ec5867deebae57b6aac5fce3692bbb116bab9c65568b3
CertUtil: -hashfile コマンドは正常に完了しました。
どうやら、正常にダウンロードできたようだ。
さて、ようやく作成することができる。VirtualBox Managerを開いて新規(N)を押す。

そうすると、以下の画面になった。

VM名は、この仮想マシンの名前となる部分だ。
サーバーの設定
今回、私はVM名をCP-serverとした(CPはCompetetive Programingを略した)
VMフォルダーはデフォルトで基本大丈夫。もし、フォルダーの場所を選びたいなら変更するか、VirtualBox Managerから環境設定でデフォルトのパスを変更するといい。
次にISOイメージだが、これは先程ダウンロードしたDebianのファイルを選択する。
そうすると、以下のようになった。

次に、無人ゲストOSインストールの設定を開く。
仮想マシン内のユーザーとパスワードを決める必要があるようだ。私は、ユーザー名をcpserverとした。なお、ユーザー名は英小文字のみであることに注意が必要だ。
次にパスワードだが、サーバーには答えだけでなくこれから作る競技プログラミング用のシステムの根幹が入っている。配布でもしないのならまだしも、今回私は配布するつもりのため、長く複雑にしておくことにしよう。最後に、Guest Additions ISO イメージにチェックを入れておく。これを入れておくと、ホストマシンと仮想マシン間のファイル共有や解像度を自動で最適に設定するなどして便利だから、入れておいて損はない。
そうすると、以下のようになる。

次に、仮想ハードウェアを指定する。
ここでは、メインメモリーとCPU数を指定することになる。CPUコアは実際の計算処理を担う「作業員」で、数が多いほど同時に複数の作業がこなせ、処理速度が向上する。メインメモリー(RAM)は、CPUが作業する際に一時的にデータを置く「作業台」であり、容量が大きいほど多くのデータを一度に扱えるため、PCの全体的な快適性に影響する。サーバー側は基本一人(ホストOS)からしか受け付けないが、少し重い作業があるかもしれないため以下のように、メインメモリー4096MB, CPUを3コアとした。

最後に、仮想ハードディスクを指定する。
ここでは、仮想マシンの容量となるところを決める。デフォルトで、新しい仮想ハードディスクを作成にチェックが入っているだろう。それのハードディスクの場所とサイズにある、ディスクサイズのみを基本いじることになる。サーバー側はインストールするものが多いため、以下のように30GBとした。

これで、完了を押すと仮想マシンが作成される。
スクリーンサイズは下の画像より200%にスケールすると後々作業がやりやすくなる。

青い画面から長いインストールを終わらせると最終的にこの画面になる。

これで、サーバーの仮想マシン作成が完了した。
日本語入力できることって当たり前?
この仮想マシン内の使い心地をホストマシンと同じようにしたい。
まず、仮想マシンを起動する。
唐突だが、ホストマシンと仮想マシン間でコピー・ペーストしたり、ドラッグ・ドロップを出来たら便利だと思わないだろうか。結論では、設定を変更すればまず、それができる。

このデバイスオプションにある、「クリップボードの共有」及び「ドラッグ&ドロップ」の設定を双方向に設定すれば実現できる。そしたら、右上の電池ボタンあたりを押すと電源ボタンが出てくるため、そこの「Restart...」を押し再起動をすると、できるようになる。

終わったら、仮想マシンを作成するときにつかったパスワードでログインする。そうすると、以下のデスクトップ画面になるだろう。

左上のバーを押すと、以下のような画面になるはずだ。

さて、検索ボックスがあるのでそこで「terminal」と検索し、実行する。
そしたら、以下の画面になるはずだ。

Debian然り、大抵のLinuxディストリビューションは日本語がデフォルトで入っていないので、まず日本用自体をインストールする。
だが、インストールする前に管理者権限持っていないようなユーザーがなにかをインストールさせるわけがないのでまずは管理者権限を手に入れよう。
あと、Linuxは少し特殊でLinux内でのコピペは、Shift+Ctrl+Cでコピー、Shift+Ctrl+Vでペーストとなる。
su -
をtermianlで入力すると、パスワードが求められるのでログイン時と同じように入力する。
そうすると、rootという名前になっているだろう。これが管理者の意なのである。だが、Windowsでも同じようにユーザーはずっと管理者権限を使うものでもない。「管理者で実行」があるように、ユーザーが管理者権限を一時的に使うことが安全面の観点から良いのだ。次は、それができるようにしよう。一時的に管理者権限を使うコマンドとしてsudoがある。これを使うことができればいい。そのためには、sudoersファイルにユーザーを追加する必要がある。sudoersファイルとは、sudoコマンドで変更できるユーザーと実行できるコマンドを設定するためのファイルである。以下を入力しよう。
visudo
そうすると、以下のようになる。
これは、sudoersファイルを編集するようのコマンドだ。ダウンスクロールすると、
# User privilege specification
root ALL=(ALL:ALL) ALL
と書かれた場所がある。
これの1行下に以下を追記する。
cpserver ALL=(ALL:ALL) ALL
cpserverは私が設定したユーザー名なので、それ以外ならそのユーザー名を入力する。
これはnanoというテキストエディタのため、Ctrl+OとEnterで保存し、Ctrl+Xで作業を終了する。そしたら、試しも兼ねてにsudoコマンドを使ってみよう。管理者権限からは
exit
と入力して出る。
日本語のパッケージをインストールする。ソフトウェアなどをインストールするには、aptコマンドを使う。Advanced Packaging Toolの略で、Debian系Linuxディストリビューションでソフトウェアのインストール、アップデート、削除を行うためのコマンドだ。まず、最新版を入手するため
sudo apt update
sudoを使うとパスワードを求められるが、いままでと同じ。
そして、日本語パッケージを取得する。
sudo apt install locales
Yes/Noを求められると思うが、yesと打てば実行される。
sudo update-locale LANG=ja_JP.UTF-8
これで、Restartで再起動すると

これで、明らかに日本語になった。だが、日本語入力は依然としてできないままだ。そこでibus-mozcをインストールする。これは「IBus」という多言語入力に対応するフレームワークと、Googleが開発した「Mozc」という日本語入力システム(IME)を統合したものだ。
sudo apt install ibus-mozc
そして再起動をする。ところで、再起動は以下のコマンドを打ってもできる。
sudo reboot
そしたら、今度はこのコマンドを実行する。
im-config
そうすると、以下の画面になる。OKして進む。

はいを選択。

ibusを選択。

OKを選択する。

そうすると閉じるはずだ。
CUIだけでなく、GUI操作もできることを知っておくのもいいだろう。
設定を開く

キーボード入力ソースを追加で、日本語を選択して追加。

再起動し、ホームにいって入力すると

出来ていることがわかる。
2025/12/04 追記

右上のここからMozcを選択するといい。
これで、日本語入力ができるようになりホストマシンと遜色のない使用感を獲得できるだろう。
サーバー側も同じようにして、共通の環境構築は終了する。次は、ユーザー仮想マシンの環境構築にしようと思う。今日は寝る。(2025/11/21 22:53)