3 ポイント 投稿者 GN⁺ 2023-09-07 | 1件のコメント | WhatsAppで共有
  • サポート終了となっていた --argfile オプションleaf_pathsrecurse_down フィルタが削除
  • Docker イメージは Docker Hub ではなく ghcr.io/jqlang/jq で提供
  • リリースビルド対象として Linux、macOS、Windows と Docker の複数アーキテクチャを明記
  • --raw-output0 が追加され、出力の間に NUL バイト を挿入できるようになり、NUL を含む文字列の出力はエラーとして処理
  • Windows では --binary/-b オプションが追加され、\r\n ではなく \n の改行末尾を出力可能に
  • JQ_COLORS でオブジェクトキーの色を設定でき、NO_COLOR 環境変数を尊重して色付き出力を無効化
  • --exit-code/-e オプションの終了コード問題を修正し、最後の出力値が真なら 0、false または null なら 1、出力がない場合は 4 を返す
  • 数値リテラルの 精度保持 のため 10 進数値リテラルを使用し、比較演算は精度を尊重するが算術演算では切り捨てられる可能性あり
  • 新しい組み込み関数 pick(stream)debug(msgs)scan($re; $flags)abs を追加
  • if 文では else 分岐を省略でき、省略された else. の動作として扱われる
  • halthalt_error は次の入力へ進まず即時終了するように変更
  • 一部プラットフォームで大きな数値表現が誤った JSON 出力を生成していた問題、libjq とスレッド使用時のセグメンテーションエラー、--jsonarg の assert クラッシュを修正
  • CI、スキャンビルド、リリース、Web サイトビルドが GitHub Actions を使うように変更され、OSS-Fuzz を追加

