コロナ禍における大学研究室でのソフトウェア開発環境構築(Windows 10編)

本記事は[東京学芸大学 櫨山研究室 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hazelab)の初日の記事になります．

# まえがき

私たち，櫨山研究室はソフトウェア工学の研究室になります．
ソフトウェア工学は実務寄りな内容が多くソフトウェアの開発経験がないと理解しにくい分野になります．

そこで研究室に配属された新3年生には**最初の半年間でチームでWebアプリケーションを開発する**という取り組みを伝統的(?)に行っています．

例年では顔合わせの意味も含めて新3年生の開発環境構築を研究室でやるのですが今年はコロナの影響で難しくなってしまいました…
そこで遠隔でもスムーズに環境構築が進められるようにちょこっと自動化しました．

本記事ではその内容を扱います．

なおソースコードやドキュメントなどは以下のGitHubリポジトリから見ることができます．

<a href="https://github.com/HazeyamaLab/setup"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/HazeyamaLab/setup.png" width="460px"></a>

# 概要

- 研究室配属後に最初に行う環境構築を自動化したよ
- この記事を内容を使えば，あなたのwindowsの環境構築を自動化できます

# ソフトウェア開発環境を整えるには？

ソフトウェア開発を始めるに当たって，いろいろなソフトウェアをPCに導入する必要があります．

使用するプログラミング言語やビルドツール，IDEやテキストエディタ，データベース，仮想環境を使うならViturlBoxやDockerなど…挙げていくとキリがないですね．

プログラミングやPCに馴染みがない人はこれらのソフトウェアを導入するとなると「Webブラウザからソフトウェアのインストーラをダウンロードしてソフトウェアをインストールする」といったGUIでの操作で導入することを想像するかと思います．

しかしプログラミングやソフトウェア開発に慣れてくると，導入するソフトウェアが増えてきたりプログラミング言語のバージョンの変更などの際にこういった操作が煩わしくなります．

そこで便利なのがCUI上で操作できるパッケージ管理ソフトです．
パッケージ管理ソフトを導入することでCUI上で統一的な操作で様々なソフトウェアをインストールすることができます．

# Windowsのパッケージ管理ソフト

WindowsではChocolatey，Scoopがよく使われているようです．
以下ではそれぞれの特徴について記述しておきます．

## Chocolatey

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/9aac3140-f02d-ab7a-0d3a-b15dc7240a6b.png)

[Chocolatey 公式サイト](https://chocolatey.org/)

ChocolateyはWindows向けのパッケージ管理ソフトです．
Chocolateyをインストールすることで以下のようなコマンドでソフトウェアをインストールすることができます．

```
choco install インストールしたいソフト名
```

ChocolateyはWeb上でインストールできるパッケージを検索することができます．
また[Chocolatey GUI](https://github.com/chocolatey/ChocolateyGUI)というGUIの管理ソフトもあります．

Web上でインストール可能パッケージの検索だったりGUIの管理ツールなどCUI操作に慣れていないユーザーでも使いやすい印象があります．
懸念事項としては**アンインストールコマンドが完全に削除ではなく一部ファイルが残るという部分です．**

なおChocolateyは管理者権限が必要です．


## Scoop

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/85c907a1-47d6-fb75-ba84-a711b0744309.png)

[Scoop 公式サイト](https://scoop.sh/)

ScoopもWindows向けのパッケージ管理ソフトです．
Scoopをインストールすることで以下のようなコマンドでソフトウェアをインストールすることができます．

```
scoop install インストールしたいソフト名
```

Scoopは極力GUIを使いたくないユーザー向けであり，LinuxやmacOSのパッケージ管理ソフトに近い使用感になります．
ソフトウェアのインストール先はデフォルトでホームフォルダ配下であり，独立性が担保されています．
アンインストールコマンドで綺麗に削除されます．

前述のChocolateyとの差分はScoop公式のGitHubのWikiにまとめられています．
> [How is Scoop different from Chocolatey?](https://github.com/lukesampson/scoop/wiki/Chocolatey-Comparison)

なお**Scoopは管理者権限を必要としません．**

# 必要なソフトウェアを一括でインストールするスクリプトを書く

ここまでCUI操作を推してきましたが，CUIには強みがあります．
CUIではシェルスクリプトを作成することによって一連の処理を記述することができます．
そこで**パッケージ管理ソフトの導入からソフトウェア開発に必要となると考えられるソフトウェアのインストールまでを行うスクリプトを組みます．**

スクリプトの手順を図示すると以下のようになります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/0da0fe00-b7ad-b79e-0af5-27188e656b59.png)

なお今回はChocolatey，Scoopのどちらのパッケージ管理ソフトも使用していますが，管理的な意味ではどちらかに絞って使う方が良いかもしれません🙇‍♂️

## インストールするソフトウェア

色々インストールしますが重要なのを抜粋すると以下になります．
（一覧はGitHubの<a href="https://github.com/HazeyamaLab/setup#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%82%8B%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E4%B8%80%E8%A6%A7" target=”_blank” rel="noopener noreferrer">README.md</a>に載せています．）

- Java 1.8/11/14
- Gradle 6.2.2
- MySQL 8.0
- VSCode
- tableplus


私たちの研究室では最初のアプリケーション開発は~~枯れた~~成熟した技術であるJavaのJSP/ServletとMySQLで作成します．
なのでJavaの環境とGradle，MySQLは必須になります．

エディタについては個人の好みなどもあるかと思いますが統一的な環境を用意しておくことは大切なのでVSCodeをインストールしておくことにしています．
（基本的にゼミでの操作手順や解説をする時のエディタにVSCodeを使用しています．）

tableplusはMySQLのGUIクライアントとして便利なのでインストールしています．

## スクリプトのコード

実際のスクリプトのコードは<a href="https://github.com/HazeyamaLab/setup/blob/master/windows/install.ps1" target=”_blank” rel="noopener noreferrer">GitHub</a>においてあります．
ここでは説明用に改変したコードを載せます．

```ps:install.ps1
# scoopのインストール
if (gcm scoop -ea SilentlyContinue) {
  Write-Host "[1/4] scoop is already installed! skipping this step."
} else {
  Write-Host "[1/4] installing scoop..."
  Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
}

# chocolateyのインストール
if (gcm choco -ea SilentlyContinue) {
  Write-Host "[2/4] chocolatey is already installed! skipping this step."
} else {
  Write-Host "[2/4] installing chocolatey..."
  Set-ExecutionPolicy Bypass -Scope Process -Force;[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}

# gitのインストール (scoopのbucketの追加に必要なため優先的にインストールする)
if (gcm git -ea SilentlyContinue) {
  Write-Host "[3/4] git is already installed! skipping this step."
} else {
  Write-Host "[3/4] installing git..."
  scoop install git
}

# パッケージをインストール
if (gcm scoop -and gcm choco -ea SilentlyContinue) {
  Write-Host "[4/4] installing package..."
  # scoopのbucketを追加
  scoop bucket add extras
  scoop bucket add java

  # scoopでソフトウェアのインストール
  scoop install adopt8-hotspot
  scoop install adopt11-hotspot
  scoop install adopt14-hotspot
  scoop install gradle@6.2.2
  scoop install graphviz
  scoop install vscode
  scoop install mysql-workbench
  scoop install tableplus
  scoop install vagrant

  # chocolateyでソフトウェアのインストール
  choco install -y mysql
  choco install -y virtualbox
} else {
  # scoop，chocoコマンドのが見つからない場合はエラーメッセージを出力
  [string]$err='
  [ERROR] command not found! The installation procedure may have changed.
  See the chocolatey documentation.
    https://chocolatey.org/install
  See the scoop documentation.
    https://scoop.sh/
  '
  $Host.UI.WriteErrorLine("$err")
  exit 1
}
```

基本的に`scoop`コマンドや`choco`コマンドが使えるかをIF文で確認し，使えなかったらインストールという愚直な方法です．


## スクリプトの実行方法

Scoopやchocolatey本体のインストール方法に倣って`Invoke-Webrequest`でWeb上からコードを取得し実行します．
今回はGitHubで管理しているのでGitHub上からスクリプトのソースを取得してパイプで流します．

```ps:PowerShell
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iwr -useb raw.githubusercontent.com/#{GitHubリポジトリにあるスクリプトファイルへのパス} | iex
```

**[注意]
単純な方法なので採用していますが，Web上のスクリプトコードには必ずしも安全である保証はありません．
安易に他人が作成したWeb上のスクリプトコードを実行しないようにしましょう．**

# 遭遇したトラブル

以下では遭遇したトラブルと対処法についておいておきます．

## Scoopでインストールしたソフトウェアにパスが通らない

Scoopではデフォルトではユーザーのホームフォルダ直下にscoopフォルダを作成し全てのソフトウェアを配置します．
ここで**ユーザー名に全角文字が含まれている場合にパスが通らない問題が発生する**ということがわかりました．
~~(なぜユーザー名に日本語を使ってしまうのかという疑問は置いておいて…)~~

scoopでは環境変数`SCOOP`を利用することでインストール先を変更することができます．
以下ではインストール先を`C:\Scoop`に変更しています．


```ps:PowerShell
$env:SCOOP='C:\Scoop'
[environment]::setEnvironmentVariable('SCOOP', $env:SCOOP,'User')
```

変更する前にインストールしたソフトウェアの引越し作業が必要ですが，これでユーザー名に全角文字を利用している人の環境も構築できます💪

## `ERROR hash check failed!`になる

今回はscoop-extrasバケットのtableplusのハッシュ値が異なりインストールに失敗していました．
こちらはエラーメッセージ通りにGitHubの<a href="https://github.com/lukesampson/scoop-extras/issues/3806" target=”_blank” rel="noopener noreferrer" >Issue</a>を上げました．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225901/b9e6a69c-47ab-e38d-d145-dd04f8372acc.png" width="800">

ScoopではBotがきちんと働いていて，Issueから即座にPRが作成されマージされました．
マージされた後で再度インストールを試みたら問題なくインストールできました✨


# あとがき

実は私はmscOSを使っておりWindowsの環境構築と向き合ったのは初めてでした．
そのため仮想マシンでwindowsを動かしてせっせと準備をしました．

実際やってみたらscoopなどのパッケージ管理ソフトも使い勝手がよく「windowsも悪くないのでは🤔」と思えました．


皆さん，良き開発ライフを💪

# 参考文献

- ScoopでWindowsにおける開発環境構築を最適化しよう, https://blog.satotaichi.info/scoop/
- 【Chocolatey入門】導入から注意点、今後の可能性まで, https://qiita.com/kangetsu121/items/b6352b547cd32e71bc65