WSLへのCurses開発環境構築

# 1. Overview

さて、端末の画面を操作するライブラリ、Cursesの話をしたいと思います。

無茶苦茶伝統のあるCurses, その後に更新されて、現在はnCursesとなっております。
こいつを、Elixirから操作するのが、ExNcursesとなります。

現時点で、Windowsで動かない。不便なので、ちょっとWSLでの環境を構築してみよう、と
言うのが今回の記事となります。

環境：
Windows11 Pro 24H2
WSL2/Ubuntu "22.04.3 LTS (Jammy Jellyfish)"

# 2. WSL Linux環境の準備

## 2.1 インストールの流れ

1. WSLのマシンへのUbuntuのインストール（インストール済の人は無視をしてください）
1. Elixir/ErlangOTPのインストール(インストール済の人は無視をしてください)
1. libncurses5-dev libncursesw5-devのインストール
1. プロジェクトの作成(mixコマンドですね)と実行

と言う流れになっております。

## 2.2 WSLのマシンへのUbuntuのインストール(Windowsで実行)

管理者モードでPowerShellを開いて、以下を打ちます。
僕は「再インストールですので、Ubuntu は既にインストールされています」と表示されます。

```
PS C:\WINDOWS\system32> wsl --install Ubuntu
Ubuntu は既にインストールされています。
Ubuntu を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: onodera　<---ここでユーザ名を入れております。
New password: <--password
Retype new password: <--password
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Wed Jan  1 13:07:00 JST 2025

  System load:  0.45                Processes:             51
  Usage of /:   0.1% of 1006.85GB   Users logged in:       0
  Memory usage: 12%                 IPv4 address for eth0: 172.21.228.196
  Swap usage:   0%


This message is shown once a day. To disable it please create the
/home/onodera/.hushlogin file.
```


## 2.3 Elixirのインストール(WSLのLinux上)

さて、WSLへのインストールは、Elixirのホームページから、install.shを落としてくる
やり方が、一番楽そうです。
インストールには、自分のユーザ（ondera)を使用しております。
https://elixir-lang.org/install.html#install-scripts

curlでスクリプトを取得し、実行します。

```
onodera@NucBoxG5:~$ curl -fsSO https://elixir-lang.org/install.sh
onodera@NucBoxG5:~$ sh install.sh elixir@1.18.1 otp@27.1.2
downloading https://builds.hex.pm/builds/otp/amd64/ubuntu-24.04/OTP-27.1.2.tar.gz
unpacking OTP-27.1.2.tar.gz to /home/onodera/.elixir-install/installs/otp/27.1.2...
downloading https://github.com/elixir-lang/elixir/releases/download/v1.18.1/elixir-otp-27.zip
unpacking elixir-otp-27.zip to /home/onodera/.elixir-install/installs/elixir/1.18.1-otp-27...
checking OTP... 27 ok
checking Elixir... 1.18.1 ok

Run this (or add to your ~/.bashrc or similar file):

    export PATH=$HOME/.elixir-install/installs/otp/27.1.2/bin:$PATH
    export PATH=$HOME/.elixir-install/installs/elixir/1.18.1-otp-27/bin:$PATH

```

画面にメッセージがでておりますが、.bashrcに上記のパスを追加してくださいね。

```
onodera@NucBoxG5:~$ vi .bashrc
onodera@NucBoxG5:~$ source .bashrc
```

iex
```
onodera@NucBoxG5:~$ iex
```

iexが起動すればおしまいです。

## 2.4 libncurses5-dev libncursesw5-devのインストール(WSLのLinux上)

以下の様に、apt-getで取得します。
```
onodera@NucBoxG5:~$ sudo apt-get update
onodera@NucBoxG5:~$ sudo apt-get install libncurses5-dev libncursesw5-dev
[sudo] password for onodera:
        .
     (中略)

Need to get 9261 kB of archives.
After this operation, 35.7 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
```
Yを入力して、インストールスタート。


次に、cursesのコンパイルに必要なbuild-essentialも入れます。
え？make入れるれんだよ、make。

```
onodera@NucBoxG5:~$ sudo apt-get update
onodera@NucBoxG5:~$ sudo apt-get install build-essential
onodera@NucBoxG5:~$ sudo apt-get install erlang-dev
onodera@NucBoxG5:~/curtest$  sudo apt-get update
```

## 2.5 プロジェクトの作成と実行


さて、ここは次回に延々とやるので、さくっと行きましょう。
まずは、mix newでプロジェクトを作成します。
```
onodera@NucBoxG5:~$ mix new curtest
onodera@NucBoxG5:~$ cd curtest
```

mix.exsを編集します。
```
  defp deps do
    [
      {:ex_ncurses, "~> 0.3"} <---こいつを追加します。
```

mixで依存関係を確認し、ライブラリを取得します。


"./lib/curtest.ex"を編集します。
今回のサンプルソースはこちら。
```
defmodule Curses do
  def run do
    Application.ensure_started(:ex_ncurses)
    :ok = ExNcurses.initscr()
    ExNcurses.printw("Hello, world!")
    ExNcurses.refresh()
    ExNcurses.getch()
    ExNcurses.endwin()
  end
end

Curses.run()
```

依存関係を解決し、ex_ncursesを取得します。
```
onodera@NucBoxG5:~/curtest$ mix deps.get
* creating /home/onodera/.mix/archives/hex-2.1.1
Resolving Hex dependencies...
Resolution completed in 0.048s
New:
  elixir_make 0.9.0
  ex_ncurses 0.3.1
* Getting ex_ncurses (Hex package)
* Getting elixir_make (Hex package)
```

コンパイルしましょう。
```

onodera@NucBoxG5:~/curtest$ mix compile
```

実行されましたか？
Hello worldと表示されていれば、成功です。

あ、プログラムはCTRL-Cで終わらせてください。

…え？サンプル見たけど、簡単じゃーねか、お前の説明要らねーよって？
うん。要らんかもな。まじに今回、インストール手順を整理したくらいしか、記事の価値無さそうｗ