3 điểm bởi GN⁺ 2024-08-12 | 1 bình luận | Chia sẻ qua WhatsApp

7 điều học được khi xây dựng một framework TUI hiện đại

Terminal rất nhanh

  • Trình giả lập terminal hiện đại là phần mềm cực kỳ tinh vi
  • Có thể dùng kết xuất tăng tốc bằng phần cứng để giảm hiện tượng nhấp nháy màn hình
  • Ba mẹo để giảm nhấp nháy:
    • Đừng xóa màn hình mà hãy ghi đè lên
    • Ghi ra đầu ra chuẩn trong một lần duy nhất
    • Sử dụng giao thức Synchronized Output
  • Textual dùng mặc định 60fps để mang lại hoạt ảnh mượt mà

DictViews thật đáng ngạc nhiên

  • Các phương thức keys()items() của dict trong Python trả về KeysViewItemsView
  • Có thể dễ dàng tìm các mục đã thay đổi bằng cách dùng phép đối xứng sai khác của đối tượng ItemsView
  • Trong Textual, điều này được dùng để tối ưu cập nhật khi các thuộc tính CSS thay đổi

lru_cache rất nhanh

  • Decorator @lru_cache của mô-đun functools dùng để cache giá trị trả về của hàm
  • Trong Textual, việc dùng @lru_cache cho các hàm nhỏ được gọi thường xuyên giúp cải thiện hiệu năng
  • Cần kiểm tra thông tin cache (cache_info()) để xác nhận việc cache có hiệu quả hay không

Đối tượng bất biến là tốt nhất

  • Có thể tận dụng lợi ích của đối tượng bất biến bằng cách dùng tuple, NamedTuple hoặc dataclass đông cứng trong Python
  • Dùng đối tượng bất biến giúp viết mã không có tác dụng phụ, từ đó dễ kiểm thử và cache hơn

Unicode art rất hữu ích

  • Các sơ đồ dùng ký tự khung Unicode rất hữu ích cho tài liệu hóa
  • Khi dùng cùng docstring được viết tốt, nó càng phát huy hiệu quả

Phân số là chính xác

  • Mô-đun fractions của Python giúp tránh lỗi số thực dấu phẩy động
  • Trong Textual, khi chia màn hình theo tỷ lệ, người ta dùng phân số để triển khai bố cục chính xác

Emoji thật khủng khiếp

  • Hỗ trợ emoji trong terminal rất khó đoán và phức tạp
  • Dù dùng cơ sở dữ liệu Unicode để kiểm tra độ rộng của emoji, các emoji mới vẫn có thể tạo ra kết quả khó lường
  • Emoji đa codepoint còn gây ra vấn đề lớn hơn

Tóm tắt của GN⁺

  • Bài viết này cung cấp các mẹo và thủ thuật hữu ích khi phát triển ứng dụng terminal bằng Python
  • Chia sẻ những lời khuyên thực tiễn rút ra từ kinh nghiệm phát triển framework Textual
  • Giải thích cách xử lý các vấn đề phức tạp như emoji để giúp ích cho các lập trình viên
  • Các dự án có tính năng tương tự gồm có urwid và prompt_toolkit

1 bình luận

 
GN⁺ 2024-08-12
Ý kiến trên Hacker News
  • Nhà phát triển TUI cuối cùng sẽ phải coi việc xử lý Unicode, ký tự quốc tế và emoji như một dự án riêng

    • Gặp cùng vấn đề trong các gói rivo/tview và rivo/uniseg
    • Mỗi người bảo trì thư viện TUI đều tự phát triển một cách giải quyết riêng
    • Độ rộng ký tự không được chuẩn hóa nên terminal rất phức tạp
    • OP chỉ hỗ trợ Unicode 9 (phiên bản Unicode hiện tại là 15.1)
    • Cuối cùng người dùng sẽ phàn nàn rằng một số emoji hoặc ký tự quốc tế không được render đúng
  • Không thích việc Textual cố bắt chước React

    • React là framework phổ biến, nhưng không phải cách hay để xây dựng giao diện người dùng
    • Thiết kế phản hồi cơ bản là phương pháp đã được biết đến rộng rãi
    • Việc dùng CSS có vẻ là quá tay
    • Mô hình React đã phá vỡ khá nhiều khái niệm của CSS
    • Nếu không cần dùng CSS thì còn chấp nhận được
  • Sau khi thử dùng Textual, hóa ra vẫn phải dùng CSS

    • Không có các component chuẩn đủ tốt nên phải tự làm
    • Dùng stylesheet bên ngoài thay vì class Python
    • Vì những lý do đó, Textual vẫn chưa phù hợp với tôi
    • Trong Python nên có một cách rõ ràng duy nhất để làm việc
    • Nó bắt chước React quá sát nên phản ánh cả những nhược điểm của cộng đồng JavaScript
  • TUI này đẹp, nhưng tôi không nghĩ ra tình huống thực tế nào để dùng nó

    • Hoặc là hài lòng với tính năng tối thiểu, hoặc dùng GUI ngay từ đầu
    • Trong link YouTube có trình diễn bảng có thể tô sáng ô
    • Không hiểu vì sao điều đó lại cần trong TUI
    • Cuối cùng rồi cũng sẽ cần một GUI đúng nghĩa
  • kitty cung cấp nhiều tính năng hơn

  • Không hiểu vì sao các kỹ sư phần mềm lại quan tâm đến TUI đến vậy

    • Tôi thích các chương trình dòng lệnh tốt, nhưng TUI thì không hấp dẫn
  • Monodraw chỉ dành cho MacOS, nhưng cũng có lựa chọn thay thế tốt trên nền tảng khác

  • "Ghi đè, không xóa" là cách làm game thời xưa

    • Trước thời DirectX, người ta ghi trực tiếp vào framebuffer và chỉ vẽ lại những phần đã thay đổi
  • Có cách ước lượng phiên bản Unicode bằng cách kiểm tra vị trí con trỏ trong terminal

    • Terminal render emoji theo cách khó đoán trước
    • Có thể dùng cách này mỗi khi cần xác định độ rộng chuỗi
    • Từng dùng cách này vì quá bực với wcwidth
  • Sau khi đánh giá nhiều thư viện TUI, FTXUI là thứ dễ dùng và đáng tin cậy nhất

    • FTXUI
    • Hữu ích để tạo dashboard tương tác hỗ trợ bàn phím và chuột