kakakakakku blog

Weekly Tech Blog: Keep on Learning!

小学生も楽しめる!Minecraft Hour of Code でプログラミング的思考を学ぶ

今年8月頃から Minecraft に今さらドハマリをして平日深夜や週末に時間を捻出しつつプレイをしている.そして娘と一緒にやるようにもなった.ふと Minecraft をテーマにしたプログラミング的思考を学ぶコンテンツはあるのかな?と思って調べてみたら「Hour of Code」に出会った.プログラミングに限らずコンピュータサイエンスを学ぶコンテンツが多く公開されていて素晴らしかった💡

code.org

Minecraft Hour of Code

その中に Minecraft をテーマにした「Minecraft Hour of Code」がある.どれも Scratch のように「ブロック」を使ってプログラミング的思考を学ぶ仕組みになっていて,適材適所に「繰り返しブロック」「関数ブロック」などを使うことで楽しく学びを深められる.僕自身も全てクリアしたし,娘(小学校1年生)も楽しみながらすべてクリアしていた.「Hour of Code」の良さを紹介しようと思う👏

code.org

「Minecraft Hour of Code」には大きく以下の「4種類」のコンテンツがある.

  • マインクラフト: ボヤージュ アクアティック (Minecraft Voyage Aquatic)
  • マインクラフト: 主人公の旅 (Minecraft Hero’s Journey)
  • マインクラフト: アドベンチャー (Minecraft Adventurer)
  • マインクラフト: デザイナー (Minecraft Designer)

それぞれ独立したコンテンツになっているため,順番はなく,どれを選んでも良いようになっている.コンテンツの中に YouTube 動画が埋め込まれていたり,海外のマインクラフターのおもしろ動画が埋め込まれていたり,楽しめる要素が多くある.Minecraft 的にも,羊毛をハサミで刈ったり,トロッコに乗ったり,マグマを丸石で埋めたり,コンジットを作ったり,クリーパーから逃げたり,どれもワクワクする!

キャラクターを選択しよう!

どのコンテンツも最初はキャラクターを選択する.Steve と Alex!

f:id:kakku22:20211108142437p:plain

「ブロック」を使おう!

最初は「マインクラフト: ボヤージュ アクアティック」を例にする.基本的には Scratch のように「ブロック」を使ってゴールを目指すことになり,以下の例は「前にすすむ」を使って「チェスト」を目指す.結果的には2歩進めば OK!難易度や操作には多少の違いがある.

f:id:kakku22:20211108142606p:plain

「リピート」を使おう!

3問目と4問目に進むと「リピート : while」という概念の必要性を体験できるようになっている.3問目では「タラ」を目指して7歩進む.さすがに「7歩」だと多すぎるし,具体的な歩数を考えなくても良いような表現があると便利で,4問目では「イルカ」を目指して「ゴールまでリピート」を使う.このように最初から「リピート : while」を教えるのではなく,必要性を体験して「気付かせる」ストーリーになっている.

f:id:kakku22:20211108143114p:plain

f:id:kakku22:20211108143127p:plain

「リピート」と「条件」を組み合わせよう!

「マインクラフト: ボヤージュ アクアティック」の11問目まで進むと比較的複雑になってくるけど,Minecraft ではよく知られた「コンジット」を作る.ポイントは「シーランタン」の上で方向転換をするために「条件 : if」という概念を組み合わせるところ.ここまで理解できると複雑な動きも作れるようになる.

f:id:kakku22:20211108144113p:plain

「繰り返し」と「条件」を組み合わせよう!

今度は「マインクラフト: アドベンチャー」を例にする.他のコンテンツにも「繰り返し : for」という概念は出てくるけど,特に「アドベンチャー」では Minecraft でよくある操作を試せるので楽しめる.11問目は洞窟でブランチマイニングをしているときに「マグマダイブしないように丸石を置く」という操作で「繰り返し : for」「条件 : if」を組み合わせる.じっくり考えながらトライアンドエラーを楽しめる!

f:id:kakku22:20211108145118p:plain

「関数」を使おう!

「マインクラフト: 主人公の旅」の8問目からは「関数 : function」という概念が出てくる.以下はネザーに橋をかけて「本」を目指すために,関数として用意された「短い橋をかける」「長い橋をかける」ブロックを使う.このように再利用性という観点でも「気付かせる」ストーリーになっている.

