ラズパイにjqをインストールしてjsonレスポンスを見やすく表示するやり方


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を利用したい場合には、jq公式のgithubからソースコードを拾ってきてラズパイ上でビルドします。

            $ 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コマンドで吐き出されるレスポンスはjson形式ですので、特定のキーだけをフィルターするのにjqは最適です。

            #コンテナ名だけを出力したい
$ 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の方もあるので興味があれば覗いてみてください。
記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。