1 คะแนน โดย GN⁺ 2024-05-02 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ffs: เครื่องมือที่เมานต์ข้อมูลกึ่งโครงสร้างอย่าง JSON เป็นระบบไฟล์ UNIX

  • ffs ย่อมาจาก File Filesystem โดยเป็นเครื่องมือที่ทำให้สามารถเมานต์ข้อมูลกึ่งโครงสร้างให้เป็นระบบไฟล์ และจัดการฟอร์แมตแบบโครงสร้างต้นไม้ที่ทันสมัยอย่าง JSON, YAML ด้วยเครื่องมือเชลล์ที่คุ้นเคยได้
  • การแก้ไข JSON โดยใช้การประมวลผลข้อความลักษณะเดียวกับ sed ไม่ใช่วิธีที่ดี จึงแนะนำให้ใช้ ffs
  • ขณะนี้ ffs รองรับ JSON, YAML, TOML และมีแผนรองรับฟอร์แมตเพิ่มเติมในอนาคต

ตัวอย่างการใช้งาน ffs

  • คำสั่ง ffs [file] จะเมานต์ file.blah ไปยังจุดเมานต์ชื่อ file และไฟล์เวอร์ชันสุดท้ายที่แก้ไขแล้วจะถูกส่งออกไปที่ stdout
  • ด้วย ffs -m MOUNT file สามารถระบุ mount point แบบชัดเจนได้
  • ด้วย ffs -o OUTPUT สามารถระบุไฟล์ output ได้
  • ด้วย ffs -i file สามารถแก้ไขไฟล์ได้โดยตรง และเมื่อยกเลิกการเมานต์ volume แล้วผลลัพธ์จะถูกเขียนกลับไปยัง file
  • ในการแก้ไขจะเห็นว่าค่า nose กลายเป็นตัวเลขแทนสตริง และไดเรกทอรี pockets ถูกแปลงเป็น object

วิธีติดตั้ง ffs

  • Linux ต้องใช้ FUSE และ macOS ต้องใช้ macFUSE
  • มีตัวเลือกดาวน์โหลดไฟล์ปฏิบัติการแบบเดี่ยว
  • สามารถคอมไพล์จาก source ได้

เรียนรู้เพิ่มเติมเกี่ยวกับ ffs

  • อ้างอิงบทความ "Files-as-Filesystems for POSIX Shell Data Processing" ใน PLOS 2021
  • มีวิดีโอดีโมและวิดีโอนำเสนอ

