3 puan yazan GN⁺ 2023-09-07 | 1 yorum | WhatsApp'ta paylaş
  • Desteği sonlandırılmış olan --argfile seçeneği ile leaf_paths ve recurse_down filtreleri kaldırıldı
  • Docker imajı artık Docker Hub yerine ghcr.io/jqlang/jq üzerinden sunuluyor
  • Sürüm derleme hedefleri arasında Linux, macOS, Windows ve Docker için çeşitli mimariler açıkça belirtildi
  • --raw-output0 eklendi; bu sayede çıktılar arasına NUL baytı konulabiliyor ve NUL içeren dizelerin çıktısı hata olarak işleniyor
  • Windows'ta --binary/-b seçeneği eklendi; böylece \r\n yerine \n satır sonu çıktısı alınabiliyor
  • JQ_COLORS ile nesne anahtarı rengi ayarlanabiliyor ve NO_COLOR ortam değişkenine uyularak renkli çıktı devre dışı bırakılıyor
  • --exit-code/-e seçeneğinin çıkış kodu sorunu düzeltildi; son çıktı değeri doğruysa 0, false veya null ise 1, hiç çıktı yoksa 4 döndürülüyor
  • Sayı sabitlerinde duyarlılığı korumak için ondalık sayı sabitleri kullanılıyor; karşılaştırma işlemleri bu duyarlılığa uyuyor, ancak aritmetik işlemler kırpılabiliyor
  • Yeni yerleşik fonksiyonlar pick(stream), debug(msgs), scan($re; $flags) ve abs eklendi
  • if ifadesinde else dalı artık atlanabiliyor; atlanan else, . davranışıyla işleniyor
  • halt ve halt_error, bir sonraki girdiye devam etmek yerine artık anında sonlandırıyor
  • Bazı platformlarda büyük sayı gösteriminin hatalı JSON çıktısı üretmesi, libjq ile thread kullanılırken oluşan segmentation fault ve --jsonarg için assert çökmesi düzeltildi
  • CI, scan build, sürüm ve web sitesi derlemeleri GitHub Actions kullanacak şekilde değiştirildi; ayrıca OSS-Fuzz eklendi

