3 puan yazan GN⁺ 2023-11-30 | 1 yorum | WhatsApp'ta paylaş

jaq'a giriş

  • jaq, JSON veri işleme aracı jq'nun bir klonudur ve jq'nun sözdizimi ile işlemlerinin büyük bölümünü desteklemeyi hedefler.
  • jaq'ın üç temel hedefi doğruluk, performans ve sadeliktir.
  • jq ile uyumluluğu korurken daha doğru ve öngörülebilir bir uygulama sunmayı amaçlar.
  • jq'nun beklenmedik davranışlarına örnek olarak nan > nan ifadesinin yanlış, nan < nan ifadesinin ise doğru olması ve jq içinde [[[]] | implode çalıştırıldığında çökme yaşanması verilebilir.
  • jq'nun uzun başlangıç süresine çözüm olarak geliştirildi ve jq 1.6'ya kıyasla yaklaşık 30 kat daha hızlı başlangıç süresi sunar.
  • jaq, hata olasılığını azaltmak ve katkıyı kolaylaştırmak için basit ve küçük bir uygulama olmayı hedefler.

Kurulum

Kaynaktan kurulum

  • jaq'ı derlemek için Rust araç zinciri gerekir.
  • Linux dağıtımlarında yer alan Rust derleyicisi eski olabilir ve jaq'ı derlemek için uygun olmayabilir.
  • jaq, cargo install --locked jaq veya cargo install --locked --git https://github.com/01mf02/jaq komutlarıyla kurulabilir.
  • jaq, Rust'ın desteklediği tüm sistemlerde çalışmalıdır; aksi halde bir issue açılmalıdır.

İkili dosyadan kurulum

  • macOS veya Linux'ta Homebrew kullanarak jaq kurulabilir.

Örnekler

  • Aşağıdaki örnekler, jaq'ın şu anda neler yapabildiğini gösterir.
  • echo '{"a": 1, "b": 2}' | jaq '.a' çalıştırıldığında 1 çıktısı alınır.
  • echo '{"a": 1, "b": 2}' | jaq 'add' çalıştırıldığında 3 çıktısı alınır.
  • echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]' çalıştırıldığında [0, 2, 4] çıktısı alınır.

Performans

  • Çeşitli benchmark'lar üzerinden jaq, jq ve gojq'nun performansı karşılaştırılır.
  • empty benchmark'ı başlangıç süresini ölçmek için kullanılır.
  • bf-fib benchmark'ında jq ile yazılmış bir Brainfuck yorumlayıcısı, Fibonacci sayıları üreten bir Brainfuck betiğini çalıştırır.
  • Diğer benchmark'lar, çeşitli filtreleri n girdi değerleriyle birlikte değerlendirir.
  • Sonuçlar, jaq-1.2'nin 16 benchmark'ta en hızlı olduğunu, jq-1.7'nin 2 benchmark'ta ve gojq-0.12.13'ün 1 benchmark'ta en hızlı olduğunu gösterir.

Özellikler

Temel özellikler

  • Temel veri türleri, koşullar, erişim, operatörler, hata işleme, string interpolation, biçim dizeleri gibi çeşitli temel özellikleri destekler.

Yollar

  • Dizi/nesne indeksleme, yineleme, isteğe bağlı indeksleme/yineleme, dizi dilimleme ve string dilimleme desteklenir.

Operatörler

  • Bileşim, bağlama, birleştirme, atama, güncelleme ataması, alternatif, mantıksal, eşitlik ve karşılaştırma, aritmetik, olumsuzlama ve hata bastırma operatörleri desteklenir.

Tanımlar

  • Temel tanımlar ve özyinelemeli tanımlar desteklenir.

Çekirdek filtreler

  • Çeşitli çekirdek filtreler desteklenir.

Standart filtreler

  • Standart filtreler daha temel filtreler üzerinden tanımlanır.

Sayısal filtreler

  • libm'den alınan çok sayıda filtre desteklenir.

Gelişmiş özellikler

  • jq'nun bazı özellikleri desteklenmez; örneğin modüller, SQL tarzı operatörler ve streaming.

jq ile jaq arasındaki farklar

Sayılar

  • jq tüm sayıları 64 bit kayan nokta olarak kullanırken, jaq tamsayılar ile kayan noktalı sayıları ayırt eder.

NaN ve sonsuzluk

  • jaq, IEEE 754 kayan nokta aritmetiği standardına daha yakın bir davranış sunar.

