ラズパイにjqをインストールしてjsonレスポンスを見やすく表示するやり方
※ 当ページには【広告/PR】を含む場合があります。
2020/06/19
最近ではラズパイを利用して、機械学習を応用したアプリケーション走らせるようなテーマも良く見受けられます。
人工知能技術の分野において、データサイエンスは非常に重要なテーマであり、機械と人間を相互的理解できるjson形式のデータはますます存在感が増していると感じます。
データサイエンスに特化したラズパイの環境づくりにおいて、
jq
今回はラズパイにjqをインストールして利用するという内容です。
jqのインストール
とりあえず以下の2通りの方法でインストールを試します。
パッケージマネージャからインストールする
こちらが一番簡単なインストール方法です。
まず、スタートメニューから
Add/Remove Software

jq-1.5
[Apply]

インストールが正常に完了すると以下のように
jq
$ jq --version
jq-1.5-1-a5b5cbe
ビルドインストールする
パッケージインストールを利用したくない方や最新の
jq-1.6
$ cd /tmp
$ wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-1.6.tar.gz
$ tar xfvz jq-1.6.tar.gz
$ cd jq-1.6
$ ./configure && make && sudo make install
なお、今回は特にjq-1.6を利用するほどのモチベーションは無かったので、以降の内容ではパッケージインストール版で動作確認をしています。
jqの利用例
せっかくラズパイにjqが導入できたので、個人的に気に入っている用例を数点以下に挙げておきます。
1. dockerコマンドと併用
docker inspect
#コンテナ名だけを出力したい
$ docker inspect <コンテナ名かID> | jq '.[].Id'
"796c13faa3bef0f3fa4d8c46648c4c20dbc0d0e47e8180826558cd4abd8a4b18"
#状態を取得したい
$ docker inspect <コンテナ名かID> | jq '.[].State'
{
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 751,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-06-07T07:05:16.665703358Z",
"FinishedAt": "2020-06-07T16:04:47.912831598+09:00"
}
#起動状態だけを取得
$ docker inspect <コンテナ名かID> | jq '.[].State.Status'
"running"
#RestartPolicyを検索
$ docker inspect <コンテナ名かID> | jq '.[].HostConfig.RestartPolicy'
{
"Name": "always",
"MaximumRetryCount": 0
}
#Env(環境変数)の中の配列メンバーで最後が数値で終わるもの
$ docker inspect <コンテナ名かID> | jq '.[].Config.Env | .[] | select(test("[0-9]$"))'
"OUTER_DYNAMODB_IP=192.168.0.250"
"NODE_VERSION=10.18.1"
"YARN_VERSION=1.21.1"
#NetworkSetings直下にあるIPを文字をkeyに含むメンバーの値だけを取得
$ docker inspect <コンテナ名かID> | jq '.[] | .["NetworkSettings"] | (keys | .[] | select(test("IP"))) as $ip | .[$ip]'
""
0
""
0
""
""
0
null
null
といろいろと応用が効きます。
ただし、長ったらしいキーの名前は覚えておかないと仕方がないのは相変わらずですが、jqの操作に慣れるために使っておいて損はないと思います。
2. AWS サービスから送信されるJSON RESPONSE
LambdaやAPI Gateway, DynamoDBといったAWSクラウド上にデプロイした自作APIに、ラズパイ側からcurlで何かしらリクエストした時のjsonのレスポンスを受け取るときにjqは便利です。
#jqなしの場合
$ curl 'https://hogehoge.execute-api.piyopiyo.amazonaws.com/database_async?code=0000&category=00'
#膨大な何かのデータが詰まった生のレスポンスのデータ文字
[{"date":1588896000000,"category_id":0,"item_id":0,"value":1372930000},{"date":1589155200000,"category_id":0,"item_id":4,"value":1313550000},...,{"date":1592438400000,"category_id":0,"item_id":4,"value":1111220000}]
#整形済みのフォーマットで表示
$ curl 'https://hogehoge.execute-api.piyopiyo.amazonaws.com/database_async?code=0000&category=00' | jq '.'
[
{
"date": 1591574400000,
"category_id": 0,
"item_id": 4,
"value": 1703070000
},
{
"date": 1591660800000,
"category_id": 0,
"item_id": 4,
"value": 1521580000
},
#...
{
"date": 1592438400000,
"category_id": 0,
"item_id": 4,
"value": 1111220000
}
]
#膨大なデータから条件を付けてフィルターした要素のみを再度配列に戻して表示
$ curl 'http://localhost:5985/sdt_async?code=0000&category=00' | jq '.[] | select(.item_id == 3 and .date > 1592179200000)' | jq -s '.'
[
{
"date": 1592265600000,
"category_id": 0,
"item_id": 3,
"value": 22582.21
},
{
"date": 1592352000000,
"category_id": 0,
"item_id": 3,
"value": 22455.76
},
{
"date": 1592438400000,
"category_id": 0,
"item_id": 3,
"value": 22355.46
}
]
特にDynamoDBでのテーブル内の検索条件を含めたQuery操作は、全要素スキャンより処理時間がかかるので、サーバー側に負荷が掛かりやすいですし、DynamoDBの読み込みのキャパシティユニットだけでなく、踏み台にしているLambdaのメモリサイズやタイムアウト値の設定いかんでは、処理が落ちる可能性もあります。
単純な検索条件ならば、クライアント側でjqで要素をフィルターすることで、サーバー側で無駄にリソースを消費しないように工夫することができます。
まとめ
ラズパイを使っていてレスポンスにjson形式で返ってくるコマンドがあるならば、jqを使わない手はありません。 データサイエンスが盛んな今だからこそ、ラズパイにもjqをインストールして活用されるといいと思います。
なおjqの学習に関しての書籍はないので、マニュアル
man jq
playgroud