{"version":"https://jsonfeed.org/version/1","title":"QuanWeb","home_page_url":"https://quan.hoabinh.vn","feed_url":"https://quan.hoabinh.vn/feeds.json","next_url":"https://quan.hoabinh.vn/feeds.json?page=2","description":"Blog about programming, culture, history","icon":null,"favicon":null,"author":null,"items":[{"id":"urn:uuid:8243eec2-7e9e-11f1-8000-c7324a07faba","url":"https://quan.hoabinh.vn/post/2026/07/how-to-logout-a-linux-desktop-session-from-command-line","external_url":null,"title":"How to logout a Linux desktop session from command line","content_html":null,"content_text":null,"summary":"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?\nThere is a command to do that, loginctl. So, from the coffee shop, I just SSH to my home PC, then run this:\nloginctl terminate-user $USER\n\n...","date_published":"2026-07-13T11:38:47.272677+00:00","date_modified":"2026-07-13T11:38:47.272677+00:00","author":{"name":"hongquan","url":null},"tags":["Internet of Things","Linux"],"language":"en"},{"id":"urn:uuid:d95e5102-6864-11f1-8000-cb2366b45077","url":"https://quan.hoabinh.vn/post/2026/06/make-helix-clipboard-copy-work-when-running-in-byobu","external_url":null,"title":"Make Helix clipboard-copy work when running in byobu","content_html":null,"content_text":null,"summary":"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.\nOne 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.\nHere is how to make the \"copy\" works again, open ~/.config/byobu/profile.tmux file and add these lines:\n...","date_published":"2026-07-11T06:12:24.022147+00:00","date_modified":"2026-07-11T06:12:24.022147+00:00","author":{"name":"hongquan","url":null},"tags":["Linux"],"language":"en"},{"id":"urn:uuid:c7feef1c-67b9-11f1-8000-6bacf66ecc69","url":"https://quan.hoabinh.vn/post/2026/06/journald-send-library-to-help-write-logs-to-journald-for-python","external_url":null,"title":"journald-send - Library to help write logs to journald, for Python","content_html":null,"content_text":null,"summary":"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.\nIt 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.\nI 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].\nAfter 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].\n...","date_published":"2026-07-12T10:59:54.297402+00:00","date_modified":"2026-07-12T10:59:54.297402+00:00","author":{"name":"hongquan","url":null},"tags":["Rust","Linux","Python"],"language":"en"},{"id":"urn:uuid:f6613eb0-370c-11f1-8000-8b72a5e76952","url":"https://quan.hoabinh.vn/post/2026/04/su-dung-model-ai-llm-host-trong-nuoc","external_url":null,"title":"Sử dụng model AI LLM host trong nước","content_html":null,"content_text":null,"summary":"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ó:\nMở file ~/.config/crush/crush.json và thêm một điểm mục vào trường \"providers\" như sau:\n{\n  \"$schema\": \"https://charm.land/crush.json\",\n\n...","date_published":"2026-04-18T15:10:28.389452+00:00","date_modified":"2026-04-18T15:10:28.389452+00:00","author":{"name":"hongquan","url":null},"tags":["Programming"],"language":"vi"},{"id":"urn:uuid:04ebbf6a-164b-11f1-8000-dbaec97d7a8d","url":"https://quan.hoabinh.vn/post/2026/03/gleam-mot-lua-chon-moi-cho-lap-trinh-web-frontend","external_url":null,"title":"Gleam - một lựa chọn mới cho lập trình web frontend","content_html":null,"content_text":null,"summary":"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.\nLý do khiến mình \"đứng núi này trông núi nọ\":\n\n\nViế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.\n\n\nCá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.\n\n\n...","date_published":"2026-03-18T03:40:20.259372+00:00","date_modified":"2026-03-18T03:40:20.259372+00:00","author":{"name":"hongquan","url":null},"tags":["Web development","Rust"],"language":"vi"},{"id":"urn:uuid:46ef2b12-0fb7-11f1-ad46-272acdd3fe21","url":"https://quan.hoabinh.vn/post/2026/02/thu-vien-python-tra-cuu-phuong-xa-truoc-va-sau-sat-nhap","external_url":null,"title":"Thư viện Python tra cứu phường xã trước và sau sát nhập","content_html":null,"content_text":null,"summary":"Đã nửa năm từ sau sự thay đổi lớn về đơn vị hành chính Tháng 7 - 2025, mọi người vẫn còn khó khăn với việc đối chiếu dữ liệu trước và sau sát nhập. Vì vậy mình đã nâng cấp thư viện [vietnam-provinces][vietnam-provinces] để hỗ trợ việc này.\nTừ phiên bản 2026.2.0, bạn đã có thể truy cập dữ liệu phường xã cũ trong module [legacy][legacy], ví dụ:\n&gt;&gt;&gt; from vietnam_provinces import legacy\n&gt;&gt;&gt; from rich import print\n\n...","date_published":"2026-02-22T06:52:27.927006+00:00","date_modified":"2026-02-22T06:52:27.927006+00:00","author":{"name":"hongquan","url":null},"tags":["Web development","Python"],"language":"vi"},{"id":"urn:uuid:4f146554-ede4-11f0-ad46-f74be124df2b","url":"https://quan.hoabinh.vn/post/2026/01/api-tinh-thanh-co-du-lieu-chinh-thuc-sau-dot-sat-nhap","external_url":null,"title":"API tỉnh thành có dữ liệu chính thức sau đợt sát nhập","content_html":null,"content_text":null,"summary":"Tháng 7/2025, chính quyền có sự thay đổi mạnh về cấu trúc đơn vị hành chính, khi hủy bỏ cấp huyện và sáp nhập tỉnh với tỉnh, xã với xã. Tuy nhiên bảng mã cho các xã sau sát nhập vẫn chưa có chính thức sau nhiều tháng trời, chỉ tồn tại trong văn bản \"Dự thảo\". Cách đây mấy ngày, thì mình phát hiện dữ liệu đó đã được công bố chính thức trên website của Cục Thống kê nên đã cập nhật luôn thư viện vietnam-provinces và API Tỉnh thành Việt Nam.\nĐợt sát nhập tỉnh thành này có vẻ cũng bao gồm cả việc tổ chức lại bộ máy hành chính Trung ương. Lần trước, cơ quan cung cấp dữ liệu bảng mã tỉnh thành là\nTổng cục Thống kê\", hoạt động tại tên miền gso.gov.vn, nhưng nay cơ quan đó là \"Cục Thống kê\", hoạt động tại tên miền nso.gov.vn.\n...","date_published":"2026-01-10T07:53:05.303649+00:00","date_modified":"2026-02-19T20:27:24.527445+00:00","author":{"name":"hongquan","url":null},"tags":[],"language":"vi"},{"id":"urn:uuid:2b0ae5ec-e269-11f0-ad46-b3a4a2aec539","url":"https://quan.hoabinh.vn/post/2025/12/define-ui-comprising-listview-in-blueprint-for-modern-gtk-apps","external_url":null,"title":"Define UI comprising ListView in Blueprint for modern GTK apps","content_html":null,"content_text":null,"summary":"In a previous post, [\"Define UI comprising Dropdown in Blueprint for modern GTK apps\"][dropdown-post], I presented how to use [DropDown][dropdown] in [Blueprint][blueprint]. Now we go with a bit more complex example, with ListView widget.\nThis is the UI where ListView is used, in my [CoBang][cobang] app:\n\nIt shows a list of WiFi network config, for which user will pick to generate QR code. The list is accompanied with a search box, via which user will type part of Wi-Fi name to narrow down the list, to quickly find the needed Wi-Fi network.\n...","date_published":"2025-12-26T17:30:10.838721+00:00","date_modified":"2026-02-19T20:27:24.542378+00:00","author":{"name":"hongquan","url":null},"tags":["Programming","Linux"],"language":"en"},{"id":"urn:uuid:b1f6d576-cdaa-11f0-ad46-b7cbf2f2f250","url":"https://quan.hoabinh.vn/post/2025/11/define-ui-comprising-dropdown-in-blueprint-for-modern-gtk-apps","external_url":null,"title":"Define UI comprising Dropdown in Blueprint for modern GTK apps","content_html":null,"content_text":null,"summary":"GTK is one of the GUI toolkits for building Linux desktop apps, notable for its modern visual look, and with some advanced developer experience features, like Inspector.\nBut one of the things that is still old-fashioned is its support for declarative UI. GTK allows developer to describe the UI separately from application code, but the language is XML which is too verbose, comparing to QT's QML or Slint. Fortunately, there is an new language, Blueprint, to describe UI for GTK app, which brings the same taste of QML, Slint to the table. But Blueprint is still young, not integrated to GTK yet (the files written in Blueprint must be compiled to Gtk.Builder XML) and the documentation is not rich enough.\nThis post shows you how to use Dropdown or other list widgets (like ListView, GridView) in Blueprint. The example use case and code is drawn from my application, CoBang.\nList widgets follow Model-View-Controller pattern, to dislay a list of data with dynamic length. The widget is not used alone, but with other non-display components from GTK library:\n...","date_published":"2025-12-21T16:17:37.368086+00:00","date_modified":"2026-02-19T20:27:24.556042+00:00","author":{"name":"hongquan","url":null},"tags":["Programming","Linux"],"language":"en"},{"id":"urn:uuid:06569dd2-b7a7-11f0-ad46-733daee194c3","url":"https://quan.hoabinh.vn/post/2025/11/fix-commands-hanging-in-incus-container-when-host-os-is-ubuntu","external_url":null,"title":"Fix commands hanging in Incus container when host OS is Ubuntu","content_html":null,"content_text":null,"summary":"I have used Incus-based containers for nearly a year. From Ubuntu 25.04, somethings weird happened, many commands just hang, not return.\nThis post spot the cause: AppArmor blocks sending signals on Ubuntu 25.04 host.\nThere is no true fix yet, there are two workarounds:\n\nDisable apparmor_unconfined_restriction\n\n...","date_published":"2025-12-14T06:51:32.524816+00:00","date_modified":"2026-02-19T20:27:24.514931+00:00","author":{"name":"hongquan","url":null},"tags":["Linux"],"language":"en"}]}