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 ความคิดเห็น
ความคิดเห็นจาก 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