3 คะแนน โดย GN⁺ 2023-09-07 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • นำ ตัวเลือก --argfile และฟิลเตอร์ leaf_paths, recurse_down ที่เคยประกาศเลิกสนับสนุนแล้วออก
  • อิมเมจ Docker ให้บริการที่ ghcr.io/jqlang/jq แทน Docker Hub
  • ระบุเป้าหมายบิลด์สำหรับรีลีสครอบคลุมหลายสถาปัตยกรรมของ Linux, macOS, Windows และ Docker
  • เพิ่ม --raw-output0 เพื่อแทรก ไบต์ NUL ระหว่างเอาต์พุต และจะจัดการเป็นข้อผิดพลาดหากพิมพ์สตริงที่มี NUL
  • บน Windows เพิ่มตัวเลือก --binary/-b เพื่อให้สามารถพิมพ์ตัวจบบรรทัดเป็น \n แทน \r\n ได้
  • สามารถตั้งค่าสีของคีย์อ็อบเจ็กต์ด้วย JQ_COLORS และปิดการแสดงผลสีโดยเคารพตัวแปรสภาพแวดล้อม NO_COLOR
  • แก้ปัญหารหัสออกของตัวเลือก --exit-code/-e โดยจะคืนค่า 0 เมื่อค่าเอาต์พุตสุดท้ายเป็นจริง, 1 เมื่อเป็น false หรือ null, และ 4 เมื่อไม่มีเอาต์พุต
  • ใช้ลิเทอรัลตัวเลขฐาน 10 เพื่อ คงความแม่นยำ ของลิเทอรัลตัวเลข โดยการเปรียบเทียบจะคงความแม่นยำ แต่การคำนวณเลขคณิตอาจถูกตัดทอน
  • เพิ่มฟังก์ชันในตัวใหม่ pick(stream), debug(msgs), scan($re; $flags), abs
  • ในคำสั่ง if สามารถละสาขา else ได้ และ else ที่ละไว้จะถูกทำงานเป็น .
  • เปลี่ยนให้ halt และ halt_error จบทันทีโดยไม่ดำเนินต่อไปยังอินพุตถัดไป
  • แก้ปัญหาการสร้างเอาต์พุต JSON ผิดพลาดจากการแสดงผลตัวเลขขนาดใหญ่บนบางแพลตฟอร์ม, segmentation fault เมื่อใช้ libjq กับเธรด, และ assert crash ของ --jsonarg
  • เปลี่ยน CI, สแกนบิลด์, รีลีส และการบิลด์เว็บไซต์ให้ใช้ GitHub Actions พร้อมเพิ่ม OSS-Fuzz

