kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Kubernetes の YAML をカスタマむズする kustomize の基本を孊べる Examples「helloWorld」

「Kubernetes 完党ガむド 第2版」で「第14ç«  マニフェストの汎甚化を行うオヌプン゜ヌス゜フトりェア」を読んでいたら「第1版」では玹介されおいなかった正確には名前は茉っおいたkustomize の解説が新しく远加されおいた本曞を読みながら抂芁を理解したためGitHub に公開されおいる kustomize の Examples を詊しながら理解を深めおいく今回は「helloWorld」を詊す

github.com

Kubernetes完党ガむド 第2版 (Top Gear)

Kubernetes完党ガむド 第2版 (Top Gear)

  • 䜜者:⻘⌭ 真也
  • 発売日: 2020/08/07
  • メディア: 単行本゜フトカバヌ

前提

今回は Docker Desktop for Mac "Edge" を䜿っお以䞋の Kubernetes 環境で詊したkustomize コマンドは brew install kustomize で䜿えるようにしたなお珟圚は kubectl ず統合されお kubectl kustomize ずいうコマンドも䜿えるけど本曞にコラムが茉っおいる通りバヌゞョンが異なる

$ kubectl version --short
Client Version: v1.18.6
Server Version: v1.18.6

$ kustomize version --short
{3.8.1  2020-07-16T05:11:04+01:00  }

Examples「helloWorld」ずは

kustomize の Examples「helloWorld」 はkustomize の第䞀歩ずしおメタデヌタ関連のフィヌルドを曎新したりOverlayオヌバヌレむを䜿っお環境ごずにマニフェストを䜜ったりリ゜ヌスにパッチを適甚する流れを孊ぶさっそく詊しおいく

1. 事前準備

たず䜜業ディレクトリを䜜っお倉数 DEMO_HOME に蚭定しおおく手順曞では mktemp コマンドを䜿っおいるけど自由に倉えられる今回は自分甚のマニフェストリポゞトリにしたそしおもう1぀䜜っおいる base ディレクトリは倉換元になる「ベヌスマニフェスト」を眮く堎所ずしお䜿う

$ DEMO_HOME=~/helloWorld
$ BASE=${DEMO_HOME}/base
$ mkdir -p ${BASE}

次に GitHub に公開されおいるマニフェストを base ディレクトリにダりンロヌドするtree コマンドの結果を芋ればわかる通りConfigMap / Deployment / Service リ゜ヌスのマニフェストをダりンロヌドするもう1個は kustomize の蚭定ファむルずしお kustomization.yaml もダりンロヌドするkustomization.yaml に関しおは埌述する

$ curl -s -o "${BASE}/#1.yaml" "https://raw.githubusercontent.com\
/kubernetes-sigs/kustomize\
/master/examples/helloWorld\
/{configMap,deployment,kustomization,service}.yaml"

$ tree ${DEMO_HOME}
~/helloWorld
└── base
    ├── configMap.yaml
    ├── deployment.yaml
    ├── kustomization.yaml
    └── service.yaml

2. kustomize build を実行する

ダりンロヌドした base/service.yaml の䞀郚を以䞋に茉せおおくbase ディレクトリに眮いおあるマニフェストを盎接適甚するのではなくkustomize でビルドをするためあくたで「ベヌスマニフェスト」になる

kind: Service
apiVersion: v1
metadata:
  name: the-service
spec:
  selector:
    deployment: hello
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 8666
    targetPort: 8080

次に base/kustomization.yaml を確認する構文ずしお commonLabels ず resources の抂芁を以䞋に茉せおおく簡単に蚀えば「3皮類のマニフェストに labels ず selector を远加する」ず蚀える

  • commonLabels : ベヌスマニフェストに labels ず selector を远加する
  • resources : kustomize build を実行するずきに含めるリ゜ヌスファむルのリストを指定する
commonLabels:
  app: hello

resources:
- deployment.yaml
- service.yaml
- configMap.yaml

さっそく kustomize build を実行するずビルドしたマニフェストが暙準出力に衚瀺される今回は Service リ゜ヌスを抜粋したbase/service.yaml ず比范するず新しく metadata.labels.app ず spec.selector.app が远加されおいる

$ kustomize build ${BASE}

䞭略

apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello
  name: the-service
spec:
  ports:
  - port: 8666
    protocol: TCP
    targetPort: 8080
  selector:
    app: hello
    deployment: hello
  type: LoadBalancer

䞭略

3. Overlayオヌバヌレむを远加する

さらに kustomize の良さを孊んでいくため次はリ゜ヌスにパッチを適甚する「Overlayオヌバヌレむ」を詊すたずoverlays ディレクトリを䜜りさらに overlays/staging ディレクトリず overlays/production ディレクトリを䜜っおおく

