3 คะแนน โดย GN⁺ 2023-11-30 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

แนะนำ jaq

  • jaq เป็นโคลนของ jq ซึ่งเป็นเครื่องมือประมวลผลข้อมูล JSON โดยมีเป้าหมายที่จะรองรับไวยากรณ์และการทำงานของ jq ได้เป็นส่วนใหญ่
  • เป้าหมายหลัก 3 ประการของ jaq คือ ความถูกต้อง, ประสิทธิภาพ, และ ความเรียบง่าย
  • มีเป้าหมายที่จะคงความเข้ากันได้กับ jq พร้อมมอบการติดตั้งใช้งานที่แม่นยำและคาดเดาได้มากกว่า
  • ตัวอย่างพฤติกรรมที่ไม่คาดคิดของ jq ได้แก่ nan > nan ให้ค่าเป็นเท็จ แต่ nan < nan ให้ค่าเป็นจริง และการรัน jq ด้วย [[[]] | implode ทำให้เกิดการแครช
  • มันถูกพัฒนาขึ้นเพื่อแก้ปัญหาเวลาเริ่มต้นที่ยาวนานของ jq และมีเวลาเริ่มต้นเร็วกว่าประมาณ 30 เท่าเมื่อเทียบกับ jq 1.6
  • jaq ตั้งเป้าให้มีการติดตั้งใช้งานที่เรียบง่ายและขนาดเล็ก เพื่อลดโอกาสเกิดบั๊กและช่วยให้การมีส่วนร่วมทำได้ง่ายขึ้น

วิธีติดตั้ง

ติดตั้งจากซอร์ส

  • ต้องมี Rust toolchain เพื่อคอมไพล์ jaq
  • Rust compiler ที่มากับลินุกซ์ดิสโทรบางตัวอาจเก่าเกินไปและไม่เหมาะสำหรับการคอมไพล์ jaq
  • สามารถติดตั้ง jaq ได้ด้วยคำสั่ง cargo install --locked jaq หรือ cargo install --locked --git https://github.com/01mf02/jaq
  • jaq ควรทำงานได้บนทุกระบบที่ Rust รองรับ และหากไม่เป็นเช่นนั้นควรเปิด issue

ติดตั้งแบบไบนารี

  • สามารถติดตั้ง jaq บน macOS หรือ Linux ได้ด้วย homebrew

ตัวอย่าง

  • ตัวอย่างต่อไปนี้แสดงให้เห็นว่าในตอนนี้ jaq ทำอะไรได้บ้าง
  • รัน echo '{"a": 1, "b": 2}' | jaq '.a' แล้วจะได้ผลลัพธ์เป็น 1
  • รัน echo '{"a": 1, "b": 2}' | jaq 'add' แล้วจะได้ผลลัพธ์เป็น 3
  • รัน echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]' แล้วจะได้ผลลัพธ์เป็น [0, 2, 4]

ประสิทธิภาพ

  • มีการเปรียบเทียบประสิทธิภาพของ jaq, jq และ gojq ผ่านเบนช์มาร์กหลายชุด
  • เบนช์มาร์ก empty ใช้สำหรับวัดเวลาเริ่มต้น
  • เบนช์มาร์ก bf-fib รันอินเทอร์พรีเตอร์ Brainfuck ที่เขียนด้วย jq เพื่อให้ทำงานกับสคริปต์ Brainfuck ที่สร้างลำดับฟีโบนักชี
  • เบนช์มาร์กอื่น ๆ เป็นการประเมินฟิลเตอร์หลากหลายแบบร่วมกับค่าอินพุต n
  • ผลเบนช์มาร์กแสดงว่า jaq-1.2 เร็วที่สุดใน 16 เบนช์มาร์ก, jq-1.7 เร็วที่สุดใน 2 รายการ, และ gojq-0.12.13 เร็วที่สุดใน 1 รายการ

ความสามารถ

ความสามารถพื้นฐาน

  • รองรับความสามารถพื้นฐานหลากหลาย เช่น ชนิดข้อมูลพื้นฐาน, เงื่อนไข, การเข้าถึง, ตัวดำเนินการ, การจัดการข้อผิดพลาด, string interpolation, format string และอื่น ๆ

พาธ

  • รองรับการทำดัชนีอาร์เรย์/อ็อบเจ็กต์, การวนซ้ำ, การทำดัชนี/วนซ้ำแบบทางเลือก, การ slice อาร์เรย์ และการ slice สตริง

ตัวดำเนินการ

  • รองรับตัวดำเนินการสำหรับ composition, binding, concatenation, assignment, update assignment, alternative, logic, equality และ comparison, arithmetic, negation และ error suppression

การนิยาม

  • รองรับทั้งการนิยามพื้นฐานและการนิยามแบบ recursive

ฟิลเตอร์แกนหลัก

  • รองรับฟิลเตอร์แกนหลักหลากหลายแบบ

ฟิลเตอร์มาตรฐาน

  • ฟิลเตอร์มาตรฐานถูกนิยามขึ้นจากฟิลเตอร์พื้นฐานมากกว่า

ฟิลเตอร์เชิงตัวเลข

  • รองรับฟิลเตอร์จำนวนมากที่นำมาจาก libm

ความสามารถขั้นสูง

  • ยังไม่รองรับบางความสามารถของ jq เช่น โมดูล, ตัวดำเนินการสไตล์ SQL, สตรีมมิง เป็นต้น

ความแตกต่างระหว่าง jq และ jaq

ตัวเลข

  • jq ใช้ตัวเลขทั้งหมดเป็น floating point แบบ 64 บิต ขณะที่ jaq แยกใช้จำนวนเต็มและ floating point

NaN และอินฟินิตี้

  • jaq ให้พฤติกรรมที่ใกล้เคียงกับมาตรฐานเลขคณิต floating point IEEE 754 มากกว่า

การคงค่าเลขเศษส่วน

  • jaq สามารถคงค่าเลขเศษส่วนที่มาจากข้อมูล JSON ได้อย่างสมบูรณ์

การกำหนดค่า

  • jaq ตีความ assignment แตกต่างจาก jq

การนิยาม

  • jaq อนุญาตให้มีการนิยามฟิลเตอร์ และสามารถส่งอาร์กิวเมนต์เป็นค่าได้เหมือน jq

อาร์กิวเมนต์

  • jaq สามารถนิยามอาร์กิวเมนต์ผ่าน command line ได้

การพับค่า

  • jaq มีฟิลเตอร์ reduce และ foreach และให้การตีความที่ต่างจาก jq

การจัดการข้อผิดพลาด

  • jaq ใช้กลไกการจัดการข้อผิดพลาดที่ต่างจาก jq

อื่น ๆ

  • jq และ jaq มีพฤติกรรมต่างกันในเรื่อง slurping, Cartesian product, list update, การอ่านอินพุต, การ join และส่วนอื่น ๆ

การมีส่วนร่วม

  • ยินดีต้อนรับการมีส่วนร่วมกับ jaq และควรตรวจสอบให้แน่ใจว่า cargo test รันผ่านสำเร็จหลังจากแก้ไขแล้ว

คำขอบคุณ

  • jaq ได้รับประโยชน์อย่างมากจากหลายไลบรารีและ Rust standard library

ความเห็นของ GN⁺

สิ่งสำคัญที่สุดของบทความนี้คือ jaq พยายามรองรับความสามารถส่วนใหญ่ของ jq ขณะเดียวกันก็ปรับปรุงทั้งประสิทธิภาพและความถูกต้อง โดยเฉพาะเวลาเริ่มต้นที่เร็วกว่า jq อย่างชัดเจน และความพยายามลดพฤติกรรมที่ไม่คาดคิด ซึ่งน่าจะดึงดูดความสนใจของผู้ใช้จำนวนมาก นอกจากนี้ยังพัฒนาด้วย Rust จึงมีข้อดีด้าน memory safety และประสิทธิภาพด้วย การปรับปรุงเหล่านี้มีแนวโน้มทำให้มันเป็นเครื่องมือที่มีประโยชน์สำหรับวิศวกรซอฟต์แวร์ที่ต้องประมวลผลข้อมูล JSON

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

 
GN⁺ 2023-11-30
ความคิดเห็นจาก Hacker News
  • บั๊ก [[[]] | implode และการหยุดพัฒนา jq

    • การพัฒนา jq หยุดไปนาน 5 ปีแล้วเพิ่งกลับมาเริ่มใหม่ ทำให้บั๊กที่รู้จักกันมานานยังไม่ได้รับการแก้ไข คาดว่าหลังกลับมาพัฒนาอีกครั้ง ปัญหาที่สะสมไว้จะค่อย ๆ ถูกแก้
  • ขอบคุณสำหรับการแนะนำโปรเจ็กต์อื่น

    • เป็นเรื่องดีเมื่อโปรเจ็กต์แนะนำโปรเจ็กต์อื่นที่คล้ายกันหรือเป็นแรงบันดาลใจให้กัน โดยเฉพาะดีใจที่ได้รู้จักโปรเจ็กต์ jql
  • ข้อสงสัยเกี่ยวกับผลการเปรียบเทียบ nan > nan และ nan < nan

    • มีการตั้งคำถามว่าสิ่งที่ jq ให้ nan > nan เป็นเท็จ และ nan < nan เป็นจริงนั้น เป็นการทำตามมาตรฐานเลขทศนิยมลอยตัว IEEE 754 อย่างเคร่งครัด หรือเป็นบั๊กกันแน่
  • ปัญหาการแสดงตัวเลข uint64 ของ jq

    • มีการแสดงความไม่พอใจที่ jq แสดงตัวเลข uint64 ได้ไม่ถูกต้อง
  • แชร์ประสบการณ์ใช้ DuckDB แทน jq

    • แม้ jq จะทรงพลัง แต่เมื่อข้อมูลอยู่ในรูปแบบตาราง ก็พบว่าการใช้ SQL เป็นธรรมชาติกว่า
  • มีการชี้ว่า jaq มี dependency เยอะ

    • มีการชี้ให้เห็นว่าโปรเจ็กต์ jaq มี dependency จำนวนมาก
  • คำถามเกี่ยวกับวิธีใช้งาน jq

    • มีคำถามว่าใช้ jq เพื่อสำรวจไฟล์ JSON ระหว่างการพัฒนา/วิเคราะห์ข้อมูล หรือใช้ในโปรแกรมที่รันอยู่ในสภาพแวดล้อม production
  • แชร์ประสบการณ์หันไปใช้ yq แทน jq

    • เริ่มใช้ yq แทน jq แล้ว และมีการแลกเปลี่ยนความเห็นเกี่ยวกับความแตกต่างหลักระหว่างสองเครื่องมือนี้
  • วิธี query ข้อมูลใน PowerShell

    • หากใช้ PowerShell ก็สามารถแปลงข้อมูลทุกชนิดเป็นอ็อบเจ็กต์ แล้ว query ด้วยไวยากรณ์ของ PowerShell ได้ โดยไม่ต้องเรียนรู้ไวยากรณ์ของเครื่องมือหลากหลายอย่างเช่น jq หรือ xmlstarlet
  • ความเห็นว่าทั้งไวยากรณ์และเอกสารของ jq เข้าใจยาก

    • รู้สึกว่าไวยากรณ์และเอกสารของ jq เข้าใจยาก และคิดว่าแม้ในเวอร์ชันใหม่ก็ยังไม่ได้ปรับปรุงส่วนนี้ พร้อมทั้งสื่อว่าอาจเขียนขึ้นเองยังจะดีกว่า