kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

JMESPath Tutorial と jp コマンドを使って JMESPath を学ぶ

JSON をパース(集計/整形など)するときに,よく使われているのは「jq」だと思う.僕も jq をよく使っている(構文は毎回調べるけど).今回は jq 以外の選択肢となる「JMESPath」の理解を深めることにした.JMESPath も JSON をパースできるクエリ言語(仕様)で,例えば AWS CLI の --query オプションでも採用されている.

jmespath.org

JMESPath Tutorial

JMESPath をすぐに試すなら「JMESPath Tutorial」を使うと便利.

jmespath.org

よく使う構文を画面上で試すことができるし,実際にクエリを更新するとすぐに反映される.JMESPath Tutorial で試せる構文は以下となる.

  • Basic Expressions
  • Slicing
  • Projections
    • List and Slice Projections
    • Object Projections
    • Flatten Projections
    • Filter Projections
  • Pipe Expressions
  • MultiSelect
  • Functions

f:id:kakku22:20190513003424p:plain

JMESPath CLI : jp

CLI として使える JMESPath 実装 jp コマンドもある.良くも悪くも jq と似すぎ!

github.com

今回は brew を使ってインストールしてみた.

$ brew install jmespath/jmespath/jp
$ jp --version
jp version 0.1.3

なお,現在 README.md に書いてある手順だと異なる jp が brew からインストールされてしまうため,直接 Formulae を指定する手順に修正するプルリクエストを送った.確実に必要な修正だから merge してもらえると良いんだけど!

github.com

基本的な jp の使い方として,標準出力をパイプして JSON をパースできる.

$ echo '{"key": "value"}' | jp key
"value"

$ echo '{"foo": {"bar": ["a", "b", "c"]}}' | jp foo.bar[1]
"b"

既に JSON ファイルがある場合,-f もしくは --filename を使うと,ファイルを読み込んで JSON をパースできる.

$ jp --filename input.json foo.bar[1]
"b"

jq を使う場合,よく -r もしくは --raw-output を使って,パース結果に " を付けないようにすると思う.jp にも同様のオプションがあり,-u もしくは --unquoted を使う.また環境変数 JP_UNQUOTED を使うと,デフォルト設定を変更することもできる.

$ echo '{"foo": {"bar": ["a", "b", "c"]}}' | jp --unquoted foo.bar[1]
b

$ export JP_UNQUOTED=true
$ echo '{"foo": {"bar": ["a", "b", "c"]}}' | jp foo.bar[1]
b

JMESPath Tutorial と jp コマンド

JMESPath Tutorial を一通り試して,気になった構文を jp コマンドを使って整理しておこうと思う.

Slicing

「Slicing」では,例えば [0:5] のように書くと,配列データの一部を刈り取ることができる.また [:5] のように終了のみを指定して刈り取ることもできる.

$ echo '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' | jp [2:5]
[
  2,
  3,
  4
]

$ echo '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' | jp [:5]
[
  0,
  1,
  2,
  3,
  4
]

Object Projections

「Object Projections」では,例えば ops.*.numArgs のように中間要素をワイルドカードで指定することができる.

$ echo '{
  "ops": {
    "functionA": {"numArgs": 2},
    "functionB": {"numArgs": 3},
    "functionC": {"variadic": true}
  }
}' | jp ops.*.numArgs
[
  2,
  3
]

Filter Projections

「Filter Projections」では,例えば machines[?state=='running'].name のように要素に対して条件を書くことができる.

$ echo '{
  "machines": [
    {"name": "a", "state": "running"},
    {"name": "b", "state": "stopped"},
    {"name": "b", "state": "running"}
  ]
}' | jp "machines[?state=='running'].name"
[
  "a",
  "b"
]

Functions

「Functions」では,例えば length(people) など,ビルトイン関数を使って集計することもできる.他にも max や merge など,多く用意されている.

$ echo '{
  "people": [
    {
      "name": "b",
      "age": 30,
      "state": {"name": "up"}
    },
    {
      "name": "a",
      "age": 50,
      "state": {"name": "down"}
    },
    {
      "name": "c",
      "age": 40,
      "state": {"name": "up"}
    }
  ]
}' | jp "length(people)"
3