$ OVERLAYS=${DEMO_HOME}/overlays
$ mkdir -p ${OVERLAYS}/staging
$ mkdir -p ${OVERLAYS}/production

base ディレクトリず overlays ディレクトリの関係はザッず以䞋のようになるこのように構成するこずにより共通的なマニフェストを base ディレクトリに眮き぀぀環境ごずに異なる蚭定を overlays ディレクトリに眮くこずができるkustomize 䟿利

f:id:kakku22:20200817144209p:plain

次に overlays ディレクトリに眮く「蚈4ファむル」を玹介する

overlays/staging/kustomization.yaml

たずstaging 環境のための overlays/staging/kustomization.yaml を䜜る新しく出おくる構文を玹介する

  • namePrefix : リ゜ヌス名の呜名芏則ずしおプレフィックスを远加する
  • commonAnnotations : ベヌスマニフェストに annotations を远加する
  • bases : resources ず同じ珟圚 bases は deprecated になっおいる
  • patchesStrategicMerge : ベヌスマニフェストに適甚する「パッチマニフェスト」のリストを指定する

よっおstaging 環境ではリ゜ヌス名に staging- プレフィックスを付けたりlabels ず selector ず annotations を远加する

namePrefix: staging-
commonLabels:
  variant: staging
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am staging!
bases:
- ../../base
patchesStrategicMerge:
- map.yaml

overlays/staging/map.yaml

次に patchesStrategicMerge に指定しおいた overlays/staging/map.yaml を䜜るこれは「パッチマニフェスト」ずしお䜿う ConfigMap リ゜ヌスのマニフェストずなりaltGreeting ず enableRisky の蚭定倀を登録しおいるなおkustomize ず ConfigMap を組み合わせた configMapGenerator 構文に関しおは次回の蚘事に茉せる予定

apiVersion: v1
kind: ConfigMap
metadata:
  name: the-map
data:
  altGreeting: "Have a pineapple!"
  enableRisky: "true"

overlays/production/kustomization.yaml

staging 環境ず同様に production 環境のための overlays/production/kustomization.yaml も䜜るproduction 環境ではリ゜ヌス名に production- プレフィックスを付けるなお今回の䟋では ConfigMap のパッチは適甚せずDeployment のパッチを適甚する

namePrefix: production-
commonLabels:
  variant: production
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am production!
bases:
- ../../base
patchesStrategicMerge:
- deployment.yaml

overlays/production/deployment.yaml

最埌に overlays/production/deployment.yaml を䜜る䞀般的に production 環境は staging 環境よりも Pod を倚く起動するため以䞋のマニフェストでは Deployment リ゜ヌスの replicas を 10 に曎新しおいる

apiVersion: apps/v1
kind: Deployment
metadata:
  name: the-deployment
spec:
  replicas: 10

最終的な構成を tree コマンドで確認するず以䞋のようになる

$ tree ${DEMO_HOME}
~/helloWorld
├── base
│   ├── configMap.yaml
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── production
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    └── staging
        ├── kustomization.yaml
        └── map.yaml

4. 環境ごずにマニフェストを適甚する

Overlay の蚭定もしたため最埌にたた kustomize build コマンドを䜿っお staging 環境ず production 環境のマニフェストを確認する今回はマニフェストを kubectl apply -f - にパむプするこずにより盎接適甚もする

# staging
$ kustomize build ${OVERLAYS}/staging

$ kustomize build $OVERLAYS/staging | kubectl apply -f -
configmap/staging-the-map created
service/staging-the-service created
deployment.apps/staging-the-deployment created

# production
$ kustomize build ${OVERLAYS}/production

$ kustomize build $OVERLAYS/production | kubectl apply -f -
configmap/production-the-map created
service/production-the-service created
deployment.apps/production-the-deployment created

✅ プレフィックスを確認する

䟋えば ConfigMap を確認するずリ゜ヌス名に staging- ず production- が远加されおいる

$ kubectl get configmaps
NAME                 DATA   AGE
production-the-map   2      5s
staging-the-map      2      20s

✅ アノテヌションを確認する

䟋えば Pod を確認するずアノテヌションが远加されおいる

$ kubectl describe pods staging-the-deployment-6cd65cfc7f-2lcts | grep Annotations
Annotations:  note: Hello, I am staging!

$ kubectl describe pods production-the-deployment-bb7fd8b65-29b52 | grep Annotations
Annotations:  note: Hello, I am production!

✅ ConfigMap のパッチを確認する

kubectl describe configmaps で ConfigMap の倀を確認する

$ kubectl describe configmaps staging-the-map
Name:         staging-the-map
Namespace:    default
Labels:       app=hello
              org=acmeCorporation
              variant=staging
Annotations:  note: Hello, I am staging!

Data
====
altGreeting:
----
Have a pineapple!
enableRisky:
----
true
Events:  <none>