เปรียบเทียบเครื่องมือที่เกี่ยวข้อง

  • jq, gron และอื่นๆ เป็นเครื่องมือที่ดีสำหรับจัดการ JSON ใน CLI
  • ffs มีข้อดีเช่นรองรับหลายฟอร์แมต แก้ไขผ่านเครื่องมือเชลล์ที่คุ้นเคย และไม่ต้องเรียนรู้ภาษาใหม่
  • อย่างไรก็ตาม อาจไม่เหมาะกับ ffs ในกรณีที่ไม่รองรับ Windows, ไม่สามารถใช้งาน FUSE ได้, ต้องการเพียงการค้นหาเท่านั้น, หรือไฟล์มีขนาดใหญ่มาก

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

  • ffs ดูเหมือนจะมีประโยชน์สำหรับการจัดการข้อมูลกึ่งโครงสร้างที่นิยมใช้ในงานเว็บสมัยใหม่อย่าง JSON, YAML, TOML โดยเฉพาะเมื่อทำงานอัตโนมัติด้วย shell script จะดูทรงพลัง
  • อย่างไรก็ดี เนื่องจากเป็น FUSE-based จึงอาจมีประเด็นด้านประสิทธิภาพ และการไม่รองรับ Windows ก็ยังเป็นข้อจำกัด โดยยังไม่แน่ใจว่าสามารถใช้งานบน WSL ได้หรือไม่
  • ข้อดีอีกด้านคือเป็นโอเพ่นซอร์ส จึงสามารถมีส่วนร่วมเพิ่มการรองรับฟอร์แมตอื่นๆ ได้ และจากมุมมองผู้ใช้ก็น่าจะช่วยเพิ่มความสะดวกและประสิทธิภาพในการทำงาน
  • สำหรับวิศวกรที่คุ้นเคยกับเครื่องมือประมวลผลข้อความแบบคลาสสิกอย่าง sed หรือ awk สามารถใช้งานได้ทันทีโดยไม่ต้องลงทุนในการเรียนรู้อะไรใหม่
  • การเก็บ response จาก API ไว้ในเครื่องเพื่อดีบัก หรือการแก้ไขไฟล์คอนฟิกกึ่งโครงสร้างบ่อยๆ จะน่าจะมีประโยชน์

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

 
GN⁺ 2024-05-02
ความคิดเห็นจาก Hacker News
  • ผู้ใช้พอร์ตตัวอย่างไฟล์ระบบ 'hello' โดย wrapping libfuse ที่ตัวเองพัฒนาด้วย Nim เป็นเวอร์ชันที่ส่งข้อมูลผ่าน pipe และจัดหา mount point ให้ได้ เมื่อเสร็จแล้วจะเขียนผลลัพธ์ออกทาง stdout ทำให้สามารถใช้ต่อใน pipeline แบบ inline ได้ แต่ต้องแน่ใจว่าสามารถดึง output มาได้ชัดเจน

  • ตอนนี้กำลังสำรวจอย่างอื่นเพิ่มเติมที่ทำเป็นไฟล์ระบบได้ สร้าง status bar สำหรับ Nimdow window manager แล้วเมื่อเขียนเนื้อหาลงในไฟล์แต่ละตัว จะได้เอาท์พุตเป็นแถบที่มีบล็อก และสามารถเปลี่ยนเนื้อหาบน status bar ได้ง่ายมาก ทำให้สะดวกมาก

  • ยังทำ music player ที่ใช้ libvlc ด้วย โดยอ่านมีเดียที่มี ID3 tag และตั้งโฟลเดอร์ตาม 'ตามศิลปิน', 'ตามอัลบั้ม' ฯลฯ โดยแต่ละไฟล์ถูกตั้งชื่อเป็น '<หมายเลขแทร็ก> - <ชื่อเพลง>' และรวมเส้นทางไฟล์จริงทั้งหมดไว้ หากจะเล่นเพลง ให้ cat หนึ่งในไฟล์เหล่านี้ที่ 'control/current' และเขียนคำว่า play ที่ 'control/command' ยังมีฟีเจอร์ playlist และคำสั่งอื่น ๆ เพิ่มเติม แต่ความคิดหลักคืออย่างนี้ เป้าหมายคือการสร้าง music player ที่สคริปต์ได้อย่างทรงพลังมาก

  • ระบบ Unix-like สามารถ mount disk image เพื่อสำรวจเนื้อหาได้ แต่รูปแบบไฟล์ที่มีประโยชน์ในการสำรวจไฟล์ภายในนั้นยังมีอีกมาก โดยหนึ่งในนั้นคือไฟล์บีบอัด บางตัวจัดการไฟล์รองรับส่วนนี้ แต่ระดับ application ไม่ใช่ชั้นที่เหมาะสมที่สุดในการฝังฟังก์ชันนี้ ควรทำเป็นไฟล์ตามประเภทไฟล์ (driver) ได้

  • กำลังหาฟังก์ชันไฟล์ระบบ FUSE ที่ทำงานในหน่วยความจำขณะ mount (เหมือน tmpfs) และเมื่อ unmount แล้ว serialize เป็นไฟล์เดี่ยวบนดิสก์ ซึ่งใกล้เคียงกับ FUSE driver ที่ใช้ mount ไฟล์ archive มากที่สุด แต่ไม่สามารถใช้บางอย่างเช่น symbolic link ได้

  • สามารถ mount Git commit เป็นไฟล์ระบบได้เช่นกัน (ดูลิงก์)

  • มี Parts-of-file File System ด้วย (ดูลิงก์ Usenix)

  • ทำให้นึกถึง TabFS ของ Omar Rizwan (ดูลิงก์)

  • เคยทำสิ่งนี้ในปี 2003 และน่าแปลกใจที่สามารถทำล็อกละเอียดและเร็วได้ง่ายมาก ใช้เป็นฐานข้อมูลผู้ใช้แบบรายบุคคลสำหรับภาษาเทมเพลตเว็บที่ใช้สร้างเว็บไซต์ขนาดใหญ่

  • คำถามว่าถ้ามี slash ในคีย์ของ JSON จะเกิดอะไรขึ้น

  • มันเปิดโอกาสในการคอมมิตไฟล์เป็นโครงสร้างไดเรกทอรีได้ และสงสัยว่ามันจะมีผลต่อการ merge และ conflict อย่างไร

  • น่าดูมาก และน่าจะลองให้เร็วที่สุดเท่าที่ทำได้ มันดูเหมือนจะมีประโยชน์มากในการค้นหาและนำทางภายในไฟล์ JSON