JMESPath Specification

JMESPath の全仕様は「JMESPath Specification」に載っている.ビルトイン関数の一覧も確認できる.

jmespath.org

言語別 JMESPath 実装

多くの言語に JMESPath 実装がある.バックエンド実装で JSON をパースする場面があれば検討しても良さそう.

  • Python
  • PHP
  • JavaScript
  • Ruby
  • Lua
  • Go
  • Java
  • Rust
  • .NET

jmespath.org

まとめ

  • JSON をパース(集計/整形など)するときに「jq」以外の選択肢となる「JMESPath」を試した
  • JMESPath をすぐに試すなら「JMESPath Tutorial」を使うと便利
  • JMESPath CLI として使える jp コマンドもある
  • (慣れの問題もあるけど)個人的には「jq」よりも「JMESPath」の方が構文の可読性が高いように感じた

さぁ!コンテナを設計しよう /「分散システムデザインパターン」を読んだ

4月に出版された「分散システムデザインパターン」を読んだ.サブタイトルに「コンテナを使ったスケーラブルなサービスの設計」とある通り,コンテナを設計/運用するときに,どのようなデザインパターンを知っておくと良いのか?という点を学べる内容になっている.関連情報と合わせて書評を書きたいと思う.なお,今回は貴重な機会を頂き,本書の出版レビューに参加することができた.オライリー本に自分の名前が載っている!という喜びもある.

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

目次

  • 1ç«  : はじめに
  • 第 I 部 : シングルノードパターン
    • 2ç«  : サイドカー
    • 3ç«  : アンバサダ
    • 4ç«  : アダプタ
  • 第 II 部 : マルチノードパターン
    • 5ç«  : レプリカがロードバランスされたサービス
    • 6ç«  : シャーディングされたサービス
    • 7ç«  : スキャッタ・ギャザー
    • 8ç«  : ファンクションとイベント駆動処理
    • 9ç«  : オーナーシップの選出
  • 第 III 部 : バッチ処理パターン
    • 10ç«  : ワークキューシステム
    • 11ç«  : イベント駆動バッチ処理
    • 12ç«  : 協調的バッチ処理
  • 13ç«  : まとめ:新しい始まり?

サイドカー

「シングルノードパターン」の中で紹介されている「サイドカー」は,Fluentd を使ったログ収集など,非常によく知られたパターンだと思う.本書では,まずレガシーアプリケーションをテーマにし,HTTPS 化をしたり,設定ファイルを反映する設計が紹介されている.さらに,起動しているコンテナと同じ PID を指定し,メトリクスを取得するサンプルコンテナ topz を起動するスクリプトも紹介されている.実際に nginx コンテナを起動してみる.

$ APP_ID=$(docker run -d -p 80:80 nginx:alpine)
$ docker run --pid container:${APP_ID} -p 8080:8080 brendanburns/topz:db0fa58 /server -addr 0.0.0.0:8080
Serving on 0.0.0.0:8080

起動後に http://localhost:8080/topz にアクセスすると,例えば以下のようなメトリクスを取得できる.

  • proc.PID
  • proc.CPUPercent
  • proc.MemoryPercent
  • proc.Command
7 39.88667159546271 0.030686773 nginx: worker process
8 9.952280506857287 0.13297603  /server -addr 0.0.0.0:8080
1 0                 0.076651365 nginx: master process nginx -g daemon off;

このように本書には「ハンズオン」という内容もあり,読みながら実際に動かすこともできる.全体的に Kubernetes 前提のハンズオンも多くなっているけど,あくまでデザインパターンなので,Kubernetes 以外で動かしてみるのも勉強になると思う.

アンバサダ

「シングルノードパターン」の中で紹介されている「アンバサダ」は,アプリケーションと外部をプロキシする役割として使う.twemproxy など,ミドルウェアを Sharding するときに使う以外にも,「新システムの実験的運用やリクエスト分割への利用」でも使えるという内容もあり,A/B テストの設計として参考になる.ハンズオンもあり,具体的には nginx で server に weight を指定したコンテナを起動している.