1 ความคิดเห็น

 
GN⁺ 2023-09-07
ความคิดเห็นจาก Hacker News
  • JQ ยอดเยี่ยมมาก เลยชอบจริง ๆ
    ในผลิตภัณฑ์ของเรา (เครื่องมือ Kafka ที่ทำงานบน JVM และเบราว์เซอร์) เราได้ implement subset ของ JQ ด้วย Clojure เพื่อให้ผู้ใช้สามารถแปลง/กรองข้อมูลได้ นี่เป็นหนึ่งในงานที่สนุกที่สุดเท่าที่เคยเขียนโค้ดมา และผมก็เป็นคนที่ชอบเขียนไวยากรณ์อยู่แล้ว จึงต้องขอบคุณ Instaparse อย่างมากด้วย: https://github.com/Engelberg/instaparse
    ระหว่าง implement ผมพบว่า JQ เป็น LISP-2 ซึ่งน่าประหลาดใจ เพราะดูจากไวยากรณ์อย่างเดียวไม่รู้สึกแบบนั้นเลย: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...

    • ผมชอบ jq ไม่ลงจริง ๆ ในสคริปต์ bash ของ codebase ที่ทำงานก็มี jq อยู่เยอะ และโค้ดที่ผมเขียนเองก็มีอยู่บ้าง เวลาเป็นตัวเลือกที่ดีที่สุดก็ยังฝืนใช้
      แต่สิ่งที่ขัดใจคือ ไวยากรณ์ query ที่ไม่เป็นธรรมชาติ ต้องค้นหาทุกขั้นตอนยิบย่อย และผลลัพธ์ก็ออกมาเหมือนคาถาที่ถอดความยากถ้าไม่ใช่ผู้เชี่ยวชาญ jq ผมมีแรงต้านโดยสัญชาตญาณต่อ DSL โดยรวมที่ถูกฝังอยู่ในสตริงแบบ htmx หรือ tailwind
      ถึงอย่างนั้นก็ยอมรับว่าเป็นซอฟต์แวร์ที่ทำมาดี และบางครั้งก็ไม่มีตัวเลือกที่ดีกว่า ในแง่ของการจัดการ JSON ใน bash มันเป็น ตัวเลือกที่แย่น้อยที่สุด เมื่อเทียบกับสัตว์ประหลาด sed/awk/cut เพียงแต่คำสั่ง jq ที่ฝังอยู่กลางสคริปต์เหมือนสตริงที่อ่านไม่ออกเสมอนั้น จัดอยู่ในกลุ่มสิ่งที่ไม่ค่อยอยากเห็นในโค้ดพอ ๆ กับ regex ผมเคยลองทางเลือกด้วยการ pipe inline Python ใน heredoc แต่สุดท้ายก็เละเทะพอ ๆ กับสคริปต์ jq
    • ผมเพิ่ม parser/grammar ของ JQ ลงใน editor/tester ไวยากรณ์ LALR(1)/FLEX แบบออนไลน์ด้วย: https://mingodad.github.io/parsertl-playground/playground/
      เลือก "Jq parser (partially working)" ในตัวอย่าง แล้วกด "Parse" ก็จะเห็น parser tree สำหรับซอร์สใน "Input source" ยินดีรับฟีดแบ็กเสมอ
    • บน JVM มี implementation ของ JQ อยู่แล้ว ยังไม่สมบูรณ์ 100% แต่ใช้งานได้: https://github.com/eiiches/jackson-jq
    • jq เหมาะมากสำหรับให้ผู้ใช้แปลงข้อมูลของตัวเอง เราก็ใช้แนวทางคล้ายกัน คือให้ผู้ใช้สร้าง webhook endpoint ขาเข้า ส่งข้อมูล JSON ใด ๆ เข้ามา แล้วตั้งค่า mapping ที่มีประโยชน์พร้อมกับ regression test และ monitoring
      jq ทำให้กรณีส่วนใหญ่ง่ายขึ้น (โดยพื้นฐานคือ dot notation ของ JSON) และยังรองรับกรณีซับซ้อนแบบ long tail ได้ด้วย
    • ถ้าผลิตภัณฑ์อยู่ในสถานะที่ใช้งานได้แล้ว ผมอยากลองใช้มาก
  • ผมชอบ 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
      ช่วยตอนเรียนไวยากรณ์ครั้งแรก และตอนนี้ถ้าติดไวยากรณ์แปลก ๆ ก็ยังกลับไปดูอยู่
    • ผมทำเครื่องมือเล็ก ๆ สำหรับแปลงหลายรูปแบบไปเป็นหลายรูปแบบ
      การใช้งานหลักที่สุดคือ แปลงเป็น JSON อย่าง CSV, TOML, XML แล้ว pipe ไปให้ jq: https://github.com/sentriz/rsl
    • ยังมีเครื่องมือทางเลือกเหล่านี้ด้วย
      https://github.com/kellyjonbrazil/jello
      https://github.com/wwkimball/yamlpath
    • อีกทางเลือกที่ยอดเยี่ยมคือ JSONPath ซึ่งน่าเสียดายที่แม้จะดีมาก แต่การสนับสนุนและการรับรู้ยังไม่กว้างนัก
      ได้แรงบันดาลใจจาก XPath จึงคุ้นเคยกว่า DSL ใหม่ทั้งหมด และผมมองว่าฟีเจอร์หลักคือการค้นหาคีย์แบบ recursive ถ้าเขียน people..address ก็จะค้นหาคีย์ "address" ทั้งหมดที่อยู่ใต้ "people" ที่ใดก็ได้ใน JSON เป็นภาษาสำหรับ parse JSON ที่ผมชอบที่สุด และผมยังเขียนบทความแนะนำวิธีใช้มันในการ parse ชุดข้อมูล JSON ด้วย
      https://github.com/JSONPath-Plus/JSONPath
      https://scrapfly.io/blog/parse-json-jsonpath-python/
  • ถ้าใช้ jq แค่นาน ๆ ครั้งจนต้องเปิดเอกสารดูทุกครั้ง gron ก็น่าลองใช้ เป็น JSON ที่ grep ได้
    https://github.com/tomnomnom/gron

    • เรียบง่ายแต่ดูมีประโยชน์มาก
      ใช้ curl cheat.sh/jq มาหลายปีแล้ว และมองว่า cheat.sh โดยรวมเป็นแหล่งข้อมูลที่ยอดเยี่ยม ถ้าเป็นสมัยนี้ก็คงใช้บางอย่างอย่าง ChatGPT แทน
    • ออกแบบมาได้ดีจริง ๆ
      ทำแบบ gron | grep | sed | gron -u ก็ได้ด้วย
    • แม้จะลำบากกับไวยากรณ์ของ jq อยู่เสมอ แต่ทุกครั้งก็ทึ่งที่ ChatGPT สร้างคำสั่งที่ถูกต้องได้ค่อนข้างดีเมื่อให้ JSON ตัวอย่างไป
  • หนึ่งในเหตุผลที่ชอบ jq หรือพอทนใช้ได้คือ ความเสถียร สคริปต์ที่เขียนไว้เมื่อหลายปีก่อนยังทำงานได้เหมือนเดิมจนถึงตอนนี้
    ในทางกลับกัน โค้ดที่เก็บไว้สำหรับ yq มักพังบ่อย เพราะ yq ปรับปรุงต่อเนื่องในแบบที่ไม่เข้ากันย้อนหลัง ไม่ได้ตรวจสอบว่ามีการเปลี่ยนแปลงแบบนั้นบ่อยแค่ไหน แต่ได้รับผลกระทบหลายครั้งในที่อย่างสคริปต์ CI ซึ่งเวอร์ชันเครื่องมือพื้นฐานแตกต่างกันไปและอัตราการอัปเดตก็ไม่เท่ากัน
    ดังนั้นจึงรู้สึกขอบคุณเสมอที่ผู้ดูแล jq เข้าใจความสำคัญของ ความเข้ากันได้ย้อนหลัง หวังว่าประกาศครั้งนี้จะไม่ได้หมายความว่าความเสถียรนั้นเป็นเพียงผลพลอยได้โดยบังเอิญจากการหยุดนิ่ง และการแก้ความหยุดนิ่งจะต้องแลกด้วยความเสถียร

    • ในฐานะหนึ่งในผู้ดูแล ยืนยันได้เลยว่าเราให้ความสำคัญกับ ความเข้ากันได้ย้อนหลัง อย่างจริงจังมาก
    • เกี่ยวกับความไม่เข้ากันของ yq/jq มีโปรเจกต์ค่อนข้างมากที่ครอบ jq เพื่อให้ใช้งานฟีเจอร์ของ yq ได้
      https://kislyuk.github.io/yq/
      https://github.com/kyle-long/yq#yq
      https://github.com/up1/yq-1#yq-command-line-yamlxml-processo...
      https://github.com/onixspot/yq-2#yq-command-line-yamlxmltoml...
      https://github.com/simonrupf/convert2json#convert2json
    • สงสัยว่าใช้ yq กับอะไร ถ้าไม่ได้ใช้ฟีเจอร์เฉพาะของ YAML เช่นการใช้จำนวนเต็ม·อาร์เรย์·ออบเจ็กต์เป็นคีย์ของออบเจ็กต์ ก็ดูเหมือนจะง่ายกว่าที่จะแปลง YAML เป็น JSON แล้ว pipe ไป ประมวลผลด้วย jq
    • "ปรับปรุงในแบบที่ไม่เข้ากันย้อนหลัง" ฟังดูแทบจะเหมือน "ทำให้แย่ลง" มากกว่า
  • นอกจากเครื่องมือคล้าย jq แล้ว ยังมีเครื่องมือที่น่าสนใจสำหรับใช้ร่วมกับ jq อย่าง jo และ jc
    https://github.com/jpmens/jo
    https://github.com/kellyjonbrazil/jc

    • ยังมี jless และ gron ด้วย
      เพิ่งได้ยินชื่อ 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 และใช้ตลอด

  • ในที่สุดก็สำเร็จ
    กระบวนการที่ชุมชนร่วมแรงกันสรรหาผู้ดูแลใหม่และฟื้นโปรเจกต์ขึ้นมานั้นยอดเยี่ยมจริง ๆ โดยเฉพาะขอขอบคุณเป็นพิเศษต่อ @stedolan, @itchyny, @owenthereal ตามชื่อผู้ใช้ GitHub

  • jq กับ miller เป็นของจำเป็นในกล่องเครื่องมือของผม ร่วมกับ awk และ vim
    https://github.com/johnkerl/miller

  • ฟังก์ชัน built-in ใหม่ pick(stream) เพิ่มความสามารถในการส่งออก projection ของออบเจ็กต์หรืออาร์เรย์อินพุต
    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 เพื่อใช้ฟีเจอร์นี้เมื่อไม่กี่วันก่อน มีประโยชน์มาก
    • เป็นฟีเจอร์ใหม่ที่ยอดเยี่ยมจริง ๆ ตอนนี้ดูเหมือนจะทำไม่ได้หากไม่ประกอบ stream กลับขึ้นมาก่อน จึงอยากให้มีเวอร์ชันของ pick ที่ทำงานกับ ข้อมูลแบบสตรีมมิง ได้ด้วย
  • อยากแนะนำ jaq ด้วย เป็นโคลนของ jq ที่เน้นความถูกต้อง ความเร็ว และความเรียบง่าย
    แม้จะ implements แค่ส่วนย่อยของ jq แต่เท่าที่ใช้มาก็ค่อนข้างพอใจ: https://github.com/01mf02/jaq