3 poin oleh GN⁺ 2023-11-30 | 1 komentar | Bagikan ke WhatsApp

Pengenalan jaq

  • jaq adalah klon dari jq, alat pemrosesan data JSON, yang bertujuan mendukung sebagian besar sintaks dan operasi jq.
  • Tiga tujuan utama jaq adalah akurasi, performa, dan kesederhanaan.
  • Sambil mempertahankan kompatibilitas dengan jq, jaq berupaya memberikan implementasi yang lebih akurat dan dapat diprediksi.
  • Contoh perilaku jq yang tidak terduga antara lain nan > nan bernilai salah dan nan < nan bernilai benar, serta terjadinya crash saat menjalankan jq dengan [[[]] | implode.
  • jaq dikembangkan sebagai solusi atas waktu startup jq yang lama, dan memiliki waktu startup sekitar 30 kali lebih cepat dibanding jq 1.6.
  • jaq menargetkan implementasi yang sederhana dan kecil untuk mengurangi kemungkinan bug dan memudahkan kontribusi.

Cara instalasi

Instalasi dari source

  • Untuk mengompilasi jaq, diperlukan toolchain Rust.
  • Compiler Rust yang disertakan dalam distribusi Linux mungkin sudah terlalu lama dan tidak cocok untuk mengompilasi jaq.
  • Anda dapat menginstal jaq melalui perintah cargo install --locked jaq atau cargo install --locked --git https://github.com/01mf02/jaq.
  • jaq seharusnya berjalan di semua sistem yang didukung Rust; jika tidak, sebaiknya buat issue.

Instalasi biner

  • Di macOS atau Linux, jaq dapat diinstal menggunakan homebrew.

Contoh

  • Contoh berikut menunjukkan hal-hal yang saat ini dapat dilakukan jaq.
  • Menjalankan echo '{"a": 1, "b": 2}' | jaq '.a' akan menghasilkan 1.
  • Menjalankan echo '{"a": 1, "b": 2}' | jaq 'add' akan menghasilkan 3.
  • Menjalankan echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]' akan menghasilkan [0, 2, 4].

Performa

  • Berbagai benchmark digunakan untuk membandingkan performa jaq, jq, dan gojq.
  • Benchmark empty digunakan untuk mengukur waktu startup.
  • Benchmark bf-fib menjalankan interpreter Brainfuck yang ditulis dalam jq untuk mengeksekusi skrip Brainfuck yang menghasilkan bilangan Fibonacci.
  • Benchmark lain mengevaluasi berbagai filter dengan nilai input n.
  • Hasil benchmark menunjukkan bahwa jaq-1.2 adalah yang tercepat pada 16 benchmark, jq-1.7 pada 2 benchmark, dan gojq-0.12.13 pada 1 benchmark.

Fitur

Fitur dasar

  • Mendukung berbagai fitur dasar seperti tipe data dasar, kondisional, akses, operator, penanganan error, interpolasi string, format string, dan lainnya.

Path

  • Mendukung indexing array/objek, iterasi, indexing/iterasi opsional, slice array, slice string, dan lainnya.

Operator

  • Mendukung operator komposisi, binding, konkatenasi, assignment, update assignment, alternatif, logika, kesetaraan dan perbandingan, aritmetika, negasi, serta penekanan error.

Definisi

  • Mendukung definisi dasar dan definisi rekursif.

Filter inti

  • Mendukung berbagai filter inti.

Filter standar

  • Filter standar didefinisikan melalui filter yang lebih mendasar.

Filter numerik

  • Mendukung banyak filter yang diambil dari libm.

Fitur lanjutan

  • Beberapa fitur jq tidak didukung, misalnya modul, operator bergaya SQL, streaming, dan lainnya.

Perbedaan jq dan jaq

Angka

  • jq menggunakan semua angka sebagai floating point 64-bit, sedangkan jaq membedakan antara integer dan floating point.

NaN dan tak hingga

  • jaq memberikan perilaku yang lebih dekat dengan standar aritmetika floating point IEEE 754.

Preservasi angka pecahan

  • jaq mempertahankan angka pecahan yang berasal dari data JSON secara sempurna.