nginx.org

ワークキューシステム

「バッチ処理パターン」の中で紹介されている「ワークキューシステム」も参考になる.パターン名を聞くと,単純にキューを使ったワーカー実装を想像するかもしれないけど,キューとは言え,Kafka / Redis など様々なミドルウェアがあり,キューに接続する部分も「アンバサダ」として一般化する設計になっている.さらに Kubernetes の ConfigMap を使って,ファイルベースにワークアイテムを伝達する仕組みなども紹介されている.

デコレータ

「マルチノードパターン」の中で紹介されている「ファンクションとイベント駆動処理」では FaaS (Function as a Service) の話題もある.FaaS のパターンとして,例えば「デコレータ」は,API リクエストのデフォルト値を埋めるなど,アプリケーションを呼び出す前の事前処理として使う.「シングルノードパターン」の中で紹介されている「アダプタ」と似ているけど,デコレータとアプリケーションを別々にスケールできる点がメリットであると書かれていた.

そして,FaaS をよりスケールさせるために,Kubernetes などのオーケストレーションツールの上で動く FaaS を使う案もあると書かれていた.例えば Kubeless や OpenFaaS など.なお OpenFaaS は日本語版のワークショップがあり,すぐに試すことができる.

kakakakakku.hatenablog.com

関連情報

まず,本書の基礎となった論文が,2016年に「Design patterns for container-based distributed systems」として発表されている.本書にも載っている多くのパターンが紹介されていて,以前に論文を読んだ記事を書いている.合わせて読んでもらえると!

kakakakakku.hatenablog.com

本書の補足資料は GitHub に公開されている.原著のリポジトリを fork して,本書のリポジトリも用意されている.

github.com

github.com

出版レビューに参加して

今回は本書の翻訳者を担当された @dblmkt さんから貴重な機会を頂き,本書の出版レビューに参加することができた.得意の「typo 発見スキル」を活かしつつ,日本語としてより適切な表現になるように「助詞」や「助動詞」など文章の見直しをしたり,直訳では伝わらなそうな文章を意訳する提案などもした.そして本書には Kubernetes を使ったサンプルも多くあり,Mac に環境構築をして動作確認もした.なんと言っても,出版レビューをご一緒させて頂いた @superbrothers さんと @yoshikai_ さんの的確なレビューコメントからもたくさん学ばせて頂いた!

今まで書籍レビューに参加した経験がなく,不慣れな部分もあったけど,とても貴重な経験となった.もしまた機会があれば挑戦したいと思う.出版日の数日前に本書が届き,自分の名前が載っている箇所を発見したときは「オライリー本に名前が載っている!おおおおお!」と感動した.なお,名前と Twitter アカウント名の間に改ページが入っていて,計2ページに名前が載っているところも見どころ!笑

f:id:kakku22:20190513033018p:plain

まとめ

  • 「分散システムデザインパターン」を読んだ
  • コンテナを設計/運用するときに必要になる「デザインパターン」を学べる1冊になっている
  • Kubernetes に限定せず,様々なオーケストレーションツールに活用できる
  • 出版レビューに参加させて頂き,とても貴重な経験となった

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

小学生に限らず幅広い層に役立つドリルだった / ドリルの王様「たのしいプログラミング」を3冊解いた

少し前に書店をブラブラしていたら,なんと!小学生の学習書コーナーに「プログラミング」をテーマにした「学習ドリル」が追加されていて,とても驚いた.2020年からプログラミング教育が小学校の必修科目になることは知っていたけど,まさかもう学習ドリルまで出版されているとは!学習指導要領など,詳しくは文部科学省のウェブサイトから確認できる.

www.mext.go.jp

僕自身は過去にプログラミング講師の仕事を約2年していて,主に「プログラミング初学者に教えた経験(成人教育)」はあるけど,小学生にはどのように教えるのだろうか?という強い興味があり,以下の3冊を購入し,実際に解いてみた.