altGreeting ず enableRisky の倀を base/configMap.yaml ず比范するずstaging 環境では倀を曞き換えられおいる

Key base staging production
altGreeting Good Morning! Have a pineapple! Good Morning!
enableRisky false true false

✅ Deployment のレプリカ数を確認する

kubectl describe deployments で Deployment のレプリカ数を確認するproduction 環境ではレプリカ数を曎新できおいる

$ kubectl describe deployments | egrep 'Name:|Replicas:'
Name:                   production-the-deployment
Replicas:               10 desired | 10 updated | 10 total | 10 available | 0 unavailable
Name:                   staging-the-deployment
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable

5. リ゜ヌスを削陀する

手順には入っおいなかったけど詊したらリ゜ヌスを削陀しおおく

$ kustomize build ${OVERLAYS}/staging | kubectl delete -f -
configmap "staging-the-map" deleted
service "staging-the-service" deleted
deployment.apps "staging-the-deployment" deleted

$ kustomize build ${OVERLAYS}/production | kubectl delete -f -
configmap "production-the-map" deleted
service "production-the-service" deleted
deployment.apps "production-the-deployment" deleted

たずめ

「Kubernetes 完党ガむド 第2版」で解説が新しく远加されおいた kustomize を詊したGitHub に公開されおいる Examples「helloWorld」は kustomize の基本を孊べおオススメなお今回は kustomization.yaml の構文ずしお以䞋を䜿った詳しくはドキュメントを芋おみおもらえればず

  • bases
  • commonAnnotations
  • commonLabels
  • namePrefix
  • patchesStrategicMerge
  • resources

kubernetes-sigs.github.io

Kubernetes でバむナリを ConfigMap (binaryData) に登録する

今幎の4月頃に「Kubernetes 完党ガむド」を読み終えたけどただ曞評を曞いおいなかったそしたら8月に「Kubernetes 完党ガむド 第2版」が出版されたためさっそく賌入しお読み盎しおいる読みながら気になった機胜を詊しおいく今回は ConfigMap にする

Kubernetes完党ガむド 第2版 (Top Gear)

Kubernetes完党ガむド 第2版 (Top Gear)

  • 䜜者:⻘⌭ 真也
  • 発売日: 2020/08/07
  • メディア: 単行本゜フトカバヌ

ConfigMap (binaryData)

「第7ç«  : Config & Storage APIs カテゎリ」の ConfigMap を読み盎しおいたらテキスト (UTF-8) だけではなく「バむナリ」を登録する内容が新しく远加されおいた拡匵子 .jpg など画像ファむルを Base64 で゚ンコヌドしおnginx コンテナから HTML ず画像ファむルを配信するずいうサンプルだった今たで ConfigMap で「バむナリ」を登録したこずがなく動䜜確認のために「Kubernetes 完党ガむド 第2版」を参考にしながら詊したなお今回詊した Kubernetes 環境は以䞋の通り

$ kubectl version --short
Client Version: v1.18.6
Server Version: v1.18.6

通垞の Docker Desktop for Mac だず Kubernetes v1.16 になるけどDocker Desktop for Mac "Edge" を䜿えばKubernetes v1.18 を䜿えるようになる個人的には Edge を䜿っおいる

docs.docker.com

ConfigMap を䜜成する

たずマニフェストを曞かずに kubectl create で盎接 ConfigMap を䜜成する今回は --from-literal オプションで HTML をテキストずしお蚭定し--from-file オプションで画像を蚭定しおいる画像のフィヌルド名は cat.png だけど実際には癜い猫アむコン (cat-white.png) を蚭定しおいる

$ kubectl create configmap sandbox-configmap-binary \
  --save-config \
  --from-literal=index.html='Hello, <img src="./cat.png">' \
  --from-file=cat.png=cat-white.png
configmap/sandbox-configmap-binary created

コマンド䟋はドキュメントにも茉っおいる

kubernetes.io

マニフェスト管理をする堎合はBase64 で゚ンコヌドをする必芁はなくkubectl create に --dry-run オプションず --output オプションを远加すればマニフェストにリダむレクトできる

$ kubectl create configmap sandbox-configmap-binary \
  --save-config \
  --from-literal=index.html='Hello, <img src="./cat.png">' \
  --from-file=cat.png=cat-white.png \
  --dry-run=client \
  --output=yaml > sandbox-configmap-binary.yaml

data フィヌルドず binaryData フィヌルド

リダむレクトした sandbox-configmap-binary.yaml を確認するず以䞋のようにテキスト (UTF-8) の倀は data フィヌルドに蚭定されおバむナリは binaryData フィヌルドに蚭定されるなお゚ンコヌドされた内容は長いので xxxxx ず省略した

apiVersion: v1
binaryData:
  cat.png: xxxxx
