Movwin: Khung TUI cá nhân viết bằng Python và nỗi lo về việc khai thác dữ liệu AI

Công nghệ30 tháng 5, 2026·7 phút đọc

Tác giả đã phát triển một khung TUI (Text User Interface) riêng tên là Movwin vì bất mãn với sự thay đổi liên tục của các thư viện hiện đại và lo ngại về việc mã nguồn bị các công ty AI sử dụng trái phép. Dựa trên ncurses và Python, Movwin tập trung vào hiệu suất, hỗ trợ Unicode và mang lại cảm giác hoài niệm của các giao diện DOS cũ.

Movwin: Khung TUI cá nhân viết bằng Python và nỗi lo về việc khai thác dữ liệu AI

Viết các chương trình có giao diện đồ họa (GUI) hay giao diện văn bản (TUI) trong nhiều năm qua luôn mang lại cho tôi một cảm giác chưa bao giờ trọn vẹn. Các thư viện đến rồi đi, xu hướng thay đổi liên tục. Bạn liên tục phải chạy theo các quyết định mới từ các dự án nguồn mở (upstream) và điều chỉnh mã nguồn của mình. Đôi khi bạn hoàn toàn không đồng ý với những quyết định đó và rồi lại phải tìm kiếm một khung công tác (framework) mới. Điều này thực sự mệt mỏi, đặc biệt khi tôi thường duy trì các dự án của mình trong 5, 10 năm hoặc lâu hơn, và rất nhiều thứ có thể thay đổi trong khoảng thời gian đó.

Chính vì vậy, sau sự kiện Advent of Code vào cuối tháng 12 năm 2025, tôi quyết định bắt đầu tự xây dựng khung TUI của riêng mình. Đây không phải là một quyết định dễ dàng vì tôi biết rằng sẽ là rất nhiều công việc. Tôi đã tìm kiếm các giải pháp thay thế nhưng không tìm thấy cái nào ưng ý hoặc đủ nhanh. Hiệu suất dường như đã giảm sút nghiêm trọng gần đây, với một số khung công tác tốn tới hai giây chỉ để khởi động.

Bài viết này chỉ là một cái nhìn tổng quan về trạng thái hiện tại của movwin, vì tôi đã quyết định sẽ không công bố mã nguồn này vào lúc này. Tình hình hiện tại không quá khả quan: Mọi thứ tôi công bố đều sẽ bị các công ty "AI" thu thập và sau đó họ bán lại, hoàn toàn phớt lờ bất kỳ giấy phép nào gắn liền với mã nguồn đó. Tôi không chấp nhận điều này.

Giao diện Movwin với chủ đề màu amberGiao diện Movwin với chủ đề màu amber

Movwin là một thư viện Python. Mặc dù tôi không còn là người hâm mộ lớn nhất của Python, nhưng nó có những ưu điểm riêng, chủ yếu là thư viện chuẩn khổng lồ cho phép tôi dễ dàng thực hiện nhiều việc.

Movwin (viết tắt của "movq's windows and widgets") hoạt động dựa trên nền tảng ncurses. ncurses đảm nhận phần việc nặng nhọc về khả năng tương thích của terminal. Tuy nhiên, movwin không sử dụng các cửa sổ con (subwindows) hay pads của ncurses. Thay vào đó, ncurses đóng vai trò như một loại framebuffer (có trí tuệ) mà tôi có thể vẽ lên, đồng thời nó đóng vai trò là nguồn cung cấp dữ liệu đầu vào từ bàn phím và chuột.

Một mục tiêu lớn khác là hỗ trợ Unicode ở mức "chấp nhận được". Rất khó để movwin có thể hỗ trợ các văn viết từ phải sang trái, nhưng tôi không muốn đặt một biểu tượng cảm xúc (emoji) vào đâu đó và thấy toàn bộ bố cục bị vỡ vụn. Nói cách khác, movwin phải biết bao nhiêu ô trong terminal một chuỗi Unicode sẽ (có khả năng) chiếm giữ. Vấn đề lớn ở đây là điều này phụ thuộc vào loại terminal, nên nó không thể bao giờ hoàn hảo.

Hiện tại, movwin chỉ có một phụ thuộc (ngoài bản thân Python 3.14): thư viện wcwidth và hàm wcswidth() của nó. Thư viện này được sử dụng để đo kích thước "hiển thị" của văn bản: ví dụ, "♀️" chiếm độ rộng hai ô.

Cảm hứng từ DOS và Hiệu suất

Từ rất sớm, movwin đã có khái niệm về "Cửa sổ" (Window) và "Trình quản lý cửa sổ" (Window Manager). Những gì tôi có trong tâm trí khi tạo ra toàn bộ thứ này là các giao diện TUI cũ của DOS:

Ứng dụng tracktivity chạy trên MovwinỨng dụng tracktivity chạy trên Movwin

