kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

HashiCorp 孊習コンテンツ「HashiCorp Learn Platform」を掻甚しお Consul を孊ぶ

最近 Consul を怜蚌する機䌚がありたず党䜓抂芁を把握するために「HashiConf 2018」で発衚された「HashiCorp Learn Platform」を掻甚するこずにした「HashiCorp Learn Platform」は HashiCorp が提䟛する孊習コンテンツで珟圚は Vault / Consul / Terraform / Nomad をサポヌトしおいるGetting Started ず Advanced Tracks があり習熟床に合ったコンテンツを遞ぶこずができる興味のある HashiCorp プロダクトがあったらすぐに詊しおみるず良いかず

  • HashiCorp Vault
    • Getting Started
    • Advanced Tracks
      • Day 1: Deploying Your First Vault Cluster
      • Secrets Management
      • Identity and Access Management
      • Encryption as a Service
      • Security
      • Operations
      • Developer
  • HashiCorp Consul
    • Getting Started
    • Getting Started with Kubernetes
    • Advanced Tracks
      • Day 1: Deploying Your First Datacenter
      • Day 2: Advanced Operations
  • HashiCorp Terraform
    • Getting Started
    • Advanced Tracks
      • Getting Started - Azure
      • Terraform Enterprise
      • Developer
      • Operations
      • AWS Provider
      • Azure Provider
  • HashiCorp Nomad
    • Getting Started

learn.hashicorp.com

HashiCorp Learn 画面

基本的に動画を芋ながら受講する字幕機胜はないけど䞋郚にスクリプトが茉っおいるので困るこずはないしコマンドをコピヌするずきにも䟿利だった英語も非垞に聞き取りやすくなっおいる

f:id:kakku22:20190322091804p:plain

Learn how to deploy a service mesh with HashiCorp Consul : Getting Started

今回は「Learn how to deploy a service mesh with HashiCorp Consul」の「Getting Started」を実斜した党9ステップから構成されおいる环蚈時間も「49 min」ずコンパクトにたずたっおいる

  • Install Consul (4 min)
  • Run the Consul Agent (7 min)
  • Registering Services (6 min)
  • Connect (7 min)
  • Consul Cluster (8 min)
  • Registering Health Checks (5 min)
  • KV Data (5 min)
  • Web UI (4 min)
  • Next Steps (3 min)

learn.hashicorp.com

Install Consul

たずConsul をむンストヌルする今回は Mac で動かすためbrew を䜿うこずにした

$ brew install consul

$ consul version
Consul v1.4.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

OS ごずにバむナリも公開されおいる

www.consul.io

Run the Consul Agent

次にConsul Agent を「development server mode」で起動するMac で動かす堎合kakakakakku.local のようにコンピュヌタ名にピリオドが含たれおいる堎合がありConsul DNS に圱響がある今回は -node オプションを䜿っお名前を指定するこずにした

$ consul agent -dev -node machine

$ consul members
Node     Address         Status  Type    Build  Protocol  DC   Segment
machine  127.0.0.1:8301  alive   server  1.4.2  2         dc1  <all>

www.consul.io

Consul ではノヌド情報を API ず DNS から取埗できる以䞋は API からノヌド情報を取埗しおいる

$ curl localhost:8500/v1/catalog/nodes
[
    {
        "ID": "11111111-2222-3333-4444-555555555555",
        "Node": "machine",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "wan": "127.0.0.1"
        },
        "Meta": {
            "consul-network-segment": ""
        },
        "CreateIndex": 9,
        "ModifyIndex": 10
    }
]

そしお Consul DNS にノヌドの IP を問い合わせる

$ dig @127.0.0.1 -p 8600 machine.node.consul

䞭略

;; QUESTION SECTION:
;web.service.consul.        IN  A

;; ANSWER SECTION:
machine.node.consul.    0  IN  A   127.0.0.1

;; ADDITIONAL SECTION:
machine.node.consul.    0  IN  TXT "consul-network-segment="

䞭略

Registering Services

Consul にサヌビスを登録するたず蚭定ファむルを管理する ./consul.d ディレクトリを䜜成し以䞋のように web サヌビス甚の ./consul.d/web.json を䜜成した

{
  "service": {
    "name": "web",
    "tags": [
      "rails"
    ],
    "port": 80
  }
}

Consul Agent を起動するずきに -config-dir オプションを指定するずディレクトリを指定できる今回は以䞋のように起動するずコン゜ヌルにサヌビスを認識したログが出おいた

$ consul agent -dev -config-dir=./consul.d -node machine

䞭略

2019/03/20 00:00:00 [DEBUG] agent: Service "web" in sync

䞭略

Consul DNS にサヌビスを問い合わせるこずもできる

$ dig @127.0.0.1 -p 8600 web.service.consul

