わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

micro:bitのMakeCodeエディター(v0)をDockerで動かそう

 1年生向けの「体験演習」は,後期開講の科目です.
 7回の授業で演習内容を構成し,前半(第2回~第8回)と後半(第9回~第15回)に,異なる受講者に対して同一内容をやってもらいます.初回にガイダンスを入れれば,ちょうど15回の授業となります.
 所属メジャー(ネットワーク情報学メジャー)の協議により,私は7回のうち2回を担当しています.隣り合った実験室で平行実施し,1回分は教材を作成して隣室の先生にも渡し,もう1回分は隣室の先生に作ってもらっています.
 テーマはIoT,そしてmicro:bitです.学生は持参したBYODのPCでhttps://makecode.microbit.org/にアクセスし,「新しいプロジェクト」でブロックエディタの画面を表示させて,プログラミングをしていきました---というのは今年度,前半の話です.
 前半の授業の2回目を終えた際,隣室の先生より,このブロックエディタのバージョンのせいか,micro:bitのせいかはただちに分からないが,特定の課題が思うようにいかなかったという指摘をもらいました.そこでhttps://makecode.microbit.org/v0より利用可能な,古いバージョンを(もちろん事前確認の上で)後半に使用することとし,こちらの教材を修正して,昨日実施しました.
 いずれのページにせよ,学外への通信を伴います.ノートPCからの一斉アクセスについて,年を追うごとに改善しているとはいえ,何かあって通信できないとなると,重要な演習ができなくなります.
 そこで自分のLinuxサーバで,v0のほうのブロックエディタを稼働させ,学外通信に不具合が生じたときは,そこに接続してもらうことにしました.
 最新版のほうは,今年度,前半の実施の前に用意しました.

 コンテナを立ち上げて,ブラウザでアクセスし,URLの後ろに「/v0」をつけてみると,エラーが出ました.横着せず,「v0版」のサーバを作らないといけません.
 Dockerfileやコマンドラインとにらめっこする前に,情報収集したところ,昨年のブログ記事で,npm installで古いバージョンを指定すればよい,というのが指摘されていました.

 自分のDockerfileでも,試してみました.https://www.npmjs.com/package/pxt-microbitより,_v0の最新バージョンのタグが0.14.58であることを確認し,2019/11/16の記事で

    && npm install -g pxt \

と書いていた行を

    && npm install -g pxt pxt-microbit@0.14.58 \

と書いて,docker buildしたものの,終わりのほうのメッセージを見ると「+ pxt-microbit@2.1.38」と入っていました.これは(_v0でない)最新版と同じです.
 Dockerfileのそのあとの「pxt target microbit」によって,pxt-microbitがインストールされていることに気づきました.そこでは-g(グローバルインストール)オプションなしのnpmが実行されているらしく,となるとpackage.jsonで,pxt-microbitのバージョンを指定しておけばよさそうです*1
 最終的にDockerfileは以下の通りとなりました.

FROM node:alpine
RUN apk update \
    && apk add python make gcc g++ linux-headers eudev-dev \
    && rm -rf /var/cache/apk/*
RUN mkdir -p /root/pxt-microbit \
    && cd /root/pxt-microbit \
    && npm install -g pxt \
    && echo '{"dependencies":{"pxt-microbit":"0.14.58"}}' > package.json \
    && pxt target microbit
EXPOSE 80
WORKDIR /root/pxt-microbit
ENTRYPOINT ["pxt", "serve", "-h", "0.0.0.0", "-p", "80","--noBrowser"]

 ビルドと実行のコマンドは以下の通りです.ビルド時のメッセージにも「+ pxt-microbit@0.14.58」が含まれていました.

$ docker build -t pxt-microbit:alpinev0 .
$ docker run -d --rm -p 3232:80 --name pxtav0 pxt-microbit:alpinev0

 ブラウザで,http://サーバ:3232 にアクセスすると,数秒待ったあと,ホーム画面ではなく,さっそくブロックエディタの画面になりました.左上の「Projects」をクリックし,次に「サンプル」を押すと,いくつかのサンプルプログラムの中に「Game of Life」が見つかりました.

*1:pxtそのものは,バージョン指定せず,ビルド時の最新版で,問題ありませんでした.