Sẽ rất tuyệt nếu tái tạo hoàn toàn trải nghiệm đó, và ở một mức độ nào đó tôi đã làm được, nhưng hỗ trợ chuột trong các terminal của UNIX không quá tuyệt vời. Trong các bài kiểm tra của tôi, không có terminal nào báo cáo sự kiện di chuyển chuột theo mặc định (chỉ có "nhấn/thả chuột") và tôi phải chỉnh sửa các tệp terminfo. Tệ hơn nữa, trong các cửa sổ terminal lớn, một số sự kiện chuột không được đăng ký altogether. Do đó, hỗ trợ chuột trong movwin hiện tại khá hạn chế. Có lẽ tôi sẽ loại bỏ nó hoàn toàn, vì thực tế việc điều khiển bằng bàn phím vẫn là một điều tốt.

Một mục tiêu lớn khác là hiệu suất "chấp nhận được", nghĩa là: "Khoảng 200-300 ms thời gian khởi động trên chiếc Intel NUC nhỏ bé với CPU Celeron 10 năm tuổi của tôi là ổn, nhưng không nên nhiều hơn thế." Thời gian khởi động thực sự là một vấn đề với Python, vì quá trình import cực kỳ chậm. Tôi đã phải hy sinh một số thứ ở đây, ví dụ như không sử dụng dataclasses.

Các ứng dụng thực tế

Điều khởi động cho toàn bộ dự án này là một chương trình nhỏ gọi là tracktivity. Tôi sử dụng nó để theo dõi các hoạt động và sự kiện, như tiêu thụ caffeine hay các sự kiện thời tiết. Nó hoạt động trên các tệp CSV. tracktivity xây dựng một biểu mẫu UI dựa trên tệp đó.

Di chuyển và thay đổi kích thước cửa sổDi chuyển và thay đổi kích thước cửa sổ

Movwin cũng được sử dụng trong bine, một trình chỉnh sửa hex cơ bản. Điều tôi thực sự muốn là một trình chỉnh sửa hex đơn giản với hiệu suất tốt nhưng cũng có bảng thông tin nhỏ ở dưới cùng. Bine sử dụng mmap() rất nhiều và việc viết bằng Python không làm hại đến hiệu suất. Như bạn có thể thấy trong video, tìm kiếm một chuỗi ASCII trong tệp 2 GB chỉ mất khoảng một giây. Điều đó hoàn toàn đủ tốt đối với tôi.

Gần đây, tôi cũng đã tạo một chương trình theo dõi thời gian rất đơn giản. Nó có nút bắt đầu/dừng và hiển thị danh sách các "đặt chỗ" đơn giản. Điều bạn không thấy trong ảnh chụp màn hình là công cụ này cũng hiển thị tổng thời gian này trên một màn hình hiển thị 7 đoạn nhỏ được kết nối với Arduino.

Hệ thống Menu và Chủ đề

Chủ đề "màu hổ phách" (amber) khơi dậy nhiều sự hoài niệm đối với tôi vì nó nhắc tôi nhớ về các chương trình DOS trên màn hình CRT màu hổ phách đầu tiên của mình. Nếu muốn, bạn có thể đưa định nghĩa màu vào ~/.config/movwin/colors.json và tự tạo chủ đề của riêng mình.

Giao diện dạng bảng màu amber hoài cổGiao diện dạng bảng màu amber hoài cổ

Tôi đã bắt đầu đánh giá cao khái niệm Menu trong vài tuần qua. Chúng cung cấp khả năng khám phá các chức năng một cách dễ dàng. Không cần đọc sách hướng dẫn. Chúng được tổ chức theo danh mục. Chúng được điều khiển bằng bàn phím nhờ các "phím tắt" (accelerators). Và khi một mục menu có phím tắt trực tiếp như Ctrl+U, nó sẽ hiển thị ngay tại đó trong menu.

Tôi đặc biệt thích cách các phím nóng hoạt động trong movwin: khi bạn định nghĩa cấu trúc menu, bạn có thể chỉ định phím nóng cho một mục menu ngay tại đó. Tôi yêu điều này vì nó tự tài liệu hóa (self-documenting). Không cần trình xử lý F3 đặc biệt và không cần đưa F3 vào trang trợ giúp nào, vì menu đã cho bạn biết phím đó làm gì.

Kết luận

Trước hết, tôi khá hài lòng với trạng thái hiện tại. Có một vài việc cần làm (TODOs) trong mã nguồn, nhưng nó đã có thể sử dụng được khá tốt. Cảm giác thật tuyệt khi có một khung công tác làm đúng những gì tôi cần và muốn, và nó sẽ không thay đổi bất ngờ trong bản phát hành tiếp theo. ncurses cực kỳ ổn định, wcwidth là thứ tôi có thể fork nếu cần thiết. Bản thân Python cũng tương đối ổn định và tôi nghĩ họ đã học được từ bài học khó khăn trong quá trình chuyển đổi từ 2 sang 3 và sẽ không làm điều đó nữa trong tương lai gần? Không chắc. Dù sao, movwin cảm giác như một thứ có thể vẫn hoạt động tốt trong 5, 10, 15 năm tới — mà không có quá nhiều rắc rối.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