Dockerで古き良きBASICを動かしてみる

こんにちは！

様々な技術が進歩し、どんどん便利な世の中になっていきますね:slight_smile:
私も新しい技術は好きなのですが、たまには初心に返ってみようかと思います。

ほとんど覚えてないのですが、一番最初に触れた言語はBASICでした。
まだ小学生だった記憶があります。

当時のBASICがどのバージョンなのか分からないので、FreeBASICを利用して、Dockerで簡単なスクリプトを作ってみます:smiley:

# FreeBASICとは
Windows、DOS、および Linux 用の無料/オープンソースなBASICコンパイラーです。
公式サイトは[こちら](https://www.freebasic.net/)。

# 今回用意するもの
- Dockerfile
- FreeBASICのバイナリ
- BASICスクリプト

# FreeBASICのバイナリを取得
DockerをUbuntuベースで作るので、Ubuntu用のバイナリをダウンロードします。
今回使用したバイナリはこちら（※ダウンロードリンクです）
[FreeBASIC-1.10.0-ubuntu-22.04-x86_64.tar.gz](http://downloads.sourceforge.net/fbc/FreeBASIC-1.10.0-ubuntu-22.04-x86_64.tar.gz?download)

# ディレクトリ構成
最終的なディレクトリ構成はこちら。
ダウンロードしたファイルを同じ階層に置きます。
```bash
$ tree
.
├── Dockerfile
├── FreeBASIC-1.10.0-ubuntu-22.04-x86_64.tar.xz
└── system-info.bas
```

# やりたいこと
- BASICでシェルを実行して、Docker内部の情報を出力する

本当はゲームを作りたかったのですが、Dockerで実行するには色々と手間がかかるようです。
初回なので、簡単なスクリプトにしました。

# 実装
それでは、必要なファイルを実装します。
まずはDockerfileから。
```dockerfile:Dockerfile
# ベースイメージとしてUbuntuを使用
FROM ubuntu:latest

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    tar \
    xz-utils \
    nano \
    gcc \
    libncurses5-dev \
    && rm -rf /var/lib/apt/lists/*

RUN apt-get install -y nano

# FreeBASICのバイナリをコンテナにコピー
COPY FreeBASIC-1.10.0-ubuntu-22.04-x86_64.tar.xz /tmp

# FreeBASICを解凍してインストール
RUN tar -xJf /tmp/FreeBASIC-1.10.0-ubuntu-22.04-x86_64.tar.xz -C /usr/local
ENV PATH="/usr/local/FreeBASIC-1.10.0-ubuntu-22.04-x86_64/bin:${PATH}"

# ワークディレクトリの設定
WORKDIR /workspace

COPY system-info.bas /workspace/system-info.bas
```
続いて、BASICのファイルを実装。
```vb:system-info.bas
PRINT "System information..."
SLEEP 1000

PRINT "### CPU Information: ###"
SHELL "cat /proc/cpuinfo"
PRINT STRING(80, "-")

PRINT "### Memory Usage: ###"
SHELL "free -h"
PRINT STRING(80, "-")

PRINT "### Disk Usage: ###"
SHELL "df -h"
PRINT STRING(80, "-")

PRINT "### Uptime: ###"
SHELL "uptime"
PRINT STRING(80, "-")

PRINT "### Running Processes: ###"
SHELL "ps -aux"
PRINT STRING(80, "-")

PRINT "### Network Interfaces: ###"
SHELL "ifconfig"
PRINT STRING(80, "-")

PRINT "Completed."
SLEEP 5000
```

# コンテナの起動
Dockerfileをビルドして、起動します。
```bash
docker build -t basic-env .
docker run -it basic-env
```
起動直後の状態。
```bash
root@53944db891c6:/workspace# ls
system-info.bas
```
コンパイラのパスも通ってます。
```bash
# which fbc
/usr/local/FreeBASIC-1.10.0-ubuntu-22.04-x86_64/bin/fbc
```

# コンパイル
それでは、コンパイルして実行ファイルを生成しましょう。
```bash
fbc system-info.bas 
```
確認してみます。
```bash
root@53944db891c6:/workspace# ls
system-info  system-info.bas
root@53944db891c6:/workspace# ll
total 60
drwxr-xr-x 1 root root  4096 Dec 20 12:37 ./
drwxr-xr-x 1 root root  4096 Dec 20 12:36 ../
-rwxr-xr-x 1 root root 46688 Dec 20 12:37 system-info*
-rw-r--r-- 1 root root   510 Dec 20 11:28 system-info.bas
root@53944db891c6:/workspace# 
```
実行ファイルができてますね。

# 実行
スクリプトを実行してみましょう。
```bash
./system-info
```
結果はこちら。
```bash
root@53944db891c6:/workspace# ./system-info 
Gathering system information...
### CPU Information: ###
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 61
model name	: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
stepping	: 4
cpu MHz		: 2699.999
cache size	: 3072 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 4
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 20
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase bmi1 smep bmi2 erms rdseed adx smap arat
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds mmio_unknown
bogomips	: 5399.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 61
model name	: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
stepping	: 4
cpu MHz		: 2699.999
cache size	: 3072 KB
physical id	: 0
siblings	: 4
core id		: 1
cpu cores	: 4
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 20
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch intel_ppin fsgsbase bmi1 smep bmi2 erms rdseed adx smap arat
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds mmio_unknown
bogomips	: 5399.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:

processor	: 2
vendor_id	: GenuineIntel
cpu family	: 6
model		: 61
model name	: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
stepping	: 4
cpu MHz		: 2699.999
cache size	: 3072 KB
physical id	: 0
siblings	: 4
core id		: 2
cpu cores	: 4
apicid		: 2
initial apicid	: 2
fpu		: yes
fpu_exception	: yes
cpuid level	: 20
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch intel_ppin fsgsbase bmi1 smep bmi2 erms rdseed adx smap arat
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds mmio_unknown
bogomips	: 5399.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:

processor	: 3
vendor_id	: GenuineIntel
cpu family	: 6
model		: 61
model name	: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
stepping	: 4
cpu MHz		: 2699.999
cache size	: 3072 KB
physical id	: 0
siblings	: 4
core id		: 3
cpu cores	: 4
apicid		: 3
initial apicid	: 3
fpu		: yes
fpu_exception	: yes
cpuid level	: 20
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch intel_ppin fsgsbase bmi1 smep bmi2 erms rdseed adx smap arat
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds mmio_unknown
bogomips	: 5399.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:

--------------------------------------------------------------------------------
### Memory Usage: ###
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       575Mi       2.7Gi       1.0Mi       557Mi       2.9Gi
Swap:          1.0Gi          0B       1.0Gi
--------------------------------------------------------------------------------
### Disk Usage: ###
Filesystem      Size  Used Avail Use% Mounted on
overlay          59G   32G   25G  57% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/vda1        59G   32G   25G  57% /etc/hosts
tmpfs           2.0G     0  2.0G   0% /proc/acpi
tmpfs           2.0G     0  2.0G   0% /sys/firmware
--------------------------------------------------------------------------------
### Uptime: ###
 12:40:08 up 4 min,  0 users,  load average: 0.06, 0.04, 0.00
--------------------------------------------------------------------------------
### Running Processes: ###
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4624  3584 pts/0    Ss   12:36   0:00 /bin/bash
root        46  0.0  0.0   3944  2304 pts/0    S+   12:40   0:00 ./system-info
root        55  0.0  0.0   2888  1536 pts/0    S+   12:40   0:00 sh -c ps -aux
root        56  0.0  0.0   7060  2816 pts/0    R+   12:40   0:00 ps -aux
--------------------------------------------------------------------------------
### Network Interfaces: ###
sh: 1: ifconfig: not found
--------------------------------------------------------------------------------
Completed.
root@53944db891c6:/workspace# 
```
ifconfigは入ってなかったようですが、他のコマンドは実行できました。
Docker内部の情報を見たのは初めてなので、興味深いです。

# まとめ
今回は、DockerでBASICを動かしてみました。
グラフィック関連の設定などをやればゲームも動かせるようなので、昔作ったブロック崩しをチャレンジしてみようと思います。

ローカルなら普通に描画できそうですが、どうせならDockerでやってみる予定です。

みなさんも一緒に、色々なチャレンジをして行きましょう！:smiley: