こんにちは!
様々な技術が進歩し、どんどん便利な世の中になっていきますね
私も新しい技術は好きなのですが、たまには初心に返ってみようかと思います。
ほとんど覚えてないのですが、一番最初に触れた言語はBASICでした。
まだ小学生だった記憶があります。
当時のBASICがどのバージョンなのか分からないので、FreeBASICを利用して、Dockerで簡単なスクリプトを作ってみます
FreeBASICとは
Windows、DOS、および Linux 用の無料/オープンソースなBASICコンパイラーです。
公式サイトはこちら。
今回用意するもの
- Dockerfile
- FreeBASICのバイナリ
- BASICスクリプト
FreeBASICのバイナリを取得
DockerをUbuntuベースで作るので、Ubuntu用のバイナリをダウンロードします。
今回使用したバイナリはこちら(※ダウンロードリンクです)
FreeBASIC-1.10.0-ubuntu-22.04-x86_64.tar.gz
ディレクトリ構成
最終的なディレクトリ構成はこちら。
ダウンロードしたファイルを同じ階層に置きます。
$ tree
.
├── Dockerfile
├── FreeBASIC-1.10.0-ubuntu-22.04-x86_64.tar.xz
└── system-info.bas
やりたいこと
- BASICでシェルを実行して、Docker内部の情報を出力する
本当はゲームを作りたかったのですが、Dockerで実行するには色々と手間がかかるようです。
初回なので、簡単なスクリプトにしました。
実装
それでは、必要なファイルを実装します。
まずは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のファイルを実装。
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をビルドして、起動します。
docker build -t basic-env .
docker run -it basic-env
起動直後の状態。
root@53944db891c6:/workspace# ls
system-info.bas
コンパイラのパスも通ってます。
# which fbc
/usr/local/FreeBASIC-1.10.0-ubuntu-22.04-x86_64/bin/fbc
コンパイル
それでは、コンパイルして実行ファイルを生成しましょう。
fbc system-info.bas
確認してみます。
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#
実行ファイルができてますね。
実行
スクリプトを実行してみましょう。
./system-info
結果はこちら。
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でやってみる予定です。
みなさんも一緒に、色々なチャレンジをして行きましょう!