Latest Posts

Dựng container Incus để chạy GitHub runner

Dựng container Incus để chạy GitHub runner

Từ khi phong trào vibe code ra đời, dịch vụ GitHub thường bị quá tải (do sự khai thác quá mức từ các agent AI), cao điểm là cách đây mấy hôm, quy trình CI/CD ở công ty mình bị tê liệt khi GitHub không thể cấp phát các runner để chạy CI/CD. May sao công ty dùng server bare-metal, còn dư công suất nên mình ngắt ra một phần, dựng các container Incus để chạy runner self-hosted cho GitHub Actions. Bài này sẽ hướng dẫn cách setup. Tại sao là Incus? Incus là chương trình quản lý tạo và chạy container hoặc máy ảo. Mình cần có nhiều GitHub Runner để chạy được nhiều job CI/CD cùng lúc. Giải pháp là chia nhỏ máy thật ra thành nhiều "máy ảo", và cài GitHub Runner trong đó. Tuy nhiên, tạo máy ảo virtual machine như trên QEMU, VirtualBox thì hơi cồng kềnh, một "system container" sẽ gọn nhẹ hơn. Nói về container, có lẽ cái tên Docker được biết đến rộng rãi nhất, nhưng nó không phải là giải pháp container duy nhất, lại càng không phải cái đầu tiên. Mình dùng Incus vì mình cần "system container", là loại container chạy được systemd bên trong để quản lý nhiều dịch vụ mà không cần sửa đổi gì. Nói thêm một chút, loại container được tạo bởi Docker là "application container", hướng đến đóng gói một ứng dụng cụ thể nên nó không thể chạy systemd bên trong và khi dùng nó để chạy các phần mềm database như Postgres, Redis, người ta phải dùng thêm mấy lệnh "của nợ" như sau: ...

How to logout a Linux desktop session from command line

I often go out then remotely access to my home PC to work. Sometimes I use that PC at home, running a desktop session then forget to logout when leaving home. At a consequence, many programs run and waste the CPU, RAM. How to logout that session when I'm not at home? There is a command to do that, loginctl. So, from the coffee shop, I just SSH to my home PC, then run this: loginctl terminate-user $USER ...

Make Helix clipboard-copy work when running in byobu

Make Helix clipboard-copy work when running in byobu

Though I often use [Zellij] as terminal multiplexer when working on remote machine, sometimes I need to switch to [byobu] for its feature of keeping session alive when I disconnect SSH. One inconvenience with byobu is that, when running Helix inside it, the "copy to clipboard" feature (press Space then y) stops working. Only recently did I learn that one of the backends that Helix uses for the clipboard feature is "tmux", the same software under byobu's hood. It means that, when running in byobu, Helix should still be able to do "copy to clipboard", it is just a configuration matter that byobu disable the feature. Here is how to make the "copy" works again, open ~/.config/byobu/profile.tmux file and add these lines: ...

journald-send - Library to help write logs to journald, for Python

journald-send - Library to help write logs to journald, for Python

In the last April, I made [journald-send], to serve as replacement for [systemd-python], for folks who want to write logs to journald, using native protocol. It is a partial replacement, because it only offers the "write" part, not "read". That's enough because most of applications which want to talk with journald just need to "write". I made [journald-send] out of the frustration that systemd-python development seems to be stuck, the last release was on the beginning of 2023, when it is 2026 now, and the compatibility with Python 3.14 is uncertain. Even after I contributed some code to modernize the Python project structure, the core developers still seems to not rush to make a release. I wrote [jounald-send] in Rust, aiming for Python 3.14 free-threaded (No GIL) mode. Because I only need to support "write" operation, I decide not to depend on the C libsystemd, and go further by using Rust pure libraries ([rustix] and [memfd]) to talk with Linux API. I learnt from [tracing-journald] for how to prepare data for journald protocol and which steps to do with the sockets. The difference is that [tracing-journald] is using libc and I use [rustix], [memfd]. After finishing [journald-send], I updated my other libraries [chameleon-log], [structlog-journald] to use journald-send under the hood. [chameleon-log] is for integrating [logbook] and [structlog-journald] is for integrating with [structlog]. ...

Sử dụng model AI LLM host trong nước

Sử dụng model AI LLM host trong nước

Hiện FPT đang khuyến mãi 100$ để sử dụng một số model LLM do hãng host. Nếu bạn đã đăng ký tài khoản, sau đây là cách tích hợp vào agent AI. Mình chỉ dùng Crush nên chỉ có hướng dẫn cho nó: Mở file ~/.config/crush/crush.json và thêm một điểm mục vào trường "providers" như sau: { "$schema": "https://charm.land/crush.json", ...

Gleam - một lựa chọn mới cho lập trình web frontend

Gleam - một lựa chọn mới cho lập trình web frontend

Gần đây mình thử nghiệm phát triển web frontend với ngôn ngữ [Gleam][gleam], framework [Lustre][lustre] và khá ưng ý. Mình đã áp dụng luôn cho hai dự án cá nhân. Lý do khiến mình "đứng núi này trông núi nọ": Viết JavaScript hoài mà không mê nó được. JavaScript có nhiều điểm kỳ cục khiến mình không thấy thoải mái. Thật ra thì mình viết TypeScript không đó chứ. Hệ thống kiểu (type system) của TypeScript nói chung là rất tân tiến, mình nể phục người thiết kế ra nó. Tuy nhiên vì nó vẫn phải bám theo JavaScript nên thừa hưởng những thứ kì cục của JavaScript. Các framework bên frontend sáng tạo mạnh quá nên gây khó khăn trong việc tích hợp TypeScript. Ví dụ, VueJS sáng chế ra ngôn ngữ template của riêng nó, dựa trên HTML, thêm các directive v-if, v-for chứa code nhúng JavaScript. ...