Assignment

  • jaq menafsirkan assignment secara berbeda dari jq.

Definisi

  • jaq mengizinkan definisi filter, dan seperti jq, dapat meneruskan argumen sebagai nilai.

Argumen

  • jaq dapat mendefinisikan argumen melalui command line.

Fold

  • jaq menyediakan filter reduce dan foreach, dengan interpretasi yang berbeda dari jq.

Penanganan error

  • jaq menggunakan mekanisme penanganan error yang berbeda dari jq.

Lainnya

  • Pada slurping, hasil kali Kartesius, pembaruan daftar, pembacaan input, join, dan hal lainnya, jq dan jaq menunjukkan perilaku yang berbeda.

Kontribusi

  • Kontribusi untuk jaq sangat diterima, dan setelah melakukan perubahan, pastikan cargo test berjalan sukses.

Ucapan terima kasih

  • jaq mendapat banyak manfaat berkat berbagai library dan Rust standard library.

Opini GN⁺

Hal terpenting dalam tulisan ini adalah bahwa jaq berupaya meningkatkan performa dan akurasi sambil tetap mendukung sebagian besar fitur jq. Khususnya, waktu startup yang jauh lebih cepat dibanding jq dan upayanya untuk mengurangi perilaku tak terduga dapat menarik bagi banyak pengguna. Selain itu, karena dikembangkan berbasis Rust, jaq juga memiliki keunggulan dari sisi keamanan memori dan performa. Perbaikan-perbaikan ini diharapkan menjadikan jaq alat yang berguna bagi software engineer yang membutuhkan pemrosesan data JSON.

1 komentar

 
GN⁺ 2023-11-30
Opini Hacker News
  • Bug [[[]] | implode dan penghentian pengembangan jq

    • Pengembangan jq sempat terhenti selama 5 tahun dan baru-baru ini dilanjutkan kembali, sehingga bug yang sudah lama dikenal tetap belum diperbaiki. Dengan dimulainya kembali pengembangan, diharapkan masalah-masalah yang menumpuk secara bertahap akan terselesaikan.
  • Terima kasih atas rekomendasi proyek lain

    • Keren ketika sebuah proyek merekomendasikan proyek lain yang serupa atau menjadi sumber inspirasi. Terutama senang bisa mengetahui proyek jql.
  • Pertanyaan tentang hasil perbandingan nan > nan dan nan < nan

    • Muncul pertanyaan apakah hasil nan > nan yang salah dan nan < nan yang benar di jq benar-benar mengikuti standar floating point IEEE 754, atau justru merupakan bug.
  • Masalah tampilan angka uint64 di jq

    • Mengungkapkan keluhan bahwa jq tidak menampilkan angka uint64 dengan benar.
  • Berbagi pengalaman menggunakan DuckDB alih-alih jq

    • jq memang kuat, tetapi ketika data berbentuk tabel, menggunakan SQL terasa lebih alami.
  • Sorotan bahwa jaq memiliki banyak dependensi

    • Menunjukkan bahwa proyek jaq memiliki cukup banyak dependensi.
  • Pertanyaan tentang cara menggunakan jq

    • Menanyakan apakah jq digunakan untuk menjelajahi file JSON saat pengembangan/analisis data, atau dipakai di program yang berjalan di lingkungan produksi.
  • Berbagi pengalaman menggunakan yq alih-alih jq

    • Mulai menggunakan yq sebagai pengganti jq, dan saling bertukar pendapat tentang perbedaan utama antara kedua alat tersebut.
  • Cara melakukan kueri data di PowerShell

    • Dengan menggunakan PowerShell, semua data bisa diubah menjadi objek lalu dikueri dengan sintaks PowerShell, tanpa perlu mempelajari sintaks berbagai alat seperti jq atau xmlstarlet.
  • Pendapat tentang sulitnya sintaks dan dokumentasi jq

    • Merasa sintaks dan dokumentasi jq sulit dipahami, dan menganggap bagian ini juga belum membaik di versi baru. Ini menyiratkan bahwa menulis sendiri mungkin malah lebih baik.