curl olragon.com: dạo vườn ngay trong terminal
🌱 mầmgieo #terminal#curl#tui#web#toi-gian
Viết cho Ai sống nửa ngày trong terminal, và ai từng chột dạ trước dòng curl | bash.
Mình mê trò curl wttr.in từ lâu. Gõ một dòng là nguyên bảng dự báo thời tiết hiện ra ngay trong terminal: chẳng trình duyệt, chẳng quảng cáo, chẳng banner cookie nào. Vậy nên lúc dựng mảnh vườn này, mình cứ ấp ủ chuyện trang của mình cũng đọc y vậy trong terminal.
Thú thật là làm vì vui nhiều hơn vì có ai cần. Mọi con số dưới đây đều đo trên trang thật, lúc viết bài.
English: curl olragon.com: walk the garden from your terminal.
Khung dưới đây chẳng phải ảnh chụp. Mỗi lần bạn mở trang, nó gọi đúng lệnh curl đó tới server, rồi tô lại từng mã màu ANSI nhận về: tiêu đề đậm, chữ mờ, link bấm được, khối code, và hình vẽ bằng ký tự khối. Bấm tab trên đầu khung để đổi trang.
Mở terminal rồi gõ: curl olragon.com/garden/adbdav-vi
Gõ gì để vào
curl olragon.com # trang chủ
curl olragon.com/garden # các ghi chú
curl olragon.com/garden/adbdav-vi # một ghi chú
curl -fsSL olragon.com/sh | bash # toàn màn hình
Dòng cuối mở hẳn một TUI: thanh menu cố định ở trên, cuộn bằng phím hay con lăn chuột, bấm vào ghi chú là mở, gõ l là đổi tiếng. Trên Windows thì iwr -useb olragon.com/sh | iex.
Muốn chữ trơn thì thêm ?nocolor, bỏ hình thì ?noimg, còn ?w=60 là ngắt dòng ở cột 60. Đang ở trình duyệt mà tò mò thì thêm ?term vào cuối địa chỉ nào cũng xem trước bản chữ.
Một địa chỉ, hai cách trả lời
Chẳng có tên miền phụ hay trang riêng nào cho terminal. Mỗi lượt hỏi, server nhìn User-Agent: thấy curl, wget, httpie hay PowerShell thì trả text/plain kèm mã màu, còn lại thì trả HTML như thường. Nhờ vậy link nào bạn chép từ trình duyệt cũng dán thẳng vào terminal.
| Trang | curl nhận | Trình duyệt nhận |
|---|---|---|
| Trang chủ | 25 KB | 8.7 KB |
| Ghi chú adbdav | 51 KB, hay 13 KB với ?noimg | 18 KB |
Bản terminal nặng hơn HTML, và gần hết phần nặng là hình. Mỗi ô ký tự trong hình mang theo hai mã màu 24-bit, một cho nét, một cho nền. Bỏ hình đi thì bản terminal còn nhẹ hơn cả HTML, và mỗi lượt mất chừng 40 mili-giây từ máy mình.
Bản vẽ thứ hai lệch ngay trong ngày
Bản đầu tiên mình viết hai bộ vẽ: một cho HTML, một cho terminal. Chưa hết ngày, hai bên đã kể hai chuyện khác nhau. Sửa một câu trên web thì quên sửa bên terminal, thêm một trang thì trang đó chỉ có một nửa.
Nên mình bỏ bộ vẽ thứ hai, cho terminal đọc chính bản HTML trình duyệt nhận. Nó lấy phần <main>, đổi từng thẻ sang chữ: tiêu đề tô đậm, đoạn văn ngắt theo bề ngang, bảng, trích dẫn, khối code. Link thành link thật, bấm là mở (OSC 8, terminal mới hầu như đều hiểu). Cả bộ đổi chừng 260 dòng TypeScript, chẳng phụ thuộc gì, vì HTML trang này do chính mình sinh ra nên gọn gàng, khỏi cần parser thật.
Từ đó tới giờ, viết một ghi chú là có luôn bản terminal. Bộ lọc theo tag thêm vào cuối tháng 10 cũng vậy: chip lọc chỉ là link thường, nên curl lọc luôn mà mình chẳng phải viết thêm dòng nào.
Vẽ hình bằng ký tự
Hình minh họa của mảnh vườn là SVG, mà terminal thì chỉ hiểu chữ. Server dùng resvg vẽ SVG ra PNG, rồi chafa đổi PNG thành ký tự khối: mỗi ô terminal chia sáu phần, tô hai màu, nên nét mịn hơn hẳn kiểu nửa ô quen thuộc. Hai công cụ nhỏ xíu, chỉ chạy lúc có người hỏi, vẽ xong thì giữ trong bộ nhớ cho lần sau.
Dưới mỗi hình là nguyên địa chỉ tấm gốc, chẳng cắt bớt chữ nào. Bấm vào là mở ảnh thật. Mình cố tình để nó dài, vì một địa chỉ đọc không trọn thì cũng chẳng gõ lại trên máy khác được.
curl | bash có đáng tin không
Bạn ngại là đúng. curl … | bash nghĩa là chạy code người khác trên máy mình, và mình cũng chẳng muốn ai tin mù quáng. Nên mình làm ba việc:
Script đọc trước được. curl olragon.com/sh | less ra đúng file mà bash sẽ chạy, chừng 270 dòng bash thường, chỉ dùng curl, stty, printf.
Script kiểm tra được. curl olragon.com/sh | shasum -a 256 phải khớp với curl olragon.com/sh.sha256. Lúc viết bài, cả hai đều ra 13f85856…57dc5d.
Tải dở thì chẳng chạy gì. Toàn bộ script nằm gọn trong một hàm run(), và chỉ dòng cuối cùng mới gọi nó. Mạng rớt giữa chừng thì bash nhận một hàm chưa đóng, chẳng lệnh nào chạy.
Script chỉ tải trang từ olragon.com rồi vẽ ra, không ghi file, không gửi gì đi.
Mấy lần terminal chơi khăm mình
curl | bash thì bàn phím chẳng nằm ở stdin. Stdin lúc đó là đường ống, nên script đọc phím bấm từ stdin là đọc nhầm phần còn lại của chính nó. Phải mở thẳng /dev/tty mà đọc. Chạy trong CI không có /dev/tty thì script in một trang rồi thoát.
Phím Enter biến mất. Terminal mặc định đổi CR thành NL, mà read lại coi NL là hết dòng, nên Enter về tới script thành chuỗi rỗng. Tắt icrnl đi thì Enter mới là Enter.
Thanh menu bị đẩy trôi. Trên terminal hẹp, một dòng dài tự xuống hàng, màn hình cuộn lên một nấc, vậy là thanh menu ở dòng đầu bay mất. Giờ script tắt tự xuống hàng, còn server thì ngắt dòng đúng bề ngang terminal của bạn.
Windows PowerShell 5.1 in ra nguyên văn e[32m. Cách viết ký tự escape bằng ` e ` chỉ có từ PowerShell 7. Đổi sang [char]27` thì bản nào cũng chạy.
Viết bài này lòi ra ba con bug
Đo số liệu cho bài này, mình đụng ngay ba lỗi nằm im từ trước. Cả ba giờ đã sửa xong.
Dòng thông tin dưới tiêu đề dính chùm. Trong curl, mọi ghi chú hiện buddingupdated 2026-10-18#macos, rồi mỗi tag kéo theo nguyên một đường dẫn. Chữ dính nhau thì có từ đầu, còn đường dẫn sau mỗi tag tới cùng bộ lọc tag. Chẳng ai báo, chắc vì chẳng ai đọc kỹ tới vậy.
chafa mới đổi ý. Lên bản 1.18.3, nó lẳng lặng vẽ hình bằng chữ cái ASCII thay vì ký tự khối. Giờ server nói rõ bộ ký tự muốn dùng, chẳng để nó tự đoán nữa.
?nocolor vẫn để màu trong hình. Chữ thì trơn, mà hình vẫn mang nguyên mã màu. Giờ hình trong chế độ này vẽ bằng ký tự đơn sắc, chẳng còn mã màu nào.
Bài học cũ mà lần nào cũng mới: viết về thứ mình làm ra là cách test kỹ nhất.
Chưa làm được gì
- Hình cần terminal hiểu màu 24-bit. Terminal cũ thì hình ra lem nhem.
- Bản PowerShell chỉ dùng bàn phím, chưa bấm chuột được. Mình mới thử trên PowerShell 7 ở Mac, chưa đụng tới Windows PowerShell 5.1 thật.
- Chưa có ô tìm kiếm. Mấy ghi chú thì chưa cần, vườn lớn dần thì sẽ cần.
Chỗ mình còn chưa biết là có ai thật sự dạo vườn kiểu này không. Mảnh vườn cố tình không cài cắm theo dõi, đo lường, phân tích, nên mình chẳng đếm được. Nếu bạn vừa gõ curl olragon.com và đọc tới đây, kể mình nghe với nha.
Gửi Ba rồng một lá thư
Đọc xong muốn nói gì thì viết cho mình nha. Thư chỉ tới tay mình, chẳng tự hiện lên trang. Lá nào hay mà bạn cho phép, mình chép lại dưới bài, không kèm tên bạn.
Từ terminal cũng gửi được: curl -d 'msg=…' olragon.com/garden/curl-garden-vi/letter