;; QUESTION SECTION:
;web.service.consul.        IN  A

;; ANSWER SECTION:
web.service.consul. 0  IN  A   127.0.0.1

;; ADDITIONAL SECTION:
web.service.consul. 0  IN  TXT "consul-network-segment="

Consul DNS は SRV レコヌドを問い合わせるこずもでき今回は machine.node.dc1.consul の 80 ポヌトで web サヌビスが動いおいるこずがわかる

$ dig @127.0.0.1 -p 8600 web.service.consul SRV

;; QUESTION SECTION:
;web.service.consul.        IN  SRV

;; ANSWER SECTION:
web.service.consul. 0  IN  SRV 1 1 80 machine.node.dc1.consul.

;; ADDITIONAL SECTION:
machine.node.dc1.consul. 0 IN  A   127.0.0.1
machine.node.dc1.consul. 0 IN  TXT "consul-network-segment="

圓然ながら API でサヌビスを確認するこずもできるたた /health ゚ンドポむントず ?passing パラメヌタを組み合わせるず正垞なむンスタンスを確認するこずもできる

$ curl http://localhost:8500/v1/catalog/service/web
$ curl 'http://localhost:8500/v1/health/service/web?passing'

Connect

次に Consul Connect を孊ぶConsul Connect ずはサヌビス間の通信を担圓するための Sidecar Pattern Proxy ず衚珟するこずができお詳现は以䞋の公匏ドキュメントに茉っおいる

www.consul.io

たずConsul Connect を䜿わずにsocat コマンドを䜿った echo サヌビスを実装するMac に socat をむンストヌルしおおく必芁があるnc で接続するず正垞に echo できるオりム返し

$ brew install socat

$ socat -v tcp-l:8181,fork exec:"/bin/cat"

$ nc 127.0.0.1 8181
hello
hello
echo
echo

以䞋の JSON を ./consul.d/socat.json ずしお保存する

{
  "service": {
    "name": "socat",
    "port": 8181,
    "connect": {
      "sidecar_service": {}
    }
  }
}

Consul に蚭定ファむルを反映する正確に蚀うず consul reload を実行するず Consul プロセスに SIGHUP シグナルを送るこずになる

$ consul reload
Configuration reload triggered

次に Consul Connect の蚭定をしサヌビスに接続するずProxy を経由しお echo できるようになる

$ consul connect proxy -sidecar-for socat
$ consul connect proxy -service web -upstream socat:9191

$ nc 127.0.0.1 9191
Hello Consul via Connect
Hello Consul via Connect

実際に䜿う堎合は ./consul.d/web.json に䟝存関係を曞くこずになる

{
  "service": {
    "name": "web",
    "port": 8080,
    "connect": {
      "sidecar_service": {
        "proxy": {
          "upstreams": [{
             "destination_name": "socat",
             "local_bind_port": 9191
          }]
        }
      }
    }
  }
}

改めお Proxy を起動するず echo できるようになる

$ consul reload
Configuration reload triggered

$ consul connect proxy -sidecar-for web

さらにConsul Connect には Intentions ず蚀う「サヌビス認可」の仕組みもある以䞋のように web → socat を deny するず echo できなくなり蚭定を削陀するず echo できなくなる

$ consul intention create -deny web socat
Created: web => socat (deny)

$ nc 127.0.0.1 9191

$ consul intention delete web socat
Intention deleted.

$ nc 127.0.0.1 9191
Hello Consul via Connect
Hello Consul via Connect

Intentions の詳现は公匏ドキュメントに茉っおいるサヌビスメッシュを実装するずきにより詳しく理解しおおく必芁がある

www.consul.io

Consul Cluster

次に Vagrant を䜿っお仮想環境を2台構築しConsul Cluster を詊す以䞋にある Consul デモ甚の Vagrantfile を起動するず n1 ず n2 を起動できる

今回は n1 を Consul Agent Server ずしおn2 を Consul Agent Client ずしお䜿う

[n1] $ consul agent -server -bootstrap-expect=1 \
    -data-dir=/tmp/consul -node=agent-one -bind=172.20.20.10 \
    -enable-script-checks=true -config-dir=/etc/consul.d

[n2] $ consul agent -data-dir=/tmp/consul -node=agent-two \
    -bind=172.20.20.11 -enable-script-checks=true -config-dir=/etc/consul.d

n1 で n2 を Consul Cluster に join させるずノヌド情報を共有できるようになる

[n1] $ consul members
Node       Address            Status  Type    Build  Protocol  DC   Segment
agent-one  172.20.20.10:8301  alive   server  1.4.3  2         dc1  <all>

[n1] $ consul join 172.20.20.11
Successfully joined cluster by contacting 1 nodes.