f:id:kakku22:20211108145721p:plain

「イベント」を使おう!

「マインクラフト: デザイナー」は少し高度なトピックを学ぶコンテンツになり,途中から「イベント : event」という概念が出てくる.「夜になったらときにスポーンする」「ゾンビが出現したらプレイヤーをに向かって歩く」「牛を使用したらミルクを落とす」など,実際に Minecraft の中でも使われている操作となり,Minecraft で言う Mob の動きを実装するという点で「視野が広がる」ストーリーになっている.娘に聞いたところ「イベント」だけは少し難しかったと言っていた.

f:id:kakku22:20211108150742p:plain

以下は「マインクラフト: デザイナー」の途中で視聴する YouTube 動画で「イベント」が紹介されている.

youtu.be

まとめ

Minecraft をテーマにしたプログラミング的思考を学ぶコンテンツを調べてみたら「Hour of Code」に出会った.「Minecraft Hour of Code」は非常によく考えられたストーリーになっていて,誰でも楽しめるコンテンツだった.その中でも代表的な点を紹介したけど,是非「4種類」のコンテンツを全て試してみると良いと思う!

また娘などに Scratch を教える機会もあるけど,使えるブロックが多いため可能性が多すぎて逆に何も作れないということがある.「Minecraft Hour of Code」だと,最初から明確なゴールがあるため,与えられたブロックを使えばよく「パズル感覚」楽しめるのが良さそうだった.Scratch を試す前に試すとより効果的なのかもしれない!

「Hour of Code」には他にも多くコンテンツがあるので試していくぞー💪

code.org

imbalanced-learn の SMOTE モジュールを使って簡単にオーバーサンプリングを実現する

分類などの機械学習モデルを構築するときにデータセットに偏り(不均衡データ)があると適切に学習できない可能性がある.データセットを強制的に増やす操作を「オーバーサンプリング」と言って,SMOTE (Synthetic Minority Over-sampling Technique)ADASYN (Adaptive Synthetic) など,具体的な「オーバーサンプリング手法」がよく知られている.ちなみに SMOTEk-NN (k-Nearest Neighbor) : k近傍法 を参考に近接データを増やす.

imbalanced-learn とは

今回紹介する imbalanced-learn「不均衡データ」を扱うライブラリで「オーバーサンプリング」「アンダーサンプリング」などを簡単に実装できる.そして scikit-learn と互換がある.また GitHub だと scikit-learn-contrib プロジェクトで管理されている.

github.com

SMOTE モジュールを試す

今回は imbalanced-learn に入門するために SMOTE モジュールを試す.Over-sampling のドキュメントに載っているサンプルコードを参考にしつつ,もっと簡単に書き直してみた.

まず,scikit-learnmake_classification() 関数を使って,2000 データセットを 0.05 : 0.95 の割合で不均衡データとして生成した.特徴量はシンプルに2個にした.そして imbalanced-learnSMOTE モジュールで fit_resample() 関数を使うと簡単に「オーバーサンプリング」をすることができる.

from imblearn import FunctionSampler
from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt

def plot_resampling(X, y, sampler, ax):
    X_res, y_res = sampler.fit_resample(X, y)
    ax.scatter(X_res[:, 0], X_res[:, 1], c=y_res, alpha=0.8, edgecolor="k")
    title = f"Resampling with {sampler.__class__.__name__}"
    ax.set_title(title)

X, y = make_classification(
    n_samples=2000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_classes=2,
    weights=[0.05, 0.95],
    class_sep=1.0,
    random_state=1
)

fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(20, 20))

samplers = [
    FunctionSampler(),
    SMOTE()
]

for ax, sampler in zip(axs.ravel(), samplers):
    plot_resampling(X, y, sampler, ax)

そして matplotlibscatter() 関数で散布図を描画した.Resampling with FunctionSampler(通常)Resampling with SMOTE(オーバーサンプリング) を比較すると,特徴量(紫色)に大きく差を確認できる.便利だ!

f:id:kakku22:20211101135838p:plain

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

iris データセットを libsvm フォーマットにする : scikit-learn の dump_svmlight_file()

scikit-learndatasets モジュールの中に libsvm フォーマットのデータセットを扱う関数がある.libsvm フォーマットは以下のフォーマットでデータセットを表現し,1番左にラベル(教師データ)を持つ.例えば Amazon SageMaker の組み込みアルゴリズム XGBoost でもサポートされている.