data:
  index.html: Hello, <img src="./cat.png">
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: sandbox-configmap-binary

ConfigMap に倉化はないけどマニフェストを kubectl apply で適甚しおおく

$ kubectl apply -f sandbox-configmap-binary.yaml
configmap/sandbox-configmap-binary configured

Pod を䜜成する

今床は ConfigMap を Volume マりントした nginx の Pod マニフェスト sandbox-configmap-binary-nginx.yaml を曞く目的ずしおは nginx から ConfigMap に登録した index.html ず cat.png を配信できるようにする

apiVersion: v1
kind: Pod
metadata:
  name: sandbox-configmap-binary-nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.18
    volumeMounts:
    - name: config-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: config-volume
    configMap:
      name: sandbox-configmap-binary

マニフェストを kubectl apply で適甚しポヌトフォワヌドもしおおく

$ kubectl apply -f sandbox-configmap-binary-nginx.yaml
pod/sandbox-configmap-binary-nginx created

$ kubectl port-forward sandbox-configmap-binary-nginx 8888:80

さっそく http://localhost:8888/ にアクセスをするず期埅通りに index.html ず cat.png を衚瀺できたなお癜い猫アむコンず次に䜿う黒い猫アむコンは Icons8 から取埗した

f:id:kakku22:20200814214221p:plain

ConfigMap を曎新する

今床は ConfigMap に登録した cat.png を 癜い猫アむコン (cat-white.png) から黒い猫アむコン (cat-black.png) に倉えおマニフェストを適甚する

$ kubectl create configmap sandbox-configmap-binary \
  --save-config \
  --from-literal=index.html='Hello, <img src="./cat.png">' \
  --from-file=cat.png=cat-black.png \
  --dry-run=client \
  --output=yaml > sandbox-configmap-binary.yaml

$ kubectl apply -f sandbox-configmap-binary.yaml
configmap/sandbox-configmap-binary configured

ConfigMap を Volume マりントしおいる堎合は自動的に反映されるためブラりザを曎新するず黒い猫アむコンに倉わった

f:id:kakku22:20200814214233p:plain

たずめ

8月に出版された「Kubernetes 完党ガむド 第2版」を読みながら ConfigMap の binaryData フィヌルドを詊した実際のワヌクロヌドでは画像を Base64 で゚ンコヌドする堎面は少ないかもしれないけど詊せお良かった匕き続き読み盎しおいくぞ

Kubernetes完党ガむド 第2版 (Top Gear)

Kubernetes完党ガむド 第2版 (Top Gear)

  • 䜜者:⻘⌭ 真也
  • 発売日: 2020/08/07
  • メディア: 単行本゜フトカバヌ

Redash v9 で採甚されたゞョブキュヌラむブラリ RQ (Redis Queue) の基本機胜を詊した

Redash v9 で「ゞョブキュヌラむブラリ」ずしお採甚された RQ (Redis Queue) を詊した今たでの Redash では Celery を䜿っおいたRQ は Redis を䜿っお「ゞョブ登録 (enqueue)」ず「ゞョブ実行 (work)」の機胜をサポヌトするドキュメントを読むず倚くの機胜が実装されおいるけど今回は基本機胜にフォヌカスした

github.com

怜蚌環境

今回は Docker Compose で怜蚌環境を構築した圹割ずしおは倧きく4皮類あり以䞋に茉せおおく簡単に構成図も描いおおいた

  • enqueue コンテナ : ゞョブ登録 (Python)
  • queue コンテナ : キュヌ (Redis)
  • worker1 コンテナ : ゞョブ実行 (Python)
  • worker2 コンテナ : ゞョブ実行 (Python)

f:id:kakku22:20200810083901p:plain

なお怜蚌環境を再珟する堎合は GitHub の sandbox-rq リポゞトリを芋おもらえればずdocker-compose.yml や enqueue.py や worker.py などサンプルコヌドも党おコミットしおある

github.com

1.「queue」コンテナを起動する

最初に queue コンテナを起動する今回は RQ の Redis コマンドを確認するため䞊行しお queue に接続しお redis-cli monitor を実行しおおく実行された Redis コマンドがストリヌミングされるため䟿利

$ docker-compose up -d queue
Starting sandbox-rq_queue_1 ... done

2.「enqueue」コンテナを起動する

次に RQ のドキュメントの通りにサンプルゞョブ job.py を実装する実装は簡単で count_words_at_url() 関数は requests を䜿っお䞎えられた URL の文字数を返す

import requests

def count_words_at_url(url):
    resp = requests.get(url)
    return len(resp.text.split())

python-rq.org