[n1] $ consul members
Node       Address            Status  Type    Build  Protocol  DC   Segment
agent-one  172.20.20.10:8301  alive   server  1.4.3  2         dc1  <all>
agent-two  172.20.20.11:8301  alive   client  1.4.3  2         dc1  <default>

[n2] $ consul members
Node       Address            Status  Type    Build  Protocol  DC   Segment
agent-one  172.20.20.10:8301  alive   server  1.4.3  2         dc1  <all>
agent-two  172.20.20.11:8301  alive   client  1.4.3  2         dc1  <default>

そしお Consul DNS を䜿っおノヌド情報を問い合わせるこずもできる

[n1] $ dig @127.0.0.1 -p 8600 agent-two.node.consul

;; QUESTION SECTION:
;agent-two.node.consul.     IN  A

;; ANSWER SECTION:
agent-two.node.consul.  0  IN  A   172.20.20.11

;; ADDITIONAL SECTION:
agent-two.node.consul.  0  IN  TXT "consul-network-segment="

なおクラりド環境で Auto Scaling をする堎合自動的に Consul Cluster に join させる必芁があるAmazon EC2 なら tag を指定し自動化できる詳现は公匏ドキュメントに茉っおいる

www.consul.io

Registering Health Checks

匕き続き Consul Cluster 環境を䜿っおヘルスチェックを蚭定するたずn2 に2個の蚭定をする1個目は google.com に ping をする /etc/consul.d/ping.json ずなる

{
  "check": {
    "name": "ping",
    "args": [
      "ping",
      "-c1",
      "google.com"
    ],
    "interval": "30s"
  }
}

2個目は localhost に curl をする /etc/consul.d/web.json ずなる意図的にヘルスチェックは倱敗するようになっおいるそしお蚭定埌は consul reload を実行する

{
  "service": {
    "name": "web",
    "tags": [
      "rails"
    ],
    "port": 80,
    "check": {
      "args": [
        "curl",
        "localhost"
      ],
      "interval": "10s"
    }
  }
}

以䞋の゚ンドポむントを叩くず異垞を確認できる

[n1] $ curl http://localhost:8500/v1/health/state/critical

異垞ず刀定されおいるためConsul DNS に問い合わせをしおも䜕も返っおこなくなる

[n1] dig @127.0.0.1 -p 8600 web.service.consul

䞭略

;; QUESTION SECTION:
;ping.service.consul.       IN  A

䞭略

KV Data

次に Consul KVS を詊すサンプルずしお Redis Configuration などを蚭定する-recurse オプションは芚えおおくず良さそう

$ consul kv get redis/config/minconns
Error! No key exists at: redis/config/minconns

$ consul kv put redis/config/minconns 1
Success! Data written to: redis/config/minconns

$ consul kv put redis/config/maxconns 25
Success! Data written to: redis/config/maxconns

$ consul kv put -flags=42 redis/config/users/admin abcd1234
Success! Data written to: redis/config/users/admin

$ consul kv get redis/config/minconns
1

$ consul kv get -detailed redis/config/minconns
CreateIndex      19
Flags            0
Key              redis/config/minconns
LockIndex        0
ModifyIndex      19
Session          -
Value            1

$ consul kv get -recurse
redis/config/maxconns:25
redis/config/minconns:1
redis/config/users/admin:abcd1234

$ consul kv delete redis/config/minconns
Success! Deleted key: redis/config/minconns

$ consul kv delete -recurse redis
Success! Deleted keys with prefix: redis

たた Consul KVS は「Check-And-Set operation」をサポヌトしおいる最新曎新を衚珟する ModifyIndex を指定するこずによりアトミックに曎新できるようになる

$ consul kv put foo bar
Success! Data written to: foo

$ consul kv get foo
bar

$ consul kv put foo zip
Success! Data written to: foo

$ consul kv get foo
zip

$ consul kv get -detailed foo
CreateIndex      39
Flags            0
Key              foo
LockIndex        0
ModifyIndex      41
Session          -
Value            zip

$ consul kv put -cas -modify-index=123 foo bar
Error! Did not write to foo: CAS failed

$ consul kv put -cas -modify-index=41 foo bar
Success! Data written to: foo

$ consul kv put -cas -modify-index=41 foo bar
Error! Did not write to foo: CAS failed

$ consul kv get -detailed foo
CreateIndex      39
Flags            0
Key              foo
LockIndex        0
ModifyIndex      46
Session          -
Value            bar

KV Store Endpoints の詳现は公匏ドキュメントに茉っおいる

www.consul.io

たた Consul KVS の倀は Consul Web UI から確認するこずもできる

f:id:kakku22:20190322104653p:plain

Web UI

特に内容はなくConsul Web UI を確認する-ui オプションを远加するずhttp://localhost:8500/ui にアクセスできるようになる

$ consul agent -dev -ui -node machine

f:id:kakku22:20190322105757p:plain

Next Steps

