Grey background issue with Helix inside Byobu

I often work on a remote Linux box and like to have Byobu running so that I have tab view and status bar. But somedays in mid 2024, somethings start to break when I open Helix inside Byobu and get this annoying gray background every where:

Grey background

The root issue is that, Byobu runs Tmux with a configuration, and that configuration makes tmux disable some features which is needed to render Helix theme correctly. The key is the TERM environment variable. No matter which terminal emulator we use, after running Byobu, the TERM is set to screen-256color.

...

Triển khai tự động ứng dụng web Python

Gần đây nghe sự cố máy chủ DeepSeek bị lộ dữ liệu do để mở cổng database toang hoác, làm tôi nhớ đến cách triển khai ứng dụng web của mình, trong đó mình đóng cổng database luôn, chỉ cho truy cập qua Unix domain socket (dạng file), và cũng không cần tạo password, không cần nhớ, không cần giấu password. Thủ thuật này đã được nhắc đến trong một bài blog khác bằng tiếng Anh, nay dịch ra cho anh em tham khảo. Bài viết đó nói về một chủ đề rộng hơn là "cách triển khai ứng dụng web Python một cách tự động".

Gần đây tôi thấy một câu hỏi từ một đồng nghiệp Python, làm thế nào để triển khai ứng dụng Django mà không cần phải SSH thủ công vào máy chủ và chạy các lệnh. Phong cách này là "single server deployment". triển khai trên một máy chủ duy nhất, nơi bạn đặt tất cả các thành phần, từ mã ứng dụng, cơ sở dữ liệu, đến các tệp tĩnh, tệp media, trên cùng một máy chủ. Không có Docker tham gia. Với kiểu triển khai này, chúng ta sẽ cần một cách nào đó để cung cấp phiên bản mới của ứng dụng mỗi khi mã mới được đẩy lên nhánh "release" của kho lưu trữ Git.

Tại sao cần tự động hóa? Vì làm đi làm lại những việc này rất nhàm chán:

  • SSH vào máy chủ, cd vào thư mục cài đặt.
...

Thử tài viết code Rust của DeepSeek

Hôm nay mình thử tài DeepSeek về một số ngôn ngữ lập trình mới. Đề bài là: Hãy cho một ví dụ để cho thấy comptime trong ngôn ngữ Zig đem lại trải nghiệm lập trình tốt hơn macro của Rust.

Câu trả lời đầu tiên của DeepSeek bị mình bác bỏ (code trong hình 1), vì nó cho rằng trong Zig có thể dùng comptime để tạo cấu trúc generics trong khi Rust phải dùng macro.

DS-generics

...

Tại sao đôi khi tháng Chạp chỉ có 29 ngày?

Nhân việc sắp tới có bảy năm gần như liên tiếp (chỉ đứt đoạn một năm) mà chỉ có ngày 29 Tết thay vì 30, mình sẽ kể những điểm lý thú trong âm lịch Việt Nam 🇻🇳 (và Trung Quốc).

Âm lịch Việt Nam dựa vào chu kỳ Mặt Trăng để tính tháng, nhưng vẫn dựa vào Mặt Trời để căn chình lại năm. Ví dụ nó quy ước ngày nào chứa điểm sóc thì ngày đó là đầu tháng âm lịch. "Sóc" là thời điểm mà Trái Đất -> Mặt Trăng -> Mặt Trời thẳng hàng, người ở nửa bên đêm của Trái Đất sẽ thấy đó là đêm tối nhất, vì Mặt Trăng ở hẳn sau lưng bên kia rồi, bởi vậy có câu thành ngữ "tối như đêm 30", vì đêm 30 có "sóc", hoặc sát với "sóc" mà.

"Ngày" tính bằng chu kỳ tự quay của Trái Đất, mà tháng thì tính bằng chu kỳ Mặt Trăng và chu kỳ Trái Đất bay quanh Mặt Trời, và các con số này lại không tròn trịa nên chu kỳ gặp lại "sóc" chỉ là lưng chừng 29 - 30 ngày, thành thử có tháng thì 29 ngày, có tháng thì 30.

Vì căn cứ theo Mặt Trời nên có sự nhiễu động của yếu tố "múi giờ" nữa. Ví dụ khi "sóc" xảy ra, nếu ở Việt Nam là 23h30 của ngày hôm trước thì ở Trung Quốc là 00h30 của ngày hôm sau, do múi giờ Trung Quốc đi trước Việt Nam một tiếng. Có nghĩa là đầu tháng âm lịch của hai nước rơi vào hai ngày khác nhau. Hệ quả là sẽ có lúc hai nước ăn Tết vào hai ngày khác nhau, dù xài chung một hệ thống lịch 😃.

...

Khám phá Nushell