今床はゞョブを登録をするために enqueue.py を実装する同じくドキュメントのサンプルコヌドを参考にするRedis に察するコネクションを䜜成したら enqueue() 関数を䜿っおゞョブを登録する匕数には job.py に実装した count_words_at_url() 関数ず匕数ずなる URL を枡す今回は kakakakakku blog の URL にしたRQ は非同期凊理を前提にするためもし結果を取埗する堎合は数秒埅機しおから job.result で取埗できる

from rq import Queue
from redis import Redis
from job import count_words_at_url
import time

r = Redis(host='queue', port=6379, db=0)
q = Queue(connection=r)

job = q.enqueue(count_words_at_url, 'https://kakakakakku.hatenablog.com/')

time.sleep(5)
print(job.result)

動䜜確認をするために enqueue コンテナを起動する

$ docker-compose up -d enqueue
Starting sandbox-rq_enqueue_1 ... done

redis-cli monitor の結果からRQ は rq:queue:default キヌにゞョブをリスト型ずしお RPUSH しおいるこずを確認できたそしお rq:job:${UUID} キヌにはゞョブ情報を HSET しおいるこずを確認できた実際に HGET でキヌの䞭身を芋るず以䞋のように enqueued_at や status や description を取埗できた

127.0.0.1:6379> LRANGE rq:queue:default 0 -1
1) "18d1bb26-4948-45f9-8195-0de1c06c395e"
2) "d391221d-7c31-4822-98ae-1e25be4306f4"
3) "dacbcd76-af61-4b91-8d95-6c702bd4d3ba"

127.0.0.1:6379> HGET rq:job:18d1bb26-4948-45f9-8195-0de1c06c395e enqueued_at
"2020-08-09T22:32:59.752159Z"

127.0.0.1:6379> HGET rq:job:18d1bb26-4948-45f9-8195-0de1c06c395e status
"queued"

127.0.0.1:6379> HGET rq:job:18d1bb26-4948-45f9-8195-0de1c06c395e description
"job.count_words_at_url('https://kakakakakku.hatenablog.com/')"

3.「worker」コンテナを起動する

最埌にゞョブ実行をするためにドキュメントのサンプルコヌドを参考に worker.py を実装するポむントは Redis に察するコネクションを䜜成したら work() 関数でゞョブを実行するなお実行結果は盎接 Redis に HSET で曎新される

from redis import Redis
import rq
from rq import Connection, Worker

r = Redis(host='queue', port=6379, db=0)

with Connection(r):
    w = Worker(['default'])
    w.work()

なお茉せた worker.py を芋るずわかる通りゞョブに䟝存せず汎甚的な実装になっおいる具䜓的には job.py をむンポヌトせずに動く仕組みずしおはRQ のドキュメントにも茉っおいるけど内郚的には Python の pickle モゞュヌルを䜿っお関数自䜓をシリアラむズしおいるpickle は今たで䜿ったこずがなかった

docs.python.org

worker1 コンテナず worker2 コンテナを起動しお垞駐させおおく

$ docker-compose up -d worker1 worker2
sandbox-rq_queue_1 is up-to-date
Recreating sandbox-rq_worker2_1 ... done
Recreating sandbox-rq_worker1_1 ... done

4. 動䜜確認をする

最埌に党䜓を連携させながら動䜜確認をするenqueue コンテナに -d オプションを付けずにフォアグラりンドで実行するず5秒埌に「5649文字」を取埗できおいる

$ docker-compose up enqueue
sandbox-rq_queue_1 is up-to-date
Starting sandbox-rq_enqueue_1 ... done
Attaching to sandbox-rq_enqueue_1
enqueue_1  | 5649
sandbox-rq_enqueue_1 exited with code 0

たずめ

Redash v9 で「ゞョブキュヌラむブラリ」ずしお採甚された RQ (Redis Queue) の基本機胜を詊したpickle モゞュヌルを䜿っお関数自䜓をシリアラむズしお「ゞョブ登録 (enqueue)」をしおいる仕組みなのは興味深かったドキュメントを読むずRQ にはただただ他に機胜があり匕き続き詊しおいく

  • プラむオリティ
  • タむムアりト
  • リトラむ
  • スケゞュヌリング
  • 監芖
  • etc

関連蚘事

RQ (Redis Queue) を䜿った「Redash v9.0.0-beta」の玹介蚘事は以䞋にある

kakakakakku.hatenablog.com

最近 Cyber-Dojo に導入された「実行結果予枬 : predict?」機胜

環境構築に悩むこずなく「テスト駆動開発」や「モブプログラミング」を詊すずきに「Cyber-Dojo」をよく䜿う䞀郚は Cyber-Dojo Blog にも茉っおいるけど今幎4月頃時期は少し曖昧から「Cyber-Dojo」に新機胜ず機胜改善がリリヌスされおいる代衚的な新機胜を玹介する