ドリルの王様 1,2年のたのしいプログラミング 新学習指導要領対応

ドリルの王様 1,2年のたのしいプログラミング 新学習指導要領対応

ドリルの王様 3,4年の楽しいプログラミング 新学習指導要領対応

ドリルの王様 3,4年の楽しいプログラミング 新学習指導要領対応

ドリルの王様 5,6年の楽しいプログラミング 新学習指導要領対応

ドリルの王様 5,6年の楽しいプログラミング 新学習指導要領対応

プログラミング的思考

本書にも書いてある通り,「プログラミング」を学ぶのではなく「プログラミング的思考」を学ぶ.よって Scratch を使ったりするのではなく「どのように考えるか?」という観点で学ぶ.具体的には「順序」や「繰り返し」や「分岐」など,実際にプログラミングをするときに必要になる思考を学ぶことができる.学習指導要領(第2版)にも書いてある通り,小学校のプログラミング教育では「プログラミングを体験すること」を推奨しているため,Scratch などのビジュアル型プログラミング言語を使った授業もあると思う.よって,本書(学習ドリル)は,実際にプログラミングを体験するときに必要になる「プログラミング的思考」を学ぶためにあるという背景を理解しておくと良さそう.

3冊を実際に解いてみた個人的な感想として,非常によく考えられていると感じた.特に本書は小学生に限らず,例えば以下など,幅広い層に役立つ内容になっている点が素晴らしいと感じた.ようするに「誰でも読める」と言える.小学生の学習ドリルを侮るなかれ!

  • 小学生
  • 小学生の子供に「プログラミング的思考」を教える保護者
  • 現役のプログラミング講師
  • エンジニアと会話ができるようになりたい営業職や経営陣
  • などなど

学習範囲

ザッと3冊に載っている学習範囲を整理してみた.非常に幅広い内容になっていることがわかる.なお,実際には「じゅんじょ」や「順序」など,表記は年次によって異なり,適切に「学年別漢字配当表」に沿っている.本記事では読者層を考慮し,通常通り,漢字表記に統一する.

学習範囲 小学1,2年 小学3,4年 小学5,6年
順序 ○ ○ ○
繰り返し ○ ○ ○
分岐 ○ ○ ○
イベント処理 ○ - -
コンピュータの考え方 ○ ○ ○
変数 ○ ○ ○
関数 - ○ ○
配列 - - ○
アルゴリズム - ○ ○
データ活用 - - ○
移り変わり図 - - ○

小学1,2年

ドリルの王様 1,2年のたのしいプログラミング 新学習指導要領対応

ドリルの王様 1,2年のたのしいプログラミング 新学習指導要領対応

出題範囲「順序」では,積み木を並べたり,図形を組み合わせたり,順番を考える問題になっている.途中から「フローチャート」を使った問題もあり,「フローチャート」を読み解きながら図を描いたり,ロボットを動かしたりする.正確には問題文には「フローチャート」という言葉は記載されてなく,答え(保護者向け)に載っている.

出題範囲「分岐」では,if-else を連想させる「分かれ道でどっちに進む?」というテーマや「○だったら図形 A,△だったら図形 B」というテーマなど,小学生でも考えやすい内容になっている.出題範囲「分岐」の後半では「フローチャート」を使って「クッキーは丸い?」という命令を読み解く内容になっている.

出題範囲「イベント処理」では,「大型ロボットが迷路を進む」というテーマで「壁にぶつかったら,左を向く」など「壁にぶつかったら〇〇」という点にフォーカスして読み解く.客観的には出題範囲「分岐」と似ている部分もある.

f:id:kakku22:20190506030904j:plain

小学3,4年

ドリルの王様 3,4年の楽しいプログラミング 新学習指導要領対応

ドリルの王様 3,4年の楽しいプログラミング 新学習指導要領対応

「順序」や「繰り返し」や「分岐」など,学習範囲は小学1,2年と同じで,問題の複雑さが違ってくる.例えば,出題範囲「繰り返し」では「秘密の暗号を読み解く」というテーマで,文字列を数文字ごと(鍵という前提)にスキップしながら読み解く問題になっている.例えば以下のように,プログラミング的には For Step を連想させる内容になっている.

