Dockerを学ぶためにDocker関連の記事を探していると、Qiitの古い記事に【2019年9月版】台風も直撃して通勤もままならないので BASIC でプログラマの本能を呼び起そうかの記事があったので、TRYしてみました。
bwbasicを使う
参考とする記事では、Linuxで動くBASICインタプリタのbwbasicを使用しています。
bwbasicの関連記事Linux で動くBASICによると、bwbasicは、下記のコマンドでインストール出来るようです。
sudo apt-get install bwbasic
Dockerファイルの修正
参考とする記事には、基本的なDockerファイルが掲載されているので、下記の様に修正して使用することとしました。
修正ポイントは、nanoエディタをインストールとDockerfileの最適化です。
- ベースイメージのバージョン指定:
ubuntuのタグをubuntu:latestに明示的に指定。 - 不要な空白行の削除:
シンプルにするため、コマンド間の空白行を削除。 - コマンドの統合:
aptの後にautoremoveとcleanを追加し、不要なパッケージとキャッシュを削除。
これにより、イメージサイズが減少します。 - VOLUMEの削除:
コンテナ起動時の-vオプションで永続化を指定するように変更。
FROM ubuntu:latest
RUN apt update && apt -y upgrade && \
apt -y install bwbasic lhasa nano && \
apt -y autoremove && apt clean
ARG program_dir=/root/program
WORKDIR $program_dir
Dockerイメージの作成
修正したDockerfileを使用して、下記のコマンドでbwbasicイメージファイルをビルドします。
docker build ./ -t bwbasic
[+] Building 12.0s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 248B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.8s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [1/3] FROM docker.io/library/ubuntu:latest@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0f 0.0s
=> => resolve docker.io/library/ubuntu:latest@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6 0.0s
=> [2/3] RUN apt update && apt -y upgrade && apt -y install bwbasic lhasa nano && apt -y autoremove && a 9.2s
=> [3/3] WORKDIR /root/program 0.0s
=> exporting to image 1.9s
=> => exporting layers 1.5s
=> => exporting manifest sha256:84df22ed79dee39bd8557fe33585def31c8c120296069c51f935dcea9d32f1de 0.0s
=> => exporting config sha256:0009ffcf228915c75da0b2916652364b6e1f0bc801bdf91bf42bb1cbb5ca4a08 0.0s
=> => exporting attestation manifest sha256:72f9fd0c0f252d6245e6df79b96af5926d086c5692259499c1d725266e0e5cac 0.0s
=> => exporting manifest list sha256:476121a1a355c8f56795a43c864e896ee6b75b99bc05cbdee95c19098dcca79e 0.0s
=> => naming to docker.io/library/bwbasic:latest 0.0s
=> => unpacking to docker.io/library/bwbasic:latest 0.3s
作成したイメージファイルの確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
bwbasic latest 476121a1a355 2 minutes ago 195MB
$ docker history bwbasic
IMAGE CREATED CREATED BY SIZE COMMENT
476121a1a355 3 minutes ago VOLUME [/root/program] 0B buildkit.dockerfile.v0
<missing> 3 minutes ago WORKDIR /root/program 12.3kB buildkit.dockerfile.v0
<missing> 3 minutes ago ARG program_dir=/root/program 0B buildkit.dockerfile.v0
<missing> 3 minutes ago RUN /bin/sh -c apt update && apt -y upgrade … 46.1MB buildkit.dockerfile.v0
<missing> 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 weeks ago /bin/sh -c #(nop) ADD file:bcebbf0fddcba5b86… 87.6MB
<missing> 5 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 5 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 5 weeks ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 5 weeks ago /bin/sh -c #(nop) ARG RELEASE 0B
$ tar -tf bwbasic.tar
blobs/
blobs/sha256/
blobs/sha256/0009ffcf228915c75da0b2916652364b6e1f0bc801bdf91bf42bb1cbb5ca4a08
blobs/sha256/3e9a8e504ae27b0d7b1d51b4f380ea7481a7fad88813b3d75a6b547944875595
blobs/sha256/440967d61132e807ec64bbb10302c3d1493551661506e2d750bd814587f336f8
blobs/sha256/476121a1a355c8f56795a43c864e896ee6b75b99bc05cbdee95c19098dcca79e
blobs/sha256/68c41cd9feb9c61402e0a7b75ca9288ee44ff7e1758a81d8bd9f7d0b10781917
blobs/sha256/72f9fd0c0f252d6245e6df79b96af5926d086c5692259499c1d725266e0e5cac
blobs/sha256/84df22ed79dee39bd8557fe33585def31c8c120296069c51f935dcea9d32f1de
blobs/sha256/b7004ba71280bab49f5d2b6fc6c4e786dcb3bcbc64825850512c39578c8c7627
blobs/sha256/de44b265507ae44b212defcb50694d666f136b35c1090d9709068bc861bb2d64
index.json
manifest.json
oci-layout
bwbasicコンテナの起動
作成したbwbasicイメージを元に下記のコマンドでコンテナを起動して、コンテナに入ります。
$ docker run -it -v .:/root/program bwbasic bash
#
bwbasicを動かす
下記コマンドを入力し、コンテナ内でbwbasicを起動します。
# bwbasic
Bywater BASIC Interpreter/Shell, version 2.20 patch level 2
Copyright (c) 1993, Ted A. Campbell
Copyright (c) 1995-1997, Jon B. Volkoff
bwBASIC:
基本のBASICコマンド動作確認
bwBASIC: print "hello"
hello
bwBASIC:
サンプルプログラムの作成と起動
bwbasicで動く数字当てゲームをnanoエディタで作成し動かします。
数字当てゲームは下記の通りです
10 REM 数字当てゲーム
20 RANDOMIZE
25 TARGET = INT(RND * 100) + 1
30 PRINT "数字当てゲームを開始します!"
40 PRINT "1から100の間の数字を当ててください。"
50 PRINT "数字を入力してEnterキーを押してください。"
70 REM ゲームループ
80 INPUT "あなたの予想: ", GUESS
90 IF GUESS < TARGET THEN PRINT "もっと大きな数字です!"
100 IF GUESS > TARGET THEN PRINT "もっと小さな数字です!"
110 IF GUESS = TARGET THEN GOTO 200
120 REM 続ける
130 GOTO 80
200 REM ゲームクリア
210 PRINT "おめでとうございます!正解は "; TARGET; " でした!"
220 PRINT "もう一度遊びますか? (Y/N)"
230 INPUT "選択: ", REPLY$
240 IF REPLY$ = "Y" OR REPLY$ = "y" THEN GOTO 25
250 IF REPLY$ = "N" OR REPLY$ = "n" THEN GOTO 300
260 PRINT "無効な入力です。"
270 GOTO 220
300 REM ゲーム終了
310 PRINT "ゲームを終了します。ありがとうございました!"
320 END
- 目的: 1から100までのランダムな数字を当てる。
- 遊び方:
- ゲーム開始後、予想する数字を入力します。
- 入力後、以下のフィードバックが表示されます:
- 「もっと大きな数字です!」:予想が小さい場合。
- 「もっと小さな数字です!」:予想が大きい場合。
- 正解:
- 正解すると「おめでとうございます!正解は ○○ でした!」と表示されます。
- もう一度遊ぶ:
- 正解後に再挑戦するかを尋ねられます。
Yまたはyを入力すると再挑戦できます。Nまたはnを入力するとゲームが終了します。
# nano "basic_game01"
# ls
basic_game01
root@37943fe5ffa1:~/program# bwbasic
Bywater BASIC Interpreter/Shell, version 2.20 patch level 2
Copyright (c) 1993, Ted A. Campbell
Copyright (c) 1995-1997, Jon B. Volkoff
bwBASIC: load "basic_game01"
bwBASIC: list
10: REM 数字当てゲーム
20: RANDOMIZE
25: TARGET = INT(RND * 100) + 1
30: PRINT "数字当てゲームを開始します!"
40: PRINT "1から100の間の数字を当ててください。"
50: PRINT "数字を入力してEnterキーを押してください。"
:
70: REM ゲームループ
80: INPUT "あなたの予想: ", GUESS
90: IF GUESS < TARGET THEN PRINT "もっと大きな数字です!"
100: IF GUESS > TARGET THEN PRINT "もっと小さな数字です!"
110: IF GUESS = TARGET THEN GOTO 200
:
120: REM 続ける
130: GOTO 80
:
200: REM ゲームクリア
210: PRINT "おめでとうございます!正解は "; TARGET; " でし�
��!"
220: PRINT "もう一度遊びますか? (Y/N)"
230: INPUT "選択: ", REPLY$
240: IF REPLY$ = "Y" OR REPLY$ = "y" THEN GOTO 25
250: IF REPLY$ = "N" OR REPLY$ = "n" THEN GOTO 300
260: PRINT "無効な入力です。"
270: GOTO 220
:
300: REM ゲーム終了
310: PRINT "ゲームを終了します。ありがとうございました
!"
320: END
bwBASIC: run
数字当てゲームを開始します!
1から100の間の数字を当ててください。
数字を入力してEnterキーを押してください。
あなたの予想: 48
もっと大きな数字です!
あなたの予想: 60
もっと大きな数字です!
あなたの予想: 80
もっと大きな数字です!
あなたの予想: 90
もっと小さな数字です!
あなたの予想: 86
もっと小さな数字です!
あなたの予想: 84
もっと大きな数字です!
あなたの予想: 85
おめでとうございます!正解は 85 でした!
もう一度遊びますか? (Y/N)
選択: y
数字当てゲームを開始します!
1から100の間の数字を当ててください。
数字を入力してEnterキーを押してください。
あなたの予想: 90
もっと小さな数字です!
あなたの予想: 50
もっと小さな数字です!
あなたの予想: 30
もっと大きな数字です!
あなたの予想: 40
おめでとうございます!正解は 40 でした!
もう一度遊びますか? (Y/N)
選択: n
ゲームを終了します。ありがとうございました!
bwBASIC:

