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

7 สิ่งที่ได้เรียนรู้ระหว่างสร้างเฟรมเวิร์ก TUI สมัยใหม่

เทอร์มินัลเร็วมาก

  • ตัวจำลองเทอร์มินัลสมัยใหม่เป็นซอฟต์แวร์ที่ซับซ้อนและประณีตมาก
  • สามารถใช้การเรนเดอร์แบบเร่งด้วยฮาร์ดแวร์เพื่อลดอาการหน้าจอกะพริบได้
  • 3 เทคนิคในการลดอาการกะพริบ:
    • อย่าล้างหน้าจอ แต่เขียนทับลงไป
    • เขียนออกไปยัง standard output ในครั้งเดียว
    • ใช้โปรโตคอล Synchronized Output
  • Textual ใช้ 60fps เป็นค่าเริ่มต้นเพื่อมอบแอนิเมชันที่ลื่นไหล

DictViews น่าทึ่งมาก

  • เมธอด keys() และ items() ของ dict ใน Python จะคืนค่า KeysView และ ItemsView
  • สามารถใช้ symmetric difference ของอ็อบเจ็กต์ ItemsView เพื่อค้นหารายการที่เปลี่ยนแปลงได้อย่างง่ายดาย
  • ใน Textual มีการใช้งานสิ่งนี้เมื่อพร็อพเพอร์ตี CSS เปลี่ยนไป เพื่อให้อัปเดตได้อย่างเหมาะสมที่สุด

lru_cache เร็วมาก

  • ดีคอเรเตอร์ @lru_cache ในโมดูล functools ใช้แคชค่าที่ฟังก์ชันส่งกลับ
  • ใน Textual มีการใช้ @lru_cache กับฟังก์ชันขนาดเล็กที่ถูกเรียกบ่อยเพื่อเพิ่มประสิทธิภาพ
  • ควรตรวจสอบข้อมูลแคช (cache_info()) เพื่อยืนยันว่าการแคชได้ผลจริง

อ็อบเจ็กต์ immutable ดีที่สุด

  • สามารถใช้ tuple, NamedTuples หรือ frozen dataclasses ของ Python เพื่อรับประโยชน์จากอ็อบเจ็กต์ immutable
  • การใช้อ็อบเจ็กต์ immutable ช่วยให้เขียนโค้ดที่ไม่มีผลข้างเคียง ทำให้ทดสอบและแคชได้ง่ายขึ้น

Unicode art มีประโยชน์มาก

  • ไดอะแกรมที่ใช้ตัวอักษรกล่องของ Unicode มีประโยชน์อย่างมากต่อการทำเอกสาร
  • เมื่อใช้ร่วมกับ docstring ที่เขียนดีแล้ว จะช่วยได้มาก

เศษส่วนให้ความแม่นยำ

  • โมดูล fractions ของ Python ช่วยหลีกเลี่ยงข้อผิดพลาดจากเลขทศนิยมแบบลอยตัวได้
  • ใน Textual มีการใช้เศษส่วนเมื่อแบ่งหน้าจอตามสัดส่วน เพื่อให้ได้เลย์เอาต์ที่แม่นยำ

อีโมจิแย่มาก

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

สรุปของ GN⁺

  • บทความนี้ให้ทิปและเทคนิคที่มีประโยชน์สำหรับการพัฒนาแอปพลิเคชันเทอร์มินัลด้วย Python
  • ผู้เขียนแบ่งปันคำแนะนำเชิงปฏิบัติที่ได้จากประสบการณ์พัฒนาเฟรมเวิร์ก Textual
  • อธิบายวิธีรับมือกับปัญหาซับซ้อนอย่างอีโมจิ ซึ่งเป็นประโยชน์ต่อผู้พัฒนา
  • โปรเจ็กต์ที่มีความสามารถคล้ายกันได้แก่ urwid และ prompt_toolkit

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

 
GN⁺ 2024-08-12
ความคิดเห็นบน Hacker News
  • นักพัฒนา TUI ต้องจัดการเรื่อง Unicode, อักขระนานาชาติ และอีโมจิเป็นโปรเจกต์แยกต่างหาก

    • พบปัญหาเดียวกันในแพ็กเกจ rivo/tview และ rivo/uniseg
    • ผู้ดูแลไลบรารี TUI แต่ละตัวพัฒนาแนวทางแก้ของตัวเอง
    • เทอร์มินัลมีความซับซ้อนเพราะความกว้างของอักขระยังไม่เป็นมาตรฐาน
    • ผู้เขียนต้นฉบับรองรับเพียง Unicode 9 (ขณะที่เวอร์ชันปัจจุบันคือ Unicode 15.1)
    • สุดท้ายผู้ใช้ก็จะบ่นว่าอีโมจิบางตัวหรืออักขระนานาชาติบางตัวเรนเดอร์ได้ไม่ถูกต้อง
  • ไม่ชอบที่ Textual พยายามเลียนแบบ React

    • React เป็นเฟรมเวิร์กยอดนิยม แต่ไม่ใช่วิธีที่ดีในการสร้างส่วนติดต่อผู้ใช้
    • การออกแบบแบบ responsive พื้นฐานเป็นสิ่งที่รู้จักกันดีอยู่แล้ว
    • การใช้ CSS ดูเหมือนจะมากเกินความจำเป็น
    • โมเดลของ React ทำลายแนวคิดของ CSS ไปมากอยู่แล้ว
    • ถ้าไม่ต้องใช้ CSS ก็ยังพอรับได้
  • จากที่ได้ลองใช้ Textual พบว่าจำเป็นต้องใช้ CSS

    • ไม่มีคอมโพเนนต์มาตรฐานที่ดีพอ จึงต้องสร้างเอง
    • ใช้สไตล์ชีตภายนอกแทน Python class
    • ด้วยเหตุผลเหล่านี้ Textual จึงยังไม่เหมาะกับฉัน
    • ใน Python ควรมีวิธีที่ชัดเจนเพียงวิธีเดียว
    • มันเลียนแบบ React ใกล้ชิดเกินไปจนสะท้อนข้อเสียของชุมชน JavaScript
  • TUI นี้ดูสวย แต่ก็นึกไม่ออกว่าจะใช้จริงในสถานการณ์ไหน

    • มักพอใจกับฟังก์ชันขั้นต่ำหรือไม่ก็ข้ามไปใช้ GUI เลย
    • ในลิงก์ YouTube มีการโชว์ตารางที่ไฮไลต์เซลล์ได้
    • ไม่เข้าใจว่าทำไมจึงจำเป็นใน TUI
    • สุดท้ายก็น่าจะต้องใช้ GUI ที่เหมาะสมอยู่ดี
  • kitty มีฟีเจอร์มากกว่า

  • ไม่เข้าใจว่าทำไมวิศวกรซอฟต์แวร์ถึงสนใจ TUI กันมากนัก

    • ชอบโปรแกรมบรรทัดคำสั่งที่ดี แต่ TUI ไม่น่าดึงดูด
  • Monodraw ใช้ได้เฉพาะบน MacOS แต่ก็มีทางเลือกที่ดีบนแพลตฟอร์มอื่น

  • "เขียนทับ ไม่ลบ" เป็นวิธีพัฒนาเกมในอดีต

    • ก่อนยุค DirectX จะเขียนลงเฟรมบัฟเฟอร์โดยตรงและวาดซ้ำเฉพาะส่วนที่เปลี่ยนไป
  • มีวิธีประมาณเวอร์ชัน Unicode โดยตรวจสอบตำแหน่งเคอร์เซอร์ในเทอร์มินัล

    • เทอร์มินัลเรนเดอร์อีโมจิในแบบที่คาดเดาไม่ได้
    • สามารถใช้วิธีนี้ได้ทุกครั้งที่ต้องตัดสินความกว้างของสตริง
    • เคยใช้วิธีนี้เพราะรำคาญกับ wcwidth
  • หลังจากประเมินไลบรารี TUI หลายตัวแล้ว FTXUI ใช้งานง่ายและเชื่อถือได้มากที่สุด

    • FTXUI
    • มีประโยชน์สำหรับการสร้างแดชบอร์ดแบบโต้ตอบที่รองรับคีย์บอร์ดและเมาส์