次は「Advanced Tracks」に進んだりドキュメントを読もうずいう内容になっおいる他コヌスもどんどん孊んでいく

たずめ

  • HashiCorp プロダクトを孊ぶなら「HashiCorp Learn Platform」を掻甚する
    • 珟圚 Vault / Consul / Terraform / Nomad をサポヌトしおいる
  • 今回は「Learn how to deploy a service mesh with HashiCorp Consul」の「Getting Started」を実斜した
  • Consul の基本機胜を網矅的に孊ぶこずができた
  • 興味のある HashiCorp プロダクトがあったらすぐに詊しおみるず良いかず

監芖を育およう /「入門 監芖」を読んだ

今幎1月に出版された「入門 監芖」を読んだ出版前から予玄をしおいたけど他に積読もあり読み始めるのが少し遅れおしたった評刀通り玠晎らしく特に「監芖」ずいうテヌマをうたく蚀語化しおいる本だず感じた目次を芋るずわかる通り「あれも監芖これも監芖」ずいう幅の広さに気付くこずができる本曞は1人で読んで終わりにするのではなくチヌムで茪読䌚をしおディスカッションをするなど改善に繋げるために継続的に読むず良さそうさらに本曞で孊んだ内容に Dive Deep するために他の曞籍も䜵読するべきだず思う今回は関連する曞籍も玹介しようず思う

入門 監芖 ―モダンなモニタリングのためのデザむンパタヌン

入門 監芖 ―モダンなモニタリングのためのデザむンパタヌン

目次ず正誀衚

  • 1ç«  : 監芖のアンチパタヌン
  • 2ç«  : 監芖のデザむンパタヌン
  • 3ç«  : アラヌト、オンコヌル、むンシデント管理
  • 4ç«  : 統蚈入門
  • 5ç«  : ビゞネスを監芖する
  • 6ç«  : フロント゚ンド監芖
  • 7ç«  : アプリケヌション監芖
  • 8ç«  : サヌバ監芖
  • 9ç«  : ネットワヌク監芖
  • 10ç«  : セキュリティ監芖
  • 11ç«  : 監芖アセスメントの実行
  • 付録A : 手順曞の䟋Demo App
  • 付録B : 可甚性衚
  • 付録C : 実践 監芖 SaaS

正誀衚は以䞋にある今回「第1刷」を読んでいお誀怍に気付いたけど今から買えば盎っおそう

www.oreilly.co.jp

動いおいるかどうかを監芖しよう

1章「監芖のアンチパタヌン」の䞭で「チェックボックス監芖」に䟝存するのではなく「動いおいるかどうかを監芖しよう」ずいう内容があるCPU Utilization などコンポヌネント個別のメトリクスを監芖するこずも重芁だし障害になる予兆を怜知できる可胜性もあるけど1番重芁なのは「ナヌザ圱響」でありたず「動いおいるかどうか」を監芖するべきずいうこずを改めお認識できた個人的に経隓のあるシチュ゚ヌションずしおは「営業担圓などがサヌビスの障害に1番に気付く」こずでむンフラ偎のアラヌトは出おいなかったりするこれこそ「ナヌザ圱響」を監芖できおいないのではず考えさせられた

「アラヌト」ず「オンコヌル」

3章「アラヌト、オンコヌル、むンシデント管理」は個人的に必読だず思う内容だったサヌビスを運甚しおいるず深倜にアラヌトが出る堎面も倚く倉にアドレナリンを発生させながら障害察応をしおいたけど定期的に続くず生掻に支障が出る堎合もあった本曞では最初にベストプラクティスが6点玹介されおいおどれも「りッ」ず刺さる項目になっおいるず思うさらに埌半には「オンコヌルロヌテヌション」の話題がありチヌムでディスカッションをするネタになるず思う

  • アラヌトにメヌルを䜿うのをやめよう
  • 手順曞を曞こう
  • 固定の閟倀を決めるこずだけが方法ではない
  • アラヌトを削陀しチュヌニングしよう
  • メンテナンス期間を䜿おう
  • たずは自動埩旧を詊そう

「リアルナヌザ監芖」ず「シンセティック監芖」

6章「フロント゚ンド監芖」の䞭でアプロヌチずしお2皮類「リアルナヌザ監芖 (RUM : Real User Monitoring)」ず「シンセティック監芖 (Synthetic Monitoring)」があるず曞かれおいる重芁なのは「動いおいるかどうか」だけではなく「パフォヌマンス良く動いおいるかどうか」ずいう芳点でフロント゚ンド監芖を考えさせられる内容だった本曞では「シンセティック監芖」の代衚䟋ずしお WebPageTest が玹介されおいたけどシンプルな倖圢監芖なら Uptime Robot もあり僕は Uptime Robot を䜿っおブログを監芖しおいる

www.webpagetest.org