Ai dùng Linux thì cũng phải đụng vào shell, với hình thức đơn giản nhất là chạy một chương trình / lệnh nào đó từ Terminal. Khi làm việc với server không có giao diện đồ họa, mọi tác vụ quản lý phải thực hiện qua dòng lệnh thì cũng là lúc ta sử dụng shell ở mức độ nâng cao hơn. Ta sẽ cần viết một lệnh dài để thực hiện nhiều việc theo chuỗi, hoặc viết thành một file script với điếu kiện if else, với vòng lặp để thi hành nhiều tác vụ phức tạp. Tuy nhiên, thật tình mà nói thì các phần mềm shell phổ biến trên Linux như Bash, Zsh tôi đều không thích cú pháp của chúng, nên nếu cần viết lệnh dài, viết ra file script thì tôi sẽ chuyển qua viết script Python. Mọi việc thường là thế cho đến khi tôi bắt gặp Nushell...

Sau khi chạy thử vài dòng lệnh theo bài giới thiệu nhanh, tôi thấy Nu quyến rũ với tư tưởng khá mới mẻ, đó là thiết kế dữ liệu chảy qua các ống dẫn (pipe) là dữ liệu có cấu trúc, có các field, chứ không đơn giản là văn bản text như các shell truyền thống. Để hình dung được ý tưởng này, xét ví dụ sau, là chạy lệnh ls trong Nu:

❯ ls
╭───┬────────────────┬─────────┬─────────┬────────────────╮
...

How to automatically deploy Python web application

Recently I saw a question from a Python fellow, how to deploy Django application without manually SSH to server and run commands. This style is single-server deployment, where you put all components, from the application code, database, to static, media files, in the same server. No Docker involves. With this deployment strategy, we will need some way to deliver new version of our app everytime new code is pushed to the "release" branch of Git repository. Here is a guide.

Why we need automation? Because it is boring to do these things by hand again and again:

  • SSH to the server, cd to the installation folder.
  • Run git pull.
  • Run commands to stop your services.
...

So sánh hệ thống kiểu của Python và TypeScript

Với hơn một nửa công việc hàng ngày là làm web, Python và JavaScript là hai ngôn ngữ mình dùng nhiều. Đây vốn là hai ngôn ngữ "kiểu động" (dynamic type), nhưng mình vẫn tận dụng hệ thống kiểu (type system) của chúng để viết như với một ngôn ngữ "kiểu tĩnh" (static type). Sau một thời gian thì mình rút ra được một số kinh nghiệm để làm việc với hai hệ này.

Thật ra, ngôn ngữ JavaScript không có ký hiệu kiểu, nên nói chính xác hơn là mình đang dùng TypeScript chứ không phải JavaScript. Trước hết, người đã làm quen với JavaScript mà được giới thiệu về TypeScript thì sẽ bật lên một câu hỏi, tại sao chúng là ngôn ngữ dynamic type thì lại mất công viết như static type làm gì. Đó là vì những ích lợi sau:

  • Giúp các công cụ kiểm tra (static analysis) như MyPy, tsc hiểu được code mình, để phát hiện được bug tiềm tàng trong những trường hợp ngách mà mình chưa test.
  • Giúp các trình soạn thảo (code editor, IDE) hiểu được biến đang có kiểu gì, để đưa ra gợi ý autocomplete đúng hơn.
...


Prevent Firefox from being installed as snap package

Though being a long-time Ubuntu user, I still prefer softwares distributed as deb packages to snap. Every time upgrading to new Ubuntu version, I have to repeat the task of removing Firefox snap and install Firefox from deb.

When installing Firefox from APT repositories (like PPA or Mozilla APT repository), we have to set some configuration to prevent Ubuntu from installing Firefox snap again.

This snippet is introduced on Mozilla help page to do that:

...

Món ăn kèm của đồng bào miền núi

Trên hành trình đi bụi qua các địa phương miền núi, ghé quán cơm dọc đường, mình thấy một điểm thú vị là các món ăn kèm, nó thể hiện sự đặc sắc vùng miền thấy rõ.

Ví dụ, trên bàn ăn của khắp vùng Tây Nguyên, từ Đắk Nông tới Kon Tum, luôn luôn có chén cà pháo ngâm mắm, miễn phí. Quán cơm dưới xuôi thì thỉnh thoảng mới có cà pháo mắm tôm, nhưng muốn ăn thì phải kêu, và tính tiền thêm. Còn quán trên này thì lúc bưng cơm ra, chủ quán sẽ tự động cho thêm chén cà. Cà ở đây thường được cắt nhỏ, ngâm với loại mắm gì đó mà mình không nhận ra. Mỗi tỉnh thì cách cắt miếng cà và màu mắm có khác nhau một chút. Ăn xong vẫn còn thòm thèm thì cứ việc kêu thêm, không tính tiền. À, tuy cùng là Tây Nguyên, nhưng ở Lâm Đồng thì mình lại không thấy món này trên bàn.

Cà Tây Nguyên

Người Tây Nguyên mê cà pháo thì người miền núi phía Bắc mê măng ngâm ớt. Tây Bắc mình chưa đi nên không rõ, mới đi phía Đông Bắc là Hà Giang và Cao Bằng thôi, thì vô quán nào cũng thấy để sẵn keo măng. Ai ăn bao nhiêu lấy bấy nhiêu, cũng không tính tiền, cũng như Tây Nguyên.

...