1 yorum

 
GN⁺ 2023-09-07
Hacker News yorumları
  • JQ harika olduğu için onu gerçekten seviyorum
    Ürünümüzde (JVM ve tarayıcı tabanlı bir Kafka aracı), kullanıcıların verileri işleyip/filtreleyebilmesi için Clojure ile JQ’nun bir alt kümesini uyguladık. Yazdığım kodlar arasında en keyifli işlerden biriydi; zaten sözdizimi yazmayı seven biriyim, bu yüzden Instaparse’e de büyük teşekkürler: https://github.com/Engelberg/instaparse
    Uygulama sırasında JQ’nun LISP-2 olduğunu öğrendim; yalnızca sözdizimine bakınca öyle hissettirmediği için şaşırdım: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...

    • jq’yu bir türlü sevemiyorum. İş yerindeki kod tabanının bash betiklerinde de çok jq var; benim yazdığım bazı kodlarda da var ve en iyi seçenek olduğunda istemeye istemeye kullanıyorum
      Ama sezgisel olmayan sorgu sözdizimi, en küçük adımda bile arama yapmak zorunda kalmak ve ortaya çıkan sonucun jq uzmanı olmayanların çözmesi zor bir büyü gibi görünmesi beni rahatsız ediyor. htmx veya tailwind gibi dizgelerin içine gömülü DSL’lere genel olarak içgüdüsel bir mesafem var
      Yine de iyi yapılmış bir yazılım olduğunu ve bazen daha iyi bir seçenek olmadığını kabul ediyorum. JSON’u bash içinde işlerken sed/awk/cut canavarından çok daha iyi olması anlamında en az kötü seçenek de bu. Yine de betiğin ortasında, her zaman çözülemez bir dizge gibi duran jq komutları, regex’lerle birlikte kodda görmek istemediğim şeylere yakın. Alternatif olarak heredoc içinde inline Python’ı pipe ile geçirmeyi de denedim ama o da jq betikleri kadar dağınık hale geliyor
    • Çevrimiçi LALR(1)/FLEX gramer düzenleyicisi/test aracına JQ parser/gramerini de ekledim: https://mingodad.github.io/parsertl-playground/playground/
      Örneklerden "Jq parser (partially working)" seçip "Parse"e basarsanız "Input source" içindeki kaynak için parser ağacını görebilirsiniz. Geri bildirim her zaman memnuniyetle karşılanır
    • JVM için zaten bir JQ uygulaması var. %100 tamamlanmış değil ama kullanılabilir: https://github.com/eiiches/jackson-jq
    • jq, kullanıcıların kendi verilerini işlemesini sağlamak için çok iyi. Biz de kullanıcıların gelen webhook uç noktaları oluşturduğu, rastgele JSON verileri gönderdiği ve regresyon testleri ile izlemeyi de ekleyerek kullanışlı eşlemeler ayarladığı benzer bir yaklaşım kullanıyoruz
      jq çoğu durumu basit hale getiriyor (fiilen JSON nokta notasyonu) ve uzun kuyruktaki karmaşık durumları da mümkün kılıyor
    • Ürün zaten kullanılabilir durumdaysa mutlaka denemek isterim
  • jq’yu seviyorum ama JMESPath’i (özellikle AWS CLI ile birlikte), yq’yu (tomlq ve xq dahil) ve dasel’i de kullanıyorum. hclq’nun fiilen ölü olması üzücü
    https://jmespath.org/
    https://kislyuk.github.io/yq/
    https://github.com/TomWright/dasel
    https://hclq.sh/

    • JSON’u grep’lenebilir hale getirelim: https://github.com/tomnomnom/gron
      Yıllardır jq kullanıyorum ve ihtiyaç duyduğum şeyleri her zaman bir şekilde birleştirip çıkarıyorum, ama hâlâ hiç sezgisel geldiğini hissetmedim. Biraz karmaşıklaşınca belgeleri uzun uzun okumadan çözüme ulaşmak zor; daha kolay kullanılabilse iyi olurdu
    • JMESPath etkileşimli eğitim sayfası gerçekten çok iyi: https://jmespath.org/tutorial.html
      Sözdizimini ilk öğrenirken yardımcı olmuştu; şimdi de tuhaf bir sözdizimine takılırsam yine dönüp bakıyorum
    • Birden çok formattan birden çok formata dönüştüren küçük bir araç yaptım
      En büyük kullanım alanı CSV, TOML, XML gibi şeyleri JSON’a dönüştürüp jq’ya pipe etmek: https://github.com/sentriz/rsl
    • Alternatif olarak şu araçlar da var
      https://github.com/kellyjonbrazil/jello
      https://github.com/wwkimball/yamlpath
    • Bir başka harika alternatif de JSONPath; çok iyi olmasına rağmen desteğinin ve bilinirliğinin geniş olmaması üzücü
      XPath’ten ilham aldığı için tamamen yeni bir DSL’e göre daha tanıdık geliyor; temel özelliğinin de özyinelemeli anahtar arama olduğunu düşünüyorum. people..address yazdığınızda JSON’un herhangi bir yerinde "people" altında yer alan tüm "address" anahtarlarını bulur. JSON için ayrıştırma dilleri arasında en sevdiğim bu; JSON veri kümelerini ayrıştırmak için nasıl kullanılacağını tanıtan bir yazı da yazdım
      https://github.com/JSONPath-Plus/JSONPath
      https://scrapfly.io/blog/parse-json-jsonpath-python/
  • jq'yu yalnızca ara sıra kullanıyor ve her seferinde belgelere bakmanız gerekiyorsa gron denemeye değer. grep yapılabilir JSON
    https://github.com/tomnomnom/gron

    • Basit ama çok faydalı görünüyor
      Yıllardır curl cheat.sh/jq kullanıyorum ve cheat.sh'in genel olarak harika bir kaynak olduğunu düşünüyorum. Bugün olsa muhtemelen ChatGPT gibi bir şey kullanırdım
    • Tasarımı gerçekten çok iyi
      gron | grep | sed | gron -u gibi şeyler de mümkün
    • jq sözdizimi yüzünden hep zorlandım ama örnek JSON verdiğimde ChatGPT'nin doğru komutu epey iyi üretebilmesine her seferinde şaşırıyorum
  • jq'yu sevmemin ya da tolere edebilmemin nedenlerinden biri kararlılığı. Birkaç yıl önce yazdığım betikler bugün de aynı şekilde çalışıyor
    Buna karşılık yq için bıraktığım kod, yq geriye dönük uyumsuz biçimde sürekli iyileştirildikçe sık sık bozuldu. Bu tür değişikliklerin ne kadar sık olduğunu araştırmadım ama CI betikleri gibi temel araç sürümlerinin farklı farklı olduğu ve güncelleme hızlarının da değiştiği yerlerde bundan birkaç kez etkilendim
    Bu yüzden jq bakımcılarının geriye dönük uyumluluğun önemini anlamasına hep minnettar oldum. Umarım bu duyuru, o kararlılığın yalnızca durgunluğun tesadüfi bir yan ürünü olduğu ve durgunluğu giderirken kararlılığın feda edileceği anlamına gelmiyordur

  • jq benzeri araçlara ek olarak, jq ile birlikte kullanılan ilginç araçlar arasında jo ve jc var
    https://github.com/jpmens/jo
    https://github.com/kellyjonbrazil/jc

    • jless ve gron da var
      gron'u burada ilk kez duydum ama bütünlük için ekliyorum. Öte yandan JSON, CLI araçlarının standart çıktı biçimi haline geliyor gibi. İdeal olan, tüm CLI araçlarının --json gibi bir bayrak sunması ve böylece jc'ye artık gerek kalmaması
      https://jless.io/
      https://github.com/tomnomnom/gron
  • Geçen ayki ilgili yazı "First release of jq in 5 years": https://news.ycombinator.com/item?id=36951830
    jq'nun ateşli bir hayranıyım ve sürekli kullanıyorum

  • Sonunda oldu
    Topluluğun güçlerini birleştirip yeni bakımcılar bulması ve projeyi yeniden canlandırması gerçekten harika. Özellikle GitHub kullanıcı adlarına göre @stedolan, @itchyny, @owenthereal'e özel teşekkürler

  • jq ve miller, awk ve vim ile birlikte araç kutumun vazgeçilmezleri
    https://github.com/johnkerl/miller

  • Yeni yerleşik işlev pick(stream), giriş nesnesinin veya dizisinin bir projeksiyonunu dışa aktarma özelliği ekliyor
    jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
    Bu gerçekten hayat kurtaran bir özellik. Katkıda bulunanlara teşekkürler

    • Derine inmeniz gerekmiyorsa şöyle de yapılabilir
      $ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'
      {
      "a": 1,
      "e": 4
      }
    • Birkaç gün önce bu özelliği kullanmak için Git'ten kurdum, çok faydalı
    • Gerçekten harika bir yeni özellik. Şu anda akışı önce yeniden birleştirmeden mümkün görünmediği için, akış verilerinde de çalışan bir pick sürümü olsa güzel olurdu
  • jaq'ı da önermek isterim. Doğruluk, hız ve sadeliğe odaklanan bir jq klonu
    jq'nun yalnızca bir alt kümesini uyguluyor ama şu ana kadar oldukça memnun kalarak kullanıyorum: https://github.com/01mf02/jaq