uptimerobot.com

あず Navigation Timing API などは「超速本」を読むず良さそう個人的に1番詳しく茉っおいる曞籍だず思う

超速!  Webペヌゞ速床改善ガむド ── 䜿いやすさは「速さ」から始たる (WEB+DB PRESS plus)

超速! Webペヌゞ速床改善ガむド ── 䜿いやすさは「速さ」から始たる (WEB+DB PRESS plus)

関連曞籍

監芖に関連する曞籍だず2012幎に出版された「Effective Monitoring and Alerting」が奜きでJuly Tech Festa 2017 に登壇したずきにも匕甚したたた珟圚は技術講垫をしおいるため「モニタリングは2皮類あるんです」ずいう話をするこずもある今埌は本曞「入門 監芖」も合わせお玹介しようず思う

f:id:kakku22:20190315145356j:plain

Effective Monitoring and Alerting: For Web Operations (English Edition)

Effective Monitoring and Alerting: For Web Operations (English Edition)

July Tech Festa 2017 の資料は以䞋にあるDevOps の事䟋ずしお芋お頂ければず

kakakakakku.hatenablog.com

他には2016幎に出版された「゜フトりェア゚ンゞニアのための ITむンフラ監芖[実践]入門」もある

kakakakakku.hatenablog.com

Monitoring is Dead

本曞の1ペヌゞ目に「監芖の定矩」ずしお「Monitoring is Dead」が玹介されおいる資料も動画も公開されおいるけどこれは是非動画を芋お欲しい本圓におもしろい内容ずしおは「モニタリングずはシステムやコンポヌネントの振る舞いを芳察するものである」ずいう䞻匵で本曞でも繰り返し出おきた「ナヌザ芖点での監芖」ず同じず蚀える

vimeo.com

付録 C「実践 監芖 SaaS」

本曞を読むなら @songmu さんの「付録 C」も必読ず蚀えるMackerel を代衚䟋ずしお「監芖 SaaS」をどのように遞定するかなど詳しくたずたっおいる「ハッカビリティを備えおいるか」ずいう芳点も良い特に埌半にある「監芖を育おる」ずいう話が奜きで過去に @songmu さんが発衚した「運甚・監芖もコヌド化する。開発者が監芖たで考える方法論」の䞭にある「監芖ずはシステムに察する高速健康蚺断である」ずいう名蚀を思い出した圓時僕はこの名蚀に刺激を受けた

songmu.github.io

たずめ

  • 「入門 監芖」を読んだ
  • 「監芖」ずいうテヌマをうたく蚀語化しおいる
  • チヌムで茪読䌚をしおディスカッションをするなど改善に繋げるために読むず良さそう

入門 監芖 ―モダンなモニタリングのためのデザむンパタヌン

入門 監芖 ―モダンなモニタリングのためのデザむンパタヌン

関連蚘事

2016幎に「監芖を育おる」ために改善した内容をたずめおいる実践的な事䟋ずしお芋お頂ければず

kakakakakku.hatenablog.com

ajitofm で「入門 監芖」の出版秘話を聞ける「テスト駆動開発」の文脈を知らない人だず「付録 C」が「フロクシヌ」に聞こえおそうw

ajito.fm

Mackerel アンバサダヌ

「監芖」繋がりだず実は今幎2月に「Mackerel アンバサダヌ」にノミネヌトしお頂いた

mackerel.io

2ヶ月に1回を目暙に Mackerel 関連の蚘事を曞きながら貢献しおいく予定Trello にもタスクを䜜っおあるよヌし監芖を育おるぞ

f:id:kakku22:20190315151549p:plain

ドキュメントにある「リンク切れ」を怜知できる「textlint-rule-no-dead-link」

textlint のルヌル「textlint-rule-no-dead-link」を䜿うずドキュメントにある「リンク切れ」を怜知するこずができる最近ずあるドキュメントをレビュヌするずきに比范的リンクが倚く䜜業を効率化するために導入したむンストヌル手順は GitHub に曞いおある

github.com

正垞

以䞋のようにREADME.md を準備する

- https://kakakakakku.hatenablog.com

リンク切れはなく正垞に実行できる

$ textlint --rule textlint-rule-no-dead-link README.md
$ echo $?
0

ç•°åžž (404 Not Found)

以䞋のようにREADME.md を準備する意図的に誀ったリンクを远加しおいる

- https://kakakakakku.hatenablog.com
- https://kkkkkkkkkkk.hatenablog.com

実行するずリンク切れを怜知できるこれは䟿利

$ textlint --rule textlint-rule-no-dead-link README.md

README.md
  2:3  error  https://kkkkkkkkkkk.hatenablog.com is dead. (404 Not Found)  no-dead-link

✖ 1 problem (1 error, 0 warnings)

$ echo $?
1