鍵 = 2
暗号 = ぶあろいぐう
メッセージ = ぶろぐ

小学1,2年にも出てくる出題範囲「変数」では,「ロボットに1個だけ言葉を教えることができる」というテーマで「変数の代入」を表現していて参考になる.特にロボットに言葉を教えるだけではなく,ロボット同士でも言葉を教える問題があり,これは「変数同士の代入」のことを連想させている.

そして,最後に出題範囲「アルゴリズム」も出てくる.問題文には記載されていないけど,答え(保護者向け)を読むと,以下の代表的なアルゴリズムを前提にした問題が並んでいる.ここまで理解した小学生強すぎる!

  • 交換アルゴリズム
  • 探索アルゴリズム
    • 線形探索
    • 二分探索
    • 深さ優先探索
  • ソートアルゴリズム
    • 選択ソート

f:id:kakku22:20190506031607j:plain

小学5,6年

ドリルの王様 5,6年の楽しいプログラミング 新学習指導要領対応

ドリルの王様 5,6年の楽しいプログラミング 新学習指導要領対応

小学1,2,3,4年でも学ぶ学習範囲はさらに問題が複雑になってくる.特に学習範囲「変数」に関しては「変数同士の代入」の延長線として「変数を計算した結果を変数に代入する」という問題もある.

そして,学習範囲「関数」では,以下のように命令を読み解く内容もある.後半には「関数の中に関数を定義した」問題もあり,非常に実践的な「プログラミング的思考」を学べる.学習指導要領(第2版)に書いてある通り,プログラミング教育では「プログラミングによって正多角形を作図する」ことを目標の1個にしているため,学習範囲「関数」の内容と似ていると感じた.

進む (1)
左回り ()
進む (5)

学習範囲「アルゴリズム」では,小学3,4年で学んだ内容に加えて,以下の内容を前提にした問題が出てくる.そして,学習範囲「データ活用」では RDB を連想させるデータ表を読み解く問題になっている.学習範囲「移り変わり図」では「アクティビティ図」と「状態遷移図」を学ぶ.小学5,6年でここまで学べるのは本当に驚き!

  • ソートアルゴリズム
    • バブルソート
  • 最短経路問題
    • ダイクストラ法
  • ナップサック問題

f:id:kakku22:20190506034535j:plain

まとめ

  • ドリルの王様「たのしいプログラミング」を3冊解いた
  • 本書では「プログラミング」ではなく「プログラミング的思考」を学ぶ
  • 小学生に限らず,幅広い層に役立つ内容になっていた

関連記事

経営陣にエンジニアリングをもっと知ってもらうために「SAO 本」を使ってプログラムを写経してもらう取り組みを数年前に実施したけど,当時このドリルがあったら是非活用したかった!「開発組織の変革を支えた実践的アプローチ」に関しては以下に資料を公開している.

f:id:kakku22:20190506075717j:plain

kakakakakku.hatenablog.com

最新バージョン Redash v7.0.0 をすぐに試せる「Redash ハンズオン資料」

2019年3月末に Redash の最新バージョン「Redash v7.0.0」がリリースされた.2018年12月に「Redash v6.0.0」がリリースされたので,比較的ハイペースにメジャーバージョンアップが進んでいる.Change Log を読むと「Redash v7.0.0」の新機能が多くあり,既に以下の記事にまとめている.目玉機能と言える「選択実行」もある.

kakakakakku.hatenablog.com

Redash ハンズオン資料 v7.0.0 サポート

さっそく「Redash ハンズオン資料」で「Redash v7.0.0」をサポートした.個人学習用途/研修用途など,サクッと Redash v7.0.0 を試すときに使ってもらえると!メジャーバージョンは v2 / v4 / v5 / v6 / v7 をサポートしている.主な変更点を以下にまとめる.

  • 全てのスクリーンキャプチャを取り直した
  • 「選択実行」を試せるようにした
  • docker-compose.yml を Redash 公式の Setup Script に合わせて修正した
  • UI 変更に合わせて文章を一部変更した