<label> <index1>:<value1> <index2>:<value2> ...

以下のサイトには libsvm フォーマットで多種多様なデータセットが公開されている.

www.csie.ntu.edu.tw

libsvm フォーマット例

例えば iris データセット(アヤメ)に以下のサンプルデータセットがあったとする.Label は3種類ある.

  • 0 = setosa(ヒオウギアヤメ)
  • 1 = versicolor(ハナショウブ)
  • 2 = virginica(カキツバタ)
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) Label
5.1 3.5 1.4 0.2 0
4.9 3.0 1.4 0.2 0
4.7 3.2 1.3 0.2 0

サンプルデータセットを libsvm フォーマットにすると以下となる.

0 0:5.1 1:3.5 2:1.4 3:0.2
0 0:4.9 1:3 2:1.4 3:0.2
0 0:4.7 1:3.2 2:1.3 3:0.2

scikit-learn dump_svmlight_file() 関数

scikit-learn を使って簡単に iris データセット(アヤメ)をセットアップできるため「特徴量」「ラベル」を取得して,同じく scikit-learndump_svmlight_file() 関数をさっそく試す.最終的に iris-libsvm ファイルに書き出す.コードはシンプルに書ける!

from sklearn.datasets import dump_svmlight_file
from sklearn.datasets import load_iris

iris = load_iris()

# 特徴量
x = iris.data

# ラベル
y = iris.target

dump_svmlight_file(x, y, 'iris-libsvm')

scikit-learn.org

実行後に head -n 50 iris-libsvm コマンドを実行して書き出した iris-libsvm ファイルを確認すると,期待通りに libsvm フォーマットになっていた.

0 0:5.1 1:3.5 2:1.4 3:0.2
0 0:4.9 1:3 2:1.4 3:0.2
0 0:4.7 1:3.2 2:1.3 3:0.2
0 0:4.6 1:3.1 2:1.5 3:0.2
0 0:5 1:3.6 2:1.4 3:0.2
0 0:5.4 1:3.9 2:1.7 3:0.4
0 0:4.6 1:3.4 2:1.4 3:0.3
0 0:5 1:3.4 2:1.5 3:0.2
0 0:4.4 1:2.9 2:1.4 3:0.2
0 0:4.9 1:3.1 2:1.5 3:0.1
0 0:5.4 1:3.7 2:1.5 3:0.2
0 0:4.8 1:3.4 2:1.6 3:0.2
0 0:4.8 1:3 2:1.4 3:0.1
0 0:4.3 1:3 2:1.1 3:0.1
0 0:5.8 1:4 2:1.2 3:0.2
0 0:5.7 1:4.4 2:1.5 3:0.4
0 0:5.4 1:3.9 2:1.3 3:0.4
0 0:5.1 1:3.5 2:1.4 3:0.3
0 0:5.7 1:3.8 2:1.7 3:0.3
0 0:5.1 1:3.8 2:1.5 3:0.3
0 0:5.4 1:3.4 2:1.7 3:0.2
0 0:5.1 1:3.7 2:1.5 3:0.4
0 0:4.6 1:3.6 2:1 3:0.2
0 0:5.1 1:3.3 2:1.7 3:0.5
0 0:4.8 1:3.4 2:1.9 3:0.2
0 0:5 1:3 2:1.6 3:0.2
0 0:5 1:3.4 2:1.6 3:0.4
0 0:5.2 1:3.5 2:1.5 3:0.2
0 0:5.2 1:3.4 2:1.4 3:0.2
0 0:4.7 1:3.2 2:1.6 3:0.2
0 0:4.8 1:3.1 2:1.6 3:0.2
0 0:5.4 1:3.4 2:1.5 3:0.4
0 0:5.2 1:4.1 2:1.5 3:0.1
0 0:5.5 1:4.2 2:1.4 3:0.2
0 0:4.9 1:3.1 2:1.5 3:0.2
0 0:5 1:3.2 2:1.2 3:0.2
0 0:5.5 1:3.5 2:1.3 3:0.2
0 0:4.9 1:3.6 2:1.4 3:0.1
0 0:4.4 1:3 2:1.3 3:0.2
0 0:5.1 1:3.4 2:1.5 3:0.2
0 0:5 1:3.5 2:1.3 3:0.3
0 0:4.5 1:2.3 2:1.3 3:0.3
0 0:4.4 1:3.2 2:1.3 3:0.2
0 0:5 1:3.5 2:1.6 3:0.6
0 0:5.1 1:3.8 2:1.9 3:0.4
0 0:4.8 1:3 2:1.4 3:0.3
0 0:5.1 1:3.8 2:1.6 3:0.2
0 0:4.6 1:3.2 2:1.4 3:0.2
0 0:5.3 1:3.7 2:1.5 3:0.2
0 0:5 1:3.3 2:1.4 3:0.2

関連記事

kakakakakku.hatenablog.com

Kubeval で kustomization.yaml を対象外にする

Kubeval で Kubernetes マニフェストを検査する場合に kustomize を使っていると,以下のように kustomization.yaml でエラーになってしまう.kustomization.yaml には kind フィールドがなく,Kubeval の対象外にしたい!

$ kubeval --version
Version: 0.16.1
Commit: f5dba6b486fa18b9179b91e15eb6f2b0f7a5a69e
Date: 2021-03-30T15:17:06Z

$ kubeval --directories .
ERR  - base/kustomization.yaml: Missing 'kind' key
ERR  - overlays/dev/kustomization.yaml: Missing 'kind' key

kustomization.yaml を対象外にする

Kubeval には指定したファイルを対象外にする --ignored-filename-patterns オプションがあり,以下のように指定できる.解決!

$ kubeval --directories . --ignored-filename-patterns 'kustomization.yaml'

なお kustomization.yaml に関連する issue も出ている.他にも類似したオプションとして --ignore-missing-schemas--skip-kinds もあるけど使えないため,やはり --ignored-filename-patterns オプションを使うのが現状は良さそう👌

github.com

GitHub Actions 対応

しかし GitHub Actions で Kubeval を使おうとするとまた違う問題に遭遇する.公開されている Actions--ignored-filename-patterns オプションをサポートしていない.プルリクエストは出ているけど,1年以上放置されているように見える.よって使えなかった😇

github.com

となると,Kubeval Docker イメージを直接指定して使うことになる.公開されている garethr/kubeval Docker イメージ(GitHub リポジトリは garethr/kubeval から instrumenta/kubeval にリダイレクトされる)を使って,以下のように workflow.yml を設定すれば,期待した通りに使えるようになった.解決!

name: Workflow
on: push
jobs:
  kubeval:
    name: kubeval
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: kubeval
      uses: docker://garethr/kubeval
      with:
        args: '--directories . --ignored-filename-patterns "kustomization.yaml|workflow.yml"'

まとめ

Kubevalkustomization.yaml を対象外にできるようになった!引き続き issue は確認しよう👀

macOS のディスプレイ設定でメニューバー(通知欄)の位置を変えることができる

リモートワークに移行してから,以下のように大きく「2拠点(部屋)」で日々仕事をしている.それぞれの部屋で微妙に機材も違っていて,今回は Mac (macOS) のディスプレイ設定 Tips を紹介する.

  • 通常業務 🏢 自宅
    • 正面ディスプレイ : LG 27UL850-W 🖥
    • 左側ディスプレイ : MacBook Pro 13 inch
  • リモート研修配信環境 🏠 実家の空いている部屋
    • 正面ディスプレイ : MacBook Pro 13 inch
    • 左側ディスプレイ : Uperfect 4K 🖥

Mac (macOS) で通知欄の位置を変える

デフォルトだと MacBook Pro 側に「通知」が表示される.上記の通り,部屋によって MacBook Pro の位置が「正面ディスプレイ」だったり「左側ディスプレイ」だったりするため,特に通知が「左側ディスプレイ」に表示されると気付きにくいという課題があった.なお,以下はサンプルとして AppleScript で通知を表示している.

f:id:kakku22:20211012193134p:plain

$ osascript -e 'display notification "@kakakakakku" with title "hello!"'

そこで「メニューバー(通知欄)」の位置を変える.以下のように Mac (macOS) のディスプレイ設定で「白枠 = メニューバー(通知欄)」をドラッグして位置を変えることができる💡実はつい最近まで知らなかった😇

f:id:kakku22:20211012155532p:plain

まとめ

知っておくと便利な Mac (macOS) のディスプレイ設定 Tips を紹介した!もしかしたら知らなかったのは僕だけかもしれない!