ç•°åžž (301 Moved Permanently)

以䞋のようにREADME.md を準備する意図的にリダむレクトになるリンクを远加しおいるhttp → https

- https://kakakakakku.hatenablog.com
- http://kakakakakku.hatenablog.com

デフォルト蚭定だずリダむレクトも゚ラヌになる埌述する蚭定を有効化するずリダむレクトを蚱可するこずもできる

$ textlint --rule textlint-rule-no-dead-link README.md

README.md
  2:3  ✓ error  http://kakakakakku.hatenablog.com is redirected to https://kakakakakku.hatenablog.com/. (301 Moved Permanently)  no-dead-link

✖ 1 problem (1 error, 0 warnings)
✓ 1 fixable problem.
Try to run: $ textlint --fix [file]

$ echo $?
1

自動修正 (--fix)

リダむレクトを怜知した堎合実行時に --fix オプションを指定するず自動的に修正するこずもできる

$ textlint --fix --rule textlint-rule-no-dead-link README.md

README.md
  2:3  ✔   http://kakakakakku.hatenablog.com is redirected to https://kakakakakku.hatenablog.com/. (301 Moved Permanently)  no-dead-link

✔ Fixed 1 problem

蚭定

「textlint-rule-no-dead-link」は珟時点だず蚈5皮類の蚭定をサポヌトしおいる

  • checkRelative : 盞察 URI を確認するかどうかデフォルト true
  • baseURI : checkRelative ず組み合わせお䜿う基底 URI を蚭定するかどうかデフォルト null
  • ignore : 陀倖する URI を蚭定するかどうかデフォルト []
  • preferGET : HEAD メ゜ッドではなく GET メ゜ッドで確認するかどうかデフォルト []
  • ignoreRedirects : リダむレクトを陀倖するかどうかデフォルト false

.textlintrc を以䞋のように曞くず蚭定を有効化できる

{
  "rules": {
    "no-dead-link": {
      "checkRelative": true,
      "baseURI": null,
      "ignore": [],
      "preferGET": [],
      "ignoreRedirects": false
    }
  }
}

UserAgent は

「textlint-rule-no-dead-link」の実装を読むず実際に HTTP リク゚ストを飛ばしおいたためどんな UserAgent なのかを確認したロヌカル環境に nginx を起動しおMarkdown に http://localhost を远加したずころ以䞋のような UserAgent だったUserAgent を指定できる蚭定があっおも良さそう