github.com

関連記事

マイクロサービスの学習に使えるサンプルアプリケーション「Sock Shop」

個人学習用にマイクロサービスを体験できるサンプルアプリケーションを探していたら,Weaveworks から公開されている「Sock Shop」を発見した.「Sock Shop」は名前の通り「靴下 EC サイト」で「ユーザー登録/商品閲覧/カート/ウィッシュリスト/購入(ダミー)」など,EC サイトに必要な機能が一通り実装されている.ドキュメントに以下の記載があり,マイクロサービスを体験したり,デモに使ったり,トレーニングに使ったりする用途に適している.良さそう!

Sock Shop can be used to illustrate microservices architectures, demonstrate platforms at talks and meetups, or as a training and education tool.

microservices-demo.github.io

Sock Shop を動かす

「Sock Shop」は Docker / Kubernetes / Amazon ECS など,多くのプラットフォームをサポートしている.今回はお手軽に試すため,Docker Desktop for Mac と Docker Compose を使って動かす.ドキュメントにある Quick Start も Docker Compose を使う手順になっている.以下のように GitHub リポジトリを clone し,Docker Compose を起動すると,「計15種類」のコンテナが起動する.

$ git clone https://github.com/microservices-demo/microservices-demo
$ cd microservices-demo
$ docker-compose -f deploy/docker-compose/docker-compose.yml up -d
(中略)
Creating docker-compose_rabbitmq_1     ... done
Creating docker-compose_user_1         ... done
Creating docker-compose_user-db_1      ... done
Creating docker-compose_front-end_1    ... done
Creating docker-compose_carts-db_1     ... done
Creating docker-compose_orders_1       ... done
Creating docker-compose_orders-db_1    ... done
Creating docker-compose_edge-router_1  ... done
Creating docker-compose_user-sim_1     ... done
Creating docker-compose_carts_1        ... done
Creating docker-compose_payment_1      ... done
Creating docker-compose_catalogue_1    ... done
Creating docker-compose_catalogue-db_1 ... done
Creating docker-compose_queue-master_1 ... done
Creating docker-compose_shipping_1     ... done

起動後に http://localhost に接続すると,すぐに「Sock Shop」にアクセスできる.

f:id:kakku22:20190426142844p:plain

靴下を検索することもできる.

f:id:kakku22:20190426142914p:plain

カート機能も充実している.

f:id:kakku22:20190426143044p:plain

マイクロサービス紹介

「計15種類」のコンテナで使われている技術をザッと整理すると以下のようになる.マイクロサービスごとに言語とデータストアが異なり,まさにマイクロサービスの思想でもある「ポリグロット (Polyglot)」な構成になっている.Go API の実装を読んでいると「OpenTracing」を使っていたり,負荷テストに「Locust」を使っていたり,コンテナごとに詳しく調べていく楽しさもある.また Go API の Dockerfile を確認したところ「multi-stage builds 機能」も使っていて,学べる点も多くある.コンテナ同士の関係はdocker-compose.yml に書いてある.

github.com

API 紹介

API ごとに Swagger ドキュメントがあり,簡単に API 仕様を確認できる.試しに「カタログ API」を実行すると以下のようになる.

$ curl -s http://localhost/catalogue/d3588630-ad8e-49df-bbd7-3167f7efb246 | jq .
{
  "id": "d3588630-ad8e-49df-bbd7-3167f7efb246",
  "name": "YouTube.sock",
  "description": "We were not paid to sell this sock. It's just a bit geeky.",
  "imageUrl": [
    "/catalogue/images/youtube_1.jpeg",
    "/catalogue/images/youtube_2.jpeg"
  ],
  "price": 10.99,
  "count": 801,
  "tag": [
    "geek",
    "formal"
  ]
}

まとめ

  • マイクロサービスを体験できるサンプルアプリケーションとして「Sock Shop」を発見した
  • EC サイトに必要な機能が一通り実装されている
  • 引き続きマイクロサービスの実装を読み解きながら「Sock Shop」の詳細を追っていく