1件のコメント

 
GN⁺ 2023-09-07
Hacker News の意見
  • JQ が素晴らしくて本当に気に入っている
    私たちの製品(JVM およびブラウザベースの Kafka ツール)では、ユーザーがデータを加工/フィルタリングできるよう、Clojure で JQ のサブセットを実装した。これまで書いたコードの中でも特に楽しい作業の一つで、もともと文法を書くのが好きなこともあり、Instaparse にも大いに感謝している: https://github.com/Engelberg/instaparse
    実装しているうちに JQ が LISP-2 だと分かったのだが、文法を見ただけではそう感じられず驚いた: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...

    • jq はどうしても好きになれない。職場のコードベースの bash スクリプトにも jq が多く、自分が書いたコードも一部あるし、それが最善の選択肢のときは渋々使ってはいる
      ただ、直感的でないクエリ構文、ごく小さなステップごとに検索しなければならないこと、そしてその結果が jq の専門家でなければ解読しにくい呪文のようになることが気にかかる。htmx や tailwind のように、文字列の中に埋め込まれる DSL 全般に本能的な抵抗感がある
      それでも、よく作られたソフトウェアであり、時にはより良い選択肢がないことも認める。JSON を bash で扱うときには、sed/awk/cut の怪物よりはるかにましという意味で、最もましな選択肢でもある。ただ、スクリプトの真ん中にいつも解読不能な文字列のように埋まっている jq コマンドは、正規表現と並んでコード内で見たくないものに近い。代替として heredoc 内の inline Python をパイプで渡したこともあるが、それも jq スクリプトと同じくらいごちゃごちゃになる
    • オンラインの LALR(1)/FLEX 文法エディタ/テスターに JQ パーサー/文法も追加した: https://mingodad.github.io/parsertl-playground/playground/
      例から "Jq parser (partially working)" を選んで "Parse" を押すと、"Input source" のソースに対するパーサーツリーを見られる。フィードバックはいつでも歓迎
    • JVM にはすでに JQ 実装がある。100% 完成ではないが使える: https://github.com/eiiches/jackson-jq
    • jq はユーザーに自分のデータを加工してもらうのにとても向いている。私たちも似たような方式を使っていて、ユーザーが受信 Webhook エンドポイントを作り、任意の JSON データを送り、回帰テストとモニタリングを添えて有用なマッピングを設定できるようにしている
      jq は大半のケースを単純にし(実質的には JSON のドット記法)、ロングテールの複雑なケースも可能にしてくれる
    • 製品がすでに使える状態なら、ぜひ試してみたい
  • jq は好きだが、JMESPath(特に AWS CLI と一緒に)、yq(tomlq と xq も含む)、dasel も併用している。hclq が事実上死んでいるのは残念
    https://jmespath.org/
    https://kislyuk.github.io/yq/
    https://github.com/TomWright/dasel
    https://hclq.sh/

    • JSON を grep 可能にしよう: https://github.com/tomnomnom/gron
      もう何年も jq を使っていて、必要なものはいつも何とか組み合わせて作れているが、それでも直感的だと感じたことはない。少し複雑になるだけで、ドキュメントを長く読まずに解法へたどり着くのは難しく、もっと簡単に使えるとよいと思う
    • JMESPath のインタラクティブチュートリアルページは本当に良い: https://jmespath.org/tutorial.html
      最初に文法を学ぶときに役立ったし、今でも変な構文で引っかかるとまた見に行く
    • 複数の形式から複数の形式へ変換する小さなツールを作った
      最大の用途は、CSV、TOML、XML のようなものを JSON に変換して jq にパイプすること: https://github.com/sentriz/rsl
    • 代替としては、こうしたツールもある
      https://github.com/kellyjonbrazil/jello
      https://github.com/wwkimball/yamlpath
    • もう一つの優れた代替は JSONPath で、非常に優れているのにサポートと認知度が広くないのは残念
      XPath に着想を得ているので、完全に新しい DSL よりなじみがあり、中心的な機能は再帰的なキー検索だと思う。people..address と書けば、JSON のどこにあっても "people" の下にあるすべての "address" キーを見つけてくれる。JSON 用のパース言語の中で一番好きで、JSON データセットのパースに使う方法を紹介する記事も書いた
      https://github.com/JSONPath-Plus/JSONPath
      https://scrapfly.io/blog/parse-json-jsonpath-python/
  • jqをたまにしか使わず、毎回ドキュメントを見る必要があるなら gron を試す価値がある。grep 可能な JSON
    https://github.com/tomnomnom/gron

    • シンプルだが非常に便利そう
      何年も curl cheat.sh/jq を使ってきたし、cheat.sh 全体が優れた資料だと思う。今ならおそらく ChatGPT のようなものを使うと思う
    • 設計が本当によくできている
      gron | grep | sed | gron -u のような使い方も可能
    • jq の構文にはいつも苦労してきたが、サンプル JSON を渡すと ChatGPT が適切なコマンドをかなりうまく作ってくれることに毎回感心する
  • jqを好きでいられる、あるいは我慢できる理由の一つは 安定性。数年前に書いたスクリプトが今でも同じように動く
    一方で yq 用に置いていたコードは、yq が後方互換性のない形で改善され続けたため、よく壊れた。そうした変更がどれほど頻繁にあったのかは調べていないが、CI スクリプトのように基本ツールのバージョンがまちまちで、更新ペースも異なる環境で何度も影響を受けた
    だから jq のメンテナーたちが 後方互換性 の重要性を理解してくれていることには、いつも感謝していた。今回の発表が、その安定性は単に停滞の偶然の副産物であり、停滞を解消するために安定性を犠牲にする、という意味でないことを願う

  • jq に似たツールに加えて、jq と一緒に使う興味深いツールとして jojc がある
    https://github.com/jpmens/jo
    https://github.com/kellyjonbrazil/jc

    • jlessgron もある
      gron はここで初めて聞いたが、網羅性のために付け加える。一方で JSON は CLI ツールの標準出力形式のようになりつつあるようだ。理想的には、すべての CLI ツールが --json のようなフラグを提供し、jc が不要になること
      https://jless.io/
      https://github.com/tomnomnom/gron
  • 先月の関連記事「First release of jq in 5 years」: https://news.ycombinator.com/item?id=36951830
    jq の熱烈なファンで、いつも使っている

  • ついに来た
    コミュニティが力を合わせて新しいメンテナーを募り、プロジェクトを復活させた過程は本当に素晴らしい。特に GitHub ユーザー名で @stedolan、@itchyny、@owenthereal に特別な感謝を

  • jq と miller は awk、vim と並んで自分の道具箱の必需品
    https://github.com/johnkerl/miller

  • 新しい組み込み関数 pick(stream) が、入力オブジェクトや配列の射影を出力する機能を追加した
    jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
    これは本当に救世主のような機能。コントリビューターに感謝

    • 深く掘る必要がないなら、こうもできる
      $ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'
      {
      "a": 1,
      "e": 4
      }
    • 数日前にこの機能を使おうとして Git からインストールしたが、とても便利
    • 本当に素晴らしい新機能。現状ではストリームを先に再構築しないと不可能に見えるので、ストリーミングデータでも動作する pick バージョンがあるとよい
  • jaq もおすすめしたい。正確性、速度、単純さに重点を置いた jq クローン
    jq のサブセットだけを実装しているが、これまでかなり満足して使っている: https://github.com/01mf02/jaq