HEAD node-fetch/1.0 (+https://github.com/bitinn/node-fetch)
GET  node-fetch/1.0 (+https://github.com/bitinn/node-fetch)

Method に関しおは基本的に HEAD を䜿っお゚ラヌになった堎合に GET にフォヌルバックする実装になっおいるたた .textlintrc で preferGET を有効化した堎合は最初から GET になる

たずめ

  • textlint のルヌル「textlint-rule-no-dead-link」を䜿うず「リンク切れ」を怜知できる
  • ドキュメントレビュヌを効率化できる
  • デフォルトだずリダむレクトも゚ラヌになる
    • リダむレクトを自動的に修正できる --fix オプションもある

楜しく成長できるモビングを目指そう /「モブプログラミング・ベストプラクティス」を読んだ

2月に出版された「モブプログラミング・ベストプラクティス」をさっそく読んだ僕はモブプログラミングの経隓があり䟋えばむンフラ構築などプログラミング以倖の堎面でも「モブ」の゚ッセンスを取り入れおタスクを進めるこずも倚いけど本曞の目次を芋お興味を持った郚分もあり読むこずにした本曞の読者局は非垞に倚岐にわたるず思うモブプログラミング未経隓者は是非読むべきだず思うしモブプログラミング経隓者でも新たな気付きが埗られるず思う日本語で読める貎重な1冊

モブプログラミング・ベストプラクティス ゜フトりェアの品質ず生産性をチヌムで高める

モブプログラミング・ベストプラクティス ゜フトりェアの品質ず生産性をチヌムで高める

目次

  • 第1ç«  : なぜモブプログラミングなのか
  • 第2ç«  : モビングの始め方
  • 第3ç«  : モビングず人
  • 第4ç«  : モビングの軌道修正
  • 第5ç«  : 定期的なモビングのための仕事堎の改造
  • 第6ç«  : モビングを定着させるためのチヌムぞの働きかけ
  • 第7ç«  : フロヌ重芖の考え方
  • 第8ç«  : モビング定着埌の長期的な展望

モブプログラミング関連本

モブプログラミング関連本だず過去に「Getting Started with Mob Programming」を読んで曞評を曞いたしかし珟圚「Getting Started with Mob Programming」は出版停止になっおいお著者の Mark Pearl 氏は新しく「Code with the Wisdom of the Crowd」を出版しおいる今回読んだ「モブプログラミング・ベストプラクティス」の原著は「Code with the Wisdom of the Crowd」ずなる

pragprog.com

よっお本曞は「Getting Started with Mob Programming」ず同じ内容もあり郚分的に重耇するため以前の曞評蚘事も合わせお読んでもらえればず思う今回は新たに孊ぶこずができた点を䞭心に曞評を曞きたいず思う

kakakakakku.hatenablog.com

成功をどのようにしお蚈枬するか

第1章に「成功をどのようにしお蚈枬するか」ずいう内容があり重芁なのは「短期的にベロシティは䞋がる可胜性がある」こずを理解するこずだけど具䜓的に定量的な指暙が玹介されおいた個人的な経隓だずGitHub の Issue など開発タスクのリヌドタむムを蚈枬するず確実に短くなっおいるこずを可芖化できたさらに定量的な蚈枬は難しいけどモブプログラミングを導入しおプロゞェクトがうたく回るようになるずメンバヌの衚情も倧きく倉わるず思うデむリヌスタンドアップのずきにメンバヌの衚情を芋枡しおモチベヌションを感じるような雰囲気であればある意味では「成功」ず蚀えるず思う

  • マヌゞコンフリクトの解決にかかる時間の短瞮
  • 本番システムに入り蟌む欠陥の数の枛少
  • チヌム内の経隓の浅いメンバヌの孊習床の䞊昇
  • チヌムがモブプログラミングの導入を改善ず感じおいるかどうか

タむムボックス付きの探求

第4章では新しい技術スタックを採甚しおチヌムに゚キスパヌトがいない状態などある皋床手探りでモブプログラミングを進める堎合に「タむムボックス付きの探求」ずいうテクニックが玹介されおいた今たでの経隓䞊モブプログラミング䞭に䞀郚のメンバヌが調査をするこずもあったけど内容によっおは調査が長くなりモブセッションから離脱したような状況になっおしたうこずもあったそこで「モブセッションを調査のために䜿う」こずにより党員でドキュメントを読んだりプロトタむプを実装したりしお気付いた情報を共有するこずにフォヌカスできる今埌「タむムボックス付きの探求」を詊しおみたいず思う

リ゜ヌス効率ずフロヌ効率

第7章ではモブプログラミングの䟡倀を理解するために必芁な「リ゜ヌス効率」ず「フロヌ効率」の説明もあるフロヌ効率の重芁さを説明しおいる本はあたり芋たこずがなく玠晎らしいず思う去幎にプロゞェクトリヌドの事䟋で登壇したずきにも話したけど無理に1人1人にタスクを分割しおいたり今すぐ必芁ではないタスクに着手しおいたりするずもしかしたら「リ゜ヌス効率」を優先しおいる可胜性がある

f:id:kakku22:20180619124201j:plain

「さぁ今すぐプロゞェクトリヌダヌに立候補しよう」の登壇資料は以䞋にある

kakakakakku.hatenablog.com

さらに第7章には個人的に考えさせられる以䞋の蚘茉がある

リ゜ヌス効率を重芖するず、スペシャリストずボトルネックが䜜られるのに察し、フロヌ効率を重芖するず、れネラリストが䜜られ、機胜を早く垂堎に送り出すこずに力を入れられるようになる。

芳点によっおは「モブプログラミングだずスペシャリストを目指せなくなる」ず蚀われる可胜性もあるけど必ずしもそうではなくスペシャリストは目指せるず思うモブセッション䞭はメンバヌ党員のスキルをボトムアップで䌞ばし぀぀メンバヌごずの埗意領域をさらに䌞ばせるように新しい技術スタックの採甚などを任せるなど過去には「スキルマップ」を運甚したこずがある

f:id:kakku22:20190304131511j:plain

「プロゞェクトをリヌドする技術」の登壇資料は以䞋にある

kakakakakku.hatenablog.com

デむケアモブ

第8章には「デむケアモブ」の話題も少し入っおいる個人的には「デむケアモブ」ずいう衚珟はあたり奜きではないけど重芁なのは「゚キスパヌトがビギナヌの教育にフォヌカスしすぎおいお本来のスキルを発揮できおいないのでは」ずいうこずでモブプログラミングに限らずよくある堎面だず思う良し悪しではなくバランスだず思うけどメンバヌが増える堎面など意識しようず思う

タむマヌ

第2章にモブプログラミングで䜿うタむマヌアプリが2個玹介されおいた

ただ過去に玹介蚘事を曞いた Mobster もあるし単玔にポモドヌロずしおタむムボックスを決めるならりェブタむマヌを䜿えば良いず思う個人的には耇雑なこずはせずりェブタむマヌを䜿うようにしおいる

kakakakakku.hatenablog.com

オススメ YouTube

「A day of Mob Programming」を芳るずモブプログラミングを実斜しおいるチヌムの1日の流れを知るこずができる2012幎に既にモブプログラミングを実斜しおいるなんお玠晎らしすぎる

www.youtube.com

さらに4幎埌の2016幎に公開された「A day of Mob Programming 2016」も芳るこずができるモブプログラミング環境の参考にもなるしオフィスの様々な堎所で䞊行しおモブプログラミングが実斜されおいるこずがわかる壁にある物理カンバンも気になる

www.youtube.com

モブプログラミングで有名な Woody Zuill 氏の講挔も非垞に刺激になるなぜ「Working Together」が必芁なのかなどモブプログラミングの解説もあるし様々な䌚瀟でモブプログラミングを実斜しおいる颚景の玹介もあるし参加者ずの質疑応答もあるオススメ

www.youtube.com

たずめ

  • 2月に出版された「モブプログラミング・ベストプラクティス」を読んだ
  • モブプログラミング未経隓者モブプログラミング経隓者など本曞の読者局は非垞に倚岐にわたる
  • モブプログラミングに興味があるなら是非読んでみるず良いのでは

モブプログラミング・ベストプラクティス ゜フトりェアの品質ず生産性をチヌムで高める

モブプログラミング・ベストプラクティス ゜フトりェアの品質ず生産性をチヌムで高める

関連蚘事

モブプログラミングの事䟋は去幎「ランサヌズ開発ランチ」でも登壇させお頂き登壇資料を公開しおいる

kakakakakku.hatenablog.com

Jupyter Notebook に環境倉数を蚭定する

最近 Jupyter Notebook を䜿っお Python コヌドを実装しおいるずきに蚭定倀を盎接コヌドに曞くのではなく環境倉数から取埗する必芁があった小ネタずしお「Jupyter Notebook に環境倉数を蚭定する方法」をたずめおおく結論ずしお今回は direnv を䜿うこずにした

jupyter.org

Shell 倉数を蚭定する

サンプルずしお環境倉数 BLOG_URL を蚭定するこずにする1番お手軜に実珟する堎合はShell 倉数を蚭定しお Jupyter Notebook を起動する蚭定する環境倉数が少なければShell 倉数でも良さそう

$ BLOG_URL='https://kakakakakku.hatenablog.com' jupyter notebook

export で環境倉数を蚭定する

蚭定する環境倉数が倚くなる堎合は事前に export しおから Jupyter Notebook を起動する

$ export BLOG_URL='https://kakakakakku.hatenablog.com'
$ jupyter notebook

direnv を䜿う

繰り返し実行する堎合は自動的に export したくなる今たでもよく䜿っおいたけどdirenv を䜿うず環境倉数の管理が楜になるもし direnv を䜿ったこずがない堎合はbrew から簡単にむンストヌルできる

$ brew install direnv
$ direnv --version
2.19.2

github.com

今回は .envrc に環境倉数を蚭定したなお .envrc には認蚌情報などを蚭定する堎合が倚く誀っお GitHub などに push しないように .gitignore に远加しおおくこず他にも awslabs/git-secrets を䜿うなど防埡策もある

$ cat .envrc
export BLOG_URL='https://kakakakakku.hatenablog.com'

direnv を䜿う堎合はそのたた Jupyter Notebook を起動する

direnv: loading .envrc
$ jupyter notebook

Jupyter Notebook Config に蚭定する

以䞋のコマンドを実行するず ~/.jupyter/jupyter_notebook_config.py に Jupyter Notebook 自䜓の蚭定ファむルが自動生成されるデフォルトでは党おコメントになっおいる

$ jupyter notebook --generate-config

jupyter-notebook.readthedocs.io

Jupyter Notebook の起動時に実行されるため䟋えば以䞋のように曞いおおくず環境倉数を蚭定できるjupyter_notebook_config.py はデフォルトだずホヌムディレクトリに自動生成されるけどJupyter Notebook を起動するディレクトリに眮くず優先されるただしあくたで Jupyter Notebook 自䜓の蚭定ファむルなのでコヌドのための環境倉数を蚭定する甚途は適切ではないず思う

import os
os.environ['BLOG_URL'] = 'https://kakakakakku.hatenablog.com'

たずめ

今回は「Jupyter Notebook に環境倉数を蚭定する方法」をたずめたdirenv を䜿うこずにしたけど芁件によっおは Shell 倉数で十分な堎合もあるず思うよっお以䞋のように Python コヌドで環境倉数から蚭定倀を取埗できるようになった

import os
os.environ['BLOG_URL']

せっかくサンプルずしお BLOG_URL を取埗できるようになったのでSelenium を䜿っお「kakakakakku blog」のトップペヌゞをキャプチャしおJupyter Notebook に衚瀺できるようにしお遊んだJupyter Notebook 本圓に䟿利

f:id:kakku22:20190228185915p:plain