Kesirli sayıların korunması

  • jaq, JSON verisinden gelen kesirli sayıları eksiksiz biçimde korur.

Atama

  • jaq, atamayı jq'dan farklı şekilde yorumlar.

Tanımlar

  • jaq, filtre tanımlarına izin verir ve jq'daki gibi argümanları değer olarak iletebilir.

Argümanlar

  • jaq, komut satırı üzerinden argüman tanımlayabilir.

Katlama

  • jaq, reduce ve foreach filtrelerini sunar ve bunları jq'dan farklı yorumlar.

Hata işleme

  • jaq, jq'dan farklı bir hata işleme mekanizması kullanır.

Diğer

  • Slurp, Kartezyen çarpım, liste güncelleme, girdi okuma ve join gibi konularda jq ile jaq farklı davranışlar gösterir.

Katkı

  • jaq'a katkılar memnuniyetle karşılanır; değişiklikten sonra cargo test komutunun başarıyla çalıştığı doğrulanmalıdır.

Teşekkür

  • jaq, çeşitli kütüphaneler ve Rust standart kütüphanesi sayesinde büyük fayda sağlamıştır.

GN⁺ görüşü

Bu yazının en önemli noktası, jaq'ın jq'nun özelliklerinin büyük kısmını desteklerken performans ve doğruluğu iyileştirmeye çalışmasıdır. Özellikle başlangıç süresinin jq'ya göre belirgin biçimde daha hızlı olması ve beklenmedik davranışları azaltmayı hedeflemesi, birçok kullanıcı için ilgi çekici olabilir. Ayrıca Rust tabanlı geliştirilmiş olması, bellek güvenliği ve performans açısından da avantaj sağlar. Bu iyileştirmelerin, JSON veri işleme ihtiyacı olan yazılım mühendisleri için faydalı bir araç olması bekleniyor.

1 yorum

 
GN⁺ 2023-11-30
Hacker News görüşleri
  • [[[]] | implode hatası ve jq geliştirmesinin durması

    • jq geliştirmesi 5 yıl boyunca durmuş, kısa süre önce yeniden başlamış; bu yüzden uzun süredir bilinen hatalar düzeltilmeden kalmış. Geliştirmenin yeniden başlamasıyla zaman içinde biriken sorunların çözülmesi bekleniyor.
  • Diğer proje önerileri için teşekkür

    • Bir projenin benzer veya ilham aldığı başka projeleri önermesi hoş bir şey. Özellikle jql projesini öğrenmiş olmaktan memnuniyet duyuluyor.
  • nan > nan ve nan < nan karşılaştırma sonuçlarına dair soru işareti

    • jq'da nan > nan ifadesinin yanlış, nan < nan ifadesinin ise doğru olmasının, kayan nokta standardı IEEE 754'e sadık bir davranış mı yoksa bir hata mı olduğu sorgulanıyor.
  • jq'nun uint64 sayılarını gösterme sorunu

    • jq'nun uint64 sayılarını düzgün gösterememesine dair şikayet dile getiriliyor.
  • jq yerine DuckDB kullanma deneyimi paylaşımı

    • jq güçlü olsa da, veri tablo biçimindeyse SQL kullanmanın daha doğal olduğu deneyimlenmiş.
  • jaqın fazla bağımlılığı olduğuna dair eleştiri

    • jaq projesinin çok sayıda bağımlılığa sahip olduğu belirtiliyor.
  • jq'nun nasıl kullanıldığına dair soru

    • jq'nun geliştirme/veri analizi sırasında JSON dosyalarını keşfetmek için mi kullanıldığı, yoksa üretim ortamında çalışan programlarda mı kullanıldığı soruluyor.
  • jq yerine yq kullanmaya başlama deneyimi paylaşımı

    • jq yerine yq kullanılmaya başlandığı ve iki araç arasındaki temel farklar hakkında görüş alışverişi yapılıyor.
  • PowerShell'de veri sorgulama yöntemi

    • PowerShell kullanıldığında jq, xmlstarlet gibi çeşitli araçların sözdizimini öğrenmeye gerek kalmadan tüm veriler nesnelere dönüştürülüp PowerShell sözdizimiyle sorgulanabiliyor.
  • jq sözdizimi ve belgelerinin anlaşılmazlığına dair görüş

    • jq'nun sözdizimi ve belgelerinin anlaşılmasının zor olduğu düşünülüyor ve bu konunun yeni sürümlerde de iyileşmediği hissediliyor. Kişinin bunu kendisinin yazmasının daha iyi olabileceği de ima ediliyor.