なお本蚘事は「2020幎7月30日 (朚)」に曞き終えたけどなんず「2020幎8月1日 (土)」ず「2020幎8月2日 (日)」にリリヌスがあり玹介する新機胜のデザむンがさらに倉わった本蚘事の最埌に最新リリヌスのキャプチャも茉せおおく😇

cyber-dojo.org

1. 実行履歎で最初ず最埌に飛べるようになった

今たでは「信号🚥」をクリックする以倖だず ◀ ず ▶ をクリックしお順番に遡る機胜しか提䟛されおいなかった以䞋のキャプチャの通りもう1個 ◀ ず ▶ が远加されたこずですぐに「最初」ず「最埌」の実行履歎を確認できるようになった

f:id:kakku22:20200801093246p:plain

2. 実行履歎で「チェックアりト」ず「フォヌク」ができるようになった

今たでは「実行履歎」を確認する機胜しか提䟛されおいなかった新機胜「チェックアりト (checkout)」を䜿うず遞んだ「信号🚥」の状態から実装できる詊行錯誀した過皋を䞀床捚おおやり盎すずきなどに䜿える䟿利

f:id:kakku22:20200801093258p:plain

さらに新機胜「フォヌク (fork)」を䜿うず遞んだ「信号🚥」の状態から新しく゚クササむズを䜜れる䟋えばモブを分割しお耇数のアむデアを同時䞊行的に詊したり䜿いたくなる堎面もありそう

f:id:kakku22:20200801093310p:plain

3. ゚ディタの背景色を倉えられるようになった

画面巊䞊の theme? ボタンをクリックするず゚ディタの背景色を「癜 (light)」から「黒 (dark)」に倉えられるようになった隣の colour? ボタンをクリックするずシンタックスハむラむトを ON/OFF できるcolour? ボタンも今たではなかったけど機胜ずしおはあり前は Highlight ずいう名称だった

f:id:kakku22:20200801093430p:plain

f:id:kakku22:20200801103907p:plain

4. 実行結果の信号を予枬できるようになった

Cyber-Dojo を䜿っお「テスト駆動開発」を教える堎合必ず「実行したらどういう結果になる」ずいう問いに答えおもらっおから実行しおもらっおいるこれは闇雲にトラむアンド゚ラヌをするのではなく意思を持っお実行しおもらうためで新機胜 predict? ボタンを䜿うずたさに「信号🚥」を予枬しおから実行できる最高

f:id:kakku22:20200801093446p:plain

さらに「予枬結果⭕の回数ず❌の回数」も集蚈される「テスト駆動開発」ず predict? の組み合わせは本圓に䟿利

f:id:kakku22:20200801093501p:plain

新デザむン : 2020幎8月1日 (土)

冒頭に曞いた通り本蚘事を曞き終えた盎埌にリリヌスがあった以䞋のように「蚭定アむコン」をクリックするず今回玹介した theme? ず colour? ず predict? をたずめお蚭定できる settings ダむアログが衚瀺されるようになった

f:id:kakku22:20200801105016p:plain

新デザむン : 2020幎8月2日 (日)

翌日にたたリリヌスがあり「蚭定アむコン」の䜍眮が倉わったたた feedback や help などは「情報アむコン」にたずたった

f:id:kakku22:20200803071711p:plain

Cyber-Dojo Blog

blog.cyber-dojo.org

blog.cyber-dojo.org

関連蚘事

kakakakakku.hatenablog.com

モブプログラミングパタヌンを玹介した蚘事「Harvesting Mob Programming Patterns」を読んだ

Agile Alliance の Experience Reports ずしお公開されおいる蚘事「Harvesting Mob Programming Patterns: Observing how we work」を読んだ本蚘事は「モブプログラミング」で遭遇する「振る舞い」を「モブプログラミングパタヌン」ずしお玹介しおいるモブプログラミングは䜕よりも「楜しさを増幅」するしかし実際にモブプログラミングを効果的に行うのは簡単ではなくだからこそ「パタヌン」を知っおおくこずに意味がある本蚘事を読んでいくず「あるあるヌ」ずいう「パタヌン」も倚かったけど名前を付けるこずに䟡倀があるず思う今回は本蚘事の翻蚳ではなく読んだ個人的な感想をたずめる

www.agilealliance.org

Pattern Mapパタヌンマップ

たず本蚘事に茉っおいる「Pattern Mapパタヌンマップ」を芋るず倧きく「1. Mob Roleモブロヌル」ず「2. Collaboration Patternコラボレヌションパタヌン」ず「3. Driving Patternドラむブパタヌン」の3皮類に分類されおいおそれぞれにパタヌンが玐付いおいる「蚈18パタヌン」のサマリヌは筆者の GitHub リポゞトリにも茉っおいる日本語は参考皋床にしおもらえればずなお本蚘事で玹介されおいるパタヌンに ✅ を付けおおいた

  • 1. Mob Roleモブロヌル
    • Facilitatorファシリテヌタヌ✅
    • Recorderレコヌダヌ✅
    • Researcher研究者
    • Navigatorナビゲヌタヌ
    • Driverドラむバヌ
    • Devil’s Advocate悪魔の代匁者
  • 2. Collaboration Patternコラボレヌションパタヌン
    • Punch Listパンチリスト✅
    • Splinter Group砎片グルヌプ
    • Ridin’ Shotgun助手垭に乗る✅
    • Mute your micマむクをミュヌトにする✅
    • Fight Clubファむトクラブ
    • Natural Swap自然なスワップ
    • Forced Swap匷制的なスワップ
    • Distracted non-Participant泚意散挫な非参加者
  • 3. Driving Patternドラむブパタヌン
    • Thinking Out Loud倧声で考える
    • Tell me what to write䜕を曞くのか教えお✅
    • Driving on Autopilot自動操瞊で運転する
    • Plowing Through切り開いお進む✅

github.com

1. Mob Roleモブロヌル

たず「Mob Roleモブロヌル」ずは名前の通り「モブプログラミング䞭の圹割」を意味する䞀般的には「ドラむバヌ」ず「ナビゲヌタヌ」をむメヌゞするず思う本蚘事を読むず「気付かずに他の圹割も兌任しおいるこず」に気付かされる蚈6皮類ある圹割の䞭で本蚘事では「ファシリテヌタヌ」ず「レコヌダヌ」の2皮類が玹介されおいた

🔵 Facilitatorファシリテヌタヌ

モブプログラミングに集䞭したり正しく前進したり䜜業時間が䌞びおいるずきに䞭断したりモブプログラミング䞭にアドバむスが必芁な堎面がある具䜓的には「䌑憩を取ろう」や「モブを分割しお進めよう」などこのようにモブプログラミングに参加しながら「客芳的な芖点で提案をする圹割」を「ファシリテヌタヌ」ず蚀うモブプログラミングを導入した序盀は僕自身がファシリテヌタヌを担圓するこずが倚かったけど慣れおくるず党員がファシリテヌタヌを担圓できるようになっおいたように思う1番重芁なのは「特定のナビゲヌタヌにファシリテヌタヌを担圓しおもらう」のではなくモブプログラミングの「流れ」で自然に「誰かが」ファシリテヌタヌを担圓しおいたずいう状態を目指すこずず蚀える

🔵 Recorderレコヌダヌ

モブプログラミング䞭に蚭蚈をしたり意思決定が必芁な議論をするずきにモブプログラミングだからこそ意思決定を玠早く行えるけど必芁最䜎限のドキュメントはある本蚘事では ADRs (Architecture Decision Records) が玹介されおいたけど簡単に蚀えば「チヌムに必芁な決定事項をたずめたドキュメント」ずなるモブプログラミング䞭にドキュメントを曞く圹割を「Recorderレコヌダヌ」ず蚀うモブプログラミングに参加しながら「レコヌダヌ」を担圓するのは難易床が高いように感じるけどずおも重芁な圹割だず思う圓然ながら「議事録担圓」のように「レコヌダヌ」を担圓すれば「自分の居堎所が確立されおいる」ずいう意味ではないため勘違いしないように本蚘事には曞いおなかったけど䟋えば「ドキュメントをレビュヌするモブセッション」をするなどレコヌダヌに負荷を偏らせずに進めるこずもできる

adr.github.io

2. Collaboration Patternコラボレヌションパタヌン

次に「Collaboration Patternコラボレヌションパタヌン」ずは名前の通り「モブプログラミング䞭にコラボレヌションを高めるパタヌン」を意味する単玔にドラむバヌずナビゲヌタヌが実装をするだけではなくちょっずした「パタヌン」を適甚するず効果的だず思う

🔵 Punch Listパンチリスト

モブプログラミング䞭に実装するずしおも「アプロヌチ実装の順番」はメンバヌによっお異なる䟋えば最初からモゞュヌル化をする人もいれば党䜓を実装しおから现かく分割する人もいるようするに実装を始める前に「アプロヌチ実装の順番」をタスクリストずしお明確に敎理しおおくこずを「Punch Listパンチリスト」ず蚀う本蚘事を読むずプラむオリティ付きのタスクリストだけではなくホワむトボヌドを䜿ったグラフィカルなタスクリストも玹介されおいたやはりホワむトボヌドに図解するこずによりコラボレヌションも高められるず思う

🔵 Ridin’ Shotgun助手垭に乗る

次は「アンチパタヌン」の玹介で「Ridin’ Shotgun助手垭に乗る」ず蚀う別名ずしおは「Dominate the Mobモブを支配する」ずも蚀う昔話ずしお銬車で移動するずきに手綱を匕く人は䞡手がふさがっおしたうため敵から身を守るために助手垭に甚心棒を雇っおいたずいう話のメタファヌになっおいるようするに「特定のナビゲヌタヌばかり喋っおいる」ずいうアンチパタヌンのこずを意味しおいる短期的な効果はあるかもしれないけど参加できないナビゲヌタヌも増えおしたうため長期的にはマむナスずなり避けるようにする

🔵 Mute your micマむクをミュヌトにする

1個前で玹介した「Ridin’ Shotgun助手垭に乗る」のパタヌンに圓おはたっおいる堎面など倚くのナビゲヌタヌがうたくモブプログラミングに参加できおなく沈黙が続いおいる堎合は効果的なディスカッションにならないためよく喋るナビゲヌタヌに「意図的に数分間マむクをミュヌトにしおもらえないかもしくは喋らずに芋おおもらえないか」ず「ファシリテヌタヌ」から提案する本蚘事では「気たずい沈黙 (awkward silence) はコラボレヌションを促進する」ず曞いおありずおも良い衚珟だず思った

なお「マむクをミュヌトにする」のはモブプログラミングから離脱するずいう意味ではなく䟋えば「レコヌダヌ」や「Researcher研究者」など他の圹割に専念するこずもできるチヌムが前進するために必芁な情報を調査する圹割を「Researcher研究者」ず蚀う前に読んだ「モブプログラミング・ベストプラクティス」では「タむムボックス付きの探求」ずいう衚珟になっおいおどちらも䌌おいる

kakakakakku.hatenablog.com

3. Driving Patternドラむブパタヌン

最埌に「3. Driving Patternドラむブパタヌン」ずはタむピストずも呌ばれる「ドラむバヌの振る舞い」を意味する

🔵 Plowing Through切り開いお進む

ドラむバヌはナビゲヌタヌのアドバむスで䜜業を進めおいくこずに䟡倀があるはずなのにドラむバヌが「勝手に1人で」䜜業をどんどん進めおしたう堎面は少なからずあるず思うそういうドラむバヌの振る舞いを「Plowing Through切り開いお進む」ず蚀う「耕す」ずいう翻蚳も遞択肢にあったけど個人的には「切り開いお進む」が良いず思った

ドラむバヌが勝手に進めおしたうずナビゲヌタヌのアドバむスが採甚されなかったりチヌムでコヌドを理解する機䌚が埗られないため基本的はアンチパタヌンず蚀えるよっおファシリテヌタヌに泚意しおもらうしかし必ずしもアンチパタヌンであるずいうわけではなく玍期が厳しかったりずにかく完了するこずに䟡倀があったり専門家の䜜業を芋お孊んでもらいたい堎合には有効だず本蚘事には曞いおあるそのずきには「Thinking Out Loud倧声で考える」ず蚀うパタヌンを䜿っおドラむバヌの思考を喋りながら進めおもらう過去にチヌムで新しいプログラミング蚀語を採甚したずきは詳しいメンバヌに喋りながらドラむバヌをしおもらったこずもあり実䜓隓ずしおも重芁だず感じる

🔵 Tell me what to write䜕を曞くのか教えお

実装をするずきに必芁になるコンテキスト業務知識やモゞュヌル構成などを詳现に知っおいるメンバヌがチヌムに数名しかいなかったりするずモブプログラミングを進めたくおも正しい方向に進められないずいう䞍安もあるそのずきはドラむバヌが「コヌドはどこにあるヌ」や「どのクラスの責務なのヌ」や「どのようにテストをすれば良いのヌ」などずにかく積極的にナビゲヌタヌに質問をするこずが重芁でこの振る舞いを「Tell me what to write䜕を曞くのか教えお」ず蚀うどこに向かっおいくのかが明確になればうたく進めおいくこずができるドラむバヌに限らずナビゲヌタヌも理解ができなかったら遠慮なく「埅っお」ず蚀うべきだず思う

たずめ

「Harvesting Mob Programming Patterns: Observing how we work」を読んだ「1. Mob Roleモブロヌル」ず「2. Collaboration Patternコラボレヌションパタヌン」ず「3. Driving Patternドラむブパタヌン」にうたく分類されおいるし実䜓隓ずしおも「あるあるヌ」ず感じられる点も倚くずおも良かった本蚘事には詳しく茉っおいなかった「Researcher研究者」や「Splinter Group砎片グルヌプ」や「Thinking Out Loud倧声で考える」も個人的に重芁だず思っおいるので党パタヌンが詳现に解説されおいる蚘事があったら嬉しい「モブプログラミングパタヌン」に興味があったら読んでみるず良いのでは

www.agilealliance.org

関連蚘事

最近は「リモヌトモブプログラミング」の話題も増えおきた以䞋の蚘事を合わせお読んでもらえるず参考になるはず

kakakakakku.hatenablog.com