Hexa's Blog

Bài tập McKenzie

15/09/2025 @ Saigon Health

Bài viết này là repost vì thông tin này quá đỗi quan trọng với tôi, một người đang bị đau lưng và nghỉ việc vì đau lưng. Cảm ơn chân thành đến:

  • Giáo sư, bác sĩ Mc Kenzie
  • CN. Nguyễn Thị Sâm
  • CN. Trần Thị Giai
  • CN. Phạm Văn Khôi.

I. Lời mở đầu

Các bài tập McKenzie được hình thành khi Robin McKenzie nhận thấy một số bệnh nhân của ông giảm đau rõ rệt khi được đặt trong tư thế duỗi lưng (Mc Kenzie, 1981).

Mục đích: Mục đích của bài tập McKenzie là trung tâm hóa (centralization) vị trí đau ở vùng lưng. Nếu bệnh nhân đau từ thắt lưng, lan đến mông, đùi sau và bắp chân phải, thì mục tiêu là làm cho vị trí đau khu trú đến trung tâm, ban đầu là lưng, mông, đùi sau… và cuối cùng chỉ còn lại đau khu trú ở vùng thắt lưng.

Đối tượng: Chương trình tập McKenzie chủ yếu dụa trên các tư thế duỗi nhằm mục đích giảm đau cấp tính và điều chỉnh tình trạng thoát vị đĩa đệm, dự phòng tái phát ở các bệnh nhân thoát vị địa trung tâm hoặc sau-bên.

II. Các bài tập

Bài tập 1: Nằm sấp thư giãn

Người bệnh nằm sấp, hai tay đặt dọc thân mình, đầu quay sang một bên, hít thở sâu vài lần sau đó nằm thư giãn, duy trì tư thế này trong 5 đến 10 phút.

Hình 1. Nằm sấp thư giãn
Hình 1. Nằm sấp thư giãn

Thực hiện 3-6 lần trong ngày, cũng có thể nằm tư thế này khi nghỉ ngơi.

Bài tập 2: Nằm sấp và duỗi thân ở tư thế chống trên hai khuỷu tay

Bắt đầu từ tư thế nằm như bài tập 1, đặt 2 khuỷu tay bên dưới vai, rồi duỗi thân và chống trên 2 khuỷu tay, hít thở sâu vài lần để cho các cơ vùng thắt lưng thư giãn hoàn toàn. Duy trì tư thế này trong 5 đến 10 phút hoặc lâu hơn nếu cảm thấy dễ chịu. Mỗi ngày tập 3-6 lần.

Hình 2. Nằm sấp và duỗi thân ở tư thế chống trên hai khuỷu tay
Hình 2. Nằm sấp và duỗi thân ở tư thế chống trên hai khuỷu tay

Bài tập 3: Duỗi thân ở tư thế nằm sấp chống trên hai bàn tay

Bắt đầu từ tư thế nằm sấp như bài tập 1, đặt 2 bàn tay dưới vai, dần dần dùng lực 2 tay để nâng thân mình lên trong giới hạn đau chịu được tạo nên một sự võng thắt lưng, chú ý giữ cho khung chậu và cẳng chân áp sát trên sàn tập, duy trì tư thế này trong 5 đến 10 phút (có thể dài hơn nếu bệnh nhân thấy dễ chịu, đau giảm, triệu chứng khu trú lại).

Lúc đầu cần thực hiện dần dần, sau đó nâng dần mức độ ưỡn thân mình về phía sau đến mức có thể được.

Mỗi lần tập, thực hiện bài tập này 10 lần, tập 3-6 lần trong ngày.

Hình 3. Duỗi thân ở tư thế nằm sấp chống trên hai bàn tay
Hình 3. Duỗi thân ở tư thế nằm sấp chống trên hai bàn tay

Bài tập 4: Duỗi lưng ở tư thế đứng

Đứng thẳng với 2 chân dạng nhẹ, đặt bàn tay chống hông với các ngón tay hướng ra phía sau. Ưỡn thân về phía sau càng nhiều càng tốt, chú ý giữ hai khớp gối thẳng khi làm động tác, giữ tư thế này trong 3 đến 10 phút trở lại tư thế ban đầu.

Cứ sau mỗi lần thực hiện thì cố gắng ưỡn người ra sau thêm một ít nữa để đạt dần đến mức tối đa.

Hình 4. Duỗi lưng ở tư thế đứng
Hình 4. Duỗi lưng ở tư thế đứng

Bài tập 5: Gập 2 chân ở tư thế nằm

Bệnh nhân nằm ngửa với hai đầu gối gập, hai bàn chân đặt sát trên sàn nhà hay mặt giường. Tiến hành gập 2 gối về phía ngực, dùng hai bàn tay ôm hai đầu gối và kéo đầu gối về phía ngực càng nhiều càng tốt. Sau mỗi động tác, cố gắng tăng dần mức độ gập đến khi gối chạm đến ngực.

Trong khi làm chú ý không nâng đầu và không gập đầu vào thân, đồng thời không duỗi thẳng hai chân khi hạ thấp chân xuống khi làm động tác. Bài tập này nhằm mục đích điều trị sự co cứng cơ ở vùng thắt lưng và sự giảm khả năng gập cột sống. Nó nên được thực hiện thận trọng.

Trong một lần tập, thực hiện từ 5 hoặc 6 động tác này, mỗi ngày tập 3 đến 4 lần. Bài tập này làm giảm sự ưỡn cột sống do đó sau khi làm bài tập này thì phải thực hiện ngay bài tập 3 ( để lấy lại độ ưỡn thắt lưng).

Hình 5. Gập 2 chân ở tư thế nằm
Hình 5. Gập 2 chân ở tư thế nằm

Bài tập 6: Gập lưng ở tư thế ngồi

Ngồi trên ghế với 2 chân dạng, 2 bàn tay đặt trên 2 đầu gối, gập thân về phía trước, 2 tay duỗi thẳng đến khi chạm nền nhà thì quay về tư thế ban đầu. Thực hiện bài này, cứ sau mỗi lần lặp lại thì cố gắng gập thân thêm chút nữa đến khi đạt được gập tối đa.

Bài tập này có thể thực hiện hiệu quả hơn bằng cách ngồi gập thân về trước, dùng 2 bàn tay nắm lấy 2 cổ chân, kéo thân mình gập nhiều hơn.

Bài tập này nên áp dụng sau khi tập bài tập 5 một tuần mà hiệu quả, không gây đau. Lúc khởi đầu, mỗi lần tập chỉ nên tập 5 hoặc 6 lần, mỗi ngày tập 4 lần. Chú ý sau khi tập bài này phải thực hiện ngay bài tập 3.

Hình 6. Gập lưng ở tư thế ngồi
Hình 6. Gập lưng ở tư thế ngồi

Bài tập 7: Gập thân ở tư thế đứng

Người bệnh đứng thẳng, hai bàn tay để dọc thân, hai chân dạng. Cúi gập thân về trước, các ngón tay càng tiến gần đến 2 bàn chân càng tốt, rồi trở về tư thế ban đầu.

Cứ sau mỗi lần tập bài này, cố gắng để gập thân càng nhiều càng tốt tiến đến mức tối đa.

Bài tập này thực hiện sau khi tập bài tập 6 hai tuần mà hiệu quả, không gây đau. Khởi đầu, mỗi lần tập thực hiện lặp lại động tác 5 hoặc 6 lần. Mỗi ngày tập 1 đến 2 lần.

Sau khi kết thúc tập bài tập này phải thực hiện ngay bài tập 3. Trong thời gian 3 tháng kể từ khi hết đau, không thực hiện bài tập này ở thời điểm 4 giờ đầu tiên trong ngày.

Chú ý:

  • Nguyên lý: Tập trung hóa điểm đau , đau tại lưng không lan xuống chân.
  • Trong quá trình tập bệnh nhân tập một động tác hết đau mới sang động tác tiếp theo, tập đau lan xuống chân thì ngưng tập.
  • Điều chỉnh vẹo cột sống trước khi tập
Hình 7. Gập thân ở tư thế đứng
Hình 7. Gập thân ở tư thế đứng

III. Trích dẫn

Tai nạn khi update nvidia driver

13/09/2025 @ Saigon Linux

I. Tình huống

Tôi sẽ tóm tắt gọn lại tình huống xảy ra:

  • Mục tiêu: tìm cách update lên nvidia-driver phiên bản mới nhất NVIDIA-Linux-x86_64-580.82.09 https://www.nvidia.com/en-us/drivers/details/254126/
  • Vào multi-user.target để chạy NVIDIA-Linux-x86_64-580.82.09.run
  • Ngay sau khi gỡ bỏ nvidia driver cũ, màn hình đen xì. Không thể tương tác với OS.
  • Giai đoạn này chỉ có 1 cách là giữ nút nguồn và reboot lại OS.
  • Cầu nguyện cho nó hiện ra được cái terminal để mà còn gõ command được.

II. Tại sao màn hình đen

Cái này là tôi phỏng đoán, lúc này OS mặc dù đang là multi-user.target mode, tuy nhiên nó vẫn đang sử dụng nvidia driver. Việc gỡ nvidia driver ra khỏi OS làm màn hình đen.

Tuy nhiên, trước đây, tôi hoàn toàn không bao giờ gặp vấn đề này, khi tôi cài nvidia driver mới, cùng lắm là màn hình chớp một cái thôi, chứ không đến mức màn hình đen xì, không thể tương tác được. Phải đến mức giữ nguồn reboot thì là mới gặp đầu tiên.

III. Định hướng xử lý

Khi cài mới hay update nvidia driver, nên đưa máy sử dụng nouveau thay vì là nvidia. Sau khi đã cài đặt xong hoàn toàn, chúng ta sẽ blacklist nouveau và chỉ sử dụng nvidia.

Đi sâu một chút, chúng ta sẽ cần hiểu thứ tự boot của hệ điều hành Fedora:

  • [Giai đoạn 1] Load initramfs, nó là phiên bản OS tinh gọn load trên ram.
  • [Giai đoạn 2] switch_root chuyển qua rootfs (root filesystem) thật.

Tôi không biết tại sao nó như vậy, nhưng đây là quá trình xảy ra.

Ở bước load initramfs lên ram, phiên bản tinh gọn này sẽ dùng nouveau, một khi đã load xong rồi, đến giai đoạn switch_root, lúc này sẽ disable nouveau đi và sử dụng nvidia driver.

Tôi đã nghĩ là hoàn toàn không cần phải vào multi-user.target khi update hoặc install nvidia driver, ta hoàn toàn có thể mở gnome-terminal và chạy command như bình thường. Tuy nhiên, sau khi tôi test xong, hoàn toàn không được, buộc phải vào multi-user.target.

IV. Thực sự sẽ phải làm thế nào làm ra sao

Trước tiên đi sâu hơn, tôi muốn nói là để tinh gọn file /boot/initramfs-*.img. Tôi đã cố tình loại bỏ nvidia driver, kernel object .ko liên quan rồi. Nói cách khác thì trong initramfs hoàn toàn không có nvidia driver.

Bạn có thể tìm $ dracut --omit-drivers, nó liên quan đến quá trình tạo initramfs, Mỗi khi mà OS update kernel, dracut sẽ chạy để tạo ra initramfs.img mới. Ví dụ khi chạy dracut thủ công

$ dracut --omit-drivers "nvidia-drm nvidia nvidia-modeset nvidia-peermem nvidia-uvm" \
    initramfs-6.16.5-200.fc42.x86_64.img  6.16.5-200.fc42.x86_64

1. Chế độ dùng nvidia (mặc định, khi chạy OS)

Cái này liên quan mật thiết đến GRUB_CMDLINE_LINUX, hãy xem /etc/default/grub

File: /etc/default/grub
~~~~
GRUB_CMDLINE_LINUX="rhgb quiet rd.driver.blacklist=nouveau modprobe.blacklist=nouveau  nvidia-drm.modeset=1"
~~~~
~~~~

Giải thích:

  • rd.driver.blacklist=nouveau: mặc dù trong initramfs có module nouveau, tuy nhiên sẽ không load nó. (giai đoạn 1)
  • modprobe.blacklist=nouveau: sau khi switch_root, sẽ không load kernel module có tên là nouveau. Bên cạnh đó, nếu bất cứ ứng dụng nào tìm cách kích hoạt nouveau, đều sẽ không có hiệu quả.

    Lưu ý nhé, đây là giai đoạn 2, kernel module được load từ /usr/lib/modules/${KERNEL_VERSION}/ chứ không phải trong initramfs.img.
  • nvidia-drm.modeset=1: Còn nvidia-drm thì sẽ mở.

nouveau chưa bao giờ được load kể cả từ initramfs hay là sau khi switch_root. Nvidia driver 100% sẽ được sử dụng.

2. Chế độ dùng nouveau (chỉ dùng khi cần update nvidia)

Khi mà bạn cần vào chế độ nouveau, thì ở màn hình grub, hãy ấn e để edit grub entry.

File: /etc/default/grub
~~~~
GRUB_CMDLINE_LINUX="rhgb quiet nvidia-drm.modeset=0 nouveau.modeset=1 3"
~~~~
~~~~
  • nvidia-drm.modeset=0: sau khi switch_root không load nvidia-drm
  • nouveau.modeset=1: còn nouveau thì sẽ load.
  • 3: cái số này ám chỉ là sẽ sử dụng multi-user.target. Đây là chiêu rất hay nếu bạn không muốn dùng command $ systemctl set-default multi-user.target/graphical.target trước khi reboot để install hay update nvidia driver.

Sau đó ấn F10 để boot vào.

V. Các command hữu dụng

1. Để kiểm tra xem OS đang dùng nvidia hay nouveau hãy dùng command sau:

$ lspci -k | grep -EA3 'VGA|3D|Display'

02:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3080 Lite Hash Rate] (rev a1)
	Subsystem: Micro-Star International Co., Ltd. [MSI] Device 389b
-->	Kernel driver in use: nvidia  <-------
	Kernel modules: nouveau, nvidia_drm, nvidia

$ lspci -k | grep -EA3 'VGA|3D|Display'
02:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3080 Lite Hash Rate] (rev a1)
	Subsystem: Micro-Star International Co., Ltd. [MSI] Device 389b
-->	Kernel driver in use: nouveau <-------
	Kernel modules: nouveau, nvidia_drm, nvidia

2. Để biết grub_cmdline_linux đã chạy là gì

$ cat /proc/cmdline

BOOT_IMAGE=(hd2,msdos2)/vmlinuz-6.16.5-200.fc42.x86_64 root=UUID=e33a7af8-24bf-4be0-b954-327da689e4fb ro rootflags=subvol=root rhgb quiet nouveau.modeset=1 nvidia-drm.modeset=0 hugepagesz=1G hugepages=3

VI. Credit

Trong quá trình tìm hiểu, ChatGPT đã giúp tôi rất nhiều. Việc cài nvidia driver của tôi trước đây rất máy móc, làm theo hướng dẫn. Nhờ ChatGPT mà tôi hiểu sâu hơn về Linux.

Hướng dẫn tinh gọn lại initramfs

13/09/2025 @ Saigon Linux

I. Điều gì đã xảy ra?

Trước khi đi sâu về mặt kỹ thuật, bạn cần hiểu lý do nào mà tôi cần phải tinh gọn, việc tạo ram file system image (initramfs.img) là mặc định khi update Fedora. Những việc này, người dùng như tôi, thường không phải đụng tay vào. Hoặc rất đen mới phải đụng tay vào.

Tuy nhiên, mọi thứ phát sinh sau khi tôi update lên kernel 6.16.5-200.fc42.x86_64, việc build initramfs tự động tạo ra file initramfs-6.16.5-200.fc42.x86_64.img với dung lượng hơn 300MB, và nó là quá nhiều với /boot vốn khi cài đặt mặc định chỉ có 1GB mà thôi.

$ ls -lah /boot
164M Aug 31 02:19 initramfs-6.16.3-200.fc42.x86_64.img
164M Sep 12 18:25 initramfs-6.16.4-200.fc42.x86_64.img
320M Sep 12 18:50 initramfs-6.16.5-200.fc42.x86_64.img

Bạn thấy chứ, có gì đó đã xảy ra, initramfs-6.16.5-200.fc42.x86_64.img có dung lượng cao đột biến so với các .img tiền nhiệm. Tôi có sử dụng nvidia driver tôi nghi ngờ rằng, nvidia driver đã được tích hợp vào initramfs theo cách không cần thiết, và thêm nữa, nó quá chiếm dung lượng.

Vốn dĩ, initramfs.img chỉ dùng ban đầu như là một bước mồi trước khi chroot (change root). Nó thực sự không cần:

  • Hình ảnh (nvidia, amd)
  • Âm thanh
  • Bluetooth
  • Internet

Nhân tiện, việc build initramfs.image sử dụng command dracut.

II. Cách liệt kê những module tích hợp trong initramfs

Cách 1: lsinitrd file.img

Ở cách này, chúng ta đã có file .img rồi, chúng ta muốn khám xem trong .img đang có cái gì.

$ lsinitrd initramfs-6.16.5-200.fc42.x86_64.img | grep "\.ko" | grep nvidia

usr/lib/modules/6.16.5-200.fc42.x86_64/extra/nvidia-drm.ko.xz
usr/lib/modules/6.16.5-200.fc42.x86_64/extra/nvidia.ko.xz
usr/lib/modules/6.16.5-200.fc42.x86_64/extra/nvidia-modeset.ko.xz

Có 3 module có chữ nvidia:

  • nvidia
  • nvidia-drm
  • nvidia-modeset

Một lần nữa, initramfs.img không cần graphic, những module này là không cần thiết.

Cách 2: Vào /lib/modules/KERNEL_VERSION/extra/

Mặc định, những module .ko (kernel object) phụ sẽ nằm ở /lib/modules/KERNEL_VERSION/extra/.

$ ls /lib/modules/6.16.5-200.fc42.x86_64/extra

nvidia-drm.ko.xz
nvidia.ko.xz
nvidia-modeset.ko.xz
nvidia-peermem.ko.xz
nvidia-uvm.ko.xz

Tôi không hiểu hay quan tâm tại sao nvidia-peermemnvidia-uvm không xuất hiện trong .img. Tuy nhiên, nó là đủ để hiểu dracut lấy các file kernel object nvidia từ đâu.

3. Cách bỏ qua‌/omit những module không cần thiết khi tạo initramfs

Để build .img mà bỏ qua những driver không cần thiết, ta sử dụng flag --omit-drivers trong dracut. Dưới đây là command build .img có loại trừ các driver sau:

  • nvidia-drm
  • nvidia
  • nvidia-modeset
  • nvidia-peermem
  • nvidia-uvm
$ dracut --omit-drivers "nvidia-drm nvidia nvidia-modeset nvidia-peermem nvidia-uvm" \
    initramfs-6.16.5-200.fc42.x86_64.img  6.16.5-200.fc42.x86_64

Nhìn dung lượng mới mà xem, 164MB.

$ du -h initramfs-6.16.5-200.fc42.x86_64.img
164M	initramfs-6.16.5-200.fc42.x86_64.img

4. Cài thiết lập mặc định cho dracut

Tất nhiên việc cứ tạo initramfs.img thủ công sau mỗi lần kernel update là rất bất tiện. Để can thiệp vào bước tự động hóa đang có, ta sẽ cần vào thư mục /etc/dracut.conf.d/ và tạo file omit-driver-nvidia.conf với nội dung như sau:

omit_drivers+=" nvidia-drm nvidia nvidia-modeset nvidia-peermem nvidia-uvm "

Sau khi tạo xong, việc chạy dracut sẽ không cần đến flag --omit-drivers nữa. Bên cạnh đó, khi Fedora OS update, nó cũng sẽ bỏ qua việc tích hợp nvidia module khi tạo initramfs.img.

$ dracut initramfs-6.16.5-200.fc42.x86_64.img 6.16.5-200.fc42.x86_64

Hi vọng ai đó có thể tiết kiệm được 2 phút cuộc đời nếu gặp vấn đề tương tự!

5. Reference

Cảm ơn Chatgpt đã giúp tôi hiểu thêm về dracutinitramfs.

Elixir expert (LSP), tản mạn xung quanh cách build

05/09/2025 @ Saigon Elixir

Hôm này ngày đẹp trời, tôi tò mò rất nhiều về expert - language server mới của elixir. Xem một hồi về cách build, tôi học thêm được nhiều cái mới.

1. Just

Just có mục đích tối thượng là giúp giảm thời gian dev gõ command. Để làm việc đó, nó sẽ cho phép bọc nhiều shell command lại, và tạo command tương đương, là tôi thì tôi sẽ gọi là alias command. Trong repo, những thiết lập này nằm trong justfile.

Cùng xem thử một đoạn nhé:

[doc('Run mix deps.get for the given project')]
deps project:
    #!/usr/bin/env bash
    cd apps/
    mix deps.get

just command được tạo ra sẽ có tên là deps, nó bọc lại một danh sách các shell command sau:

  • cd apps/
  • mix deps.get

Điều này có nghĩa là nếu bạn siêng, bạn sẽ gõ 2 lệnh, còn nếu bạn dùng just, bạn sẽ chỉ cần chạy just deps project.

Cá nhân tôi, lần đầu biết đến just, mix project của tôi thường nằm ngay repo root / thành ra chưa có nhu cầu. Tuy nhiên, đáng để ghi nhớ.

Trường hợp ở trên, mix project nằm ở trong /apps‌/, thành ra khá bất tiện.

2. Zig

Zig thì là một ngôn ngữ lập trình luôn! Tôi không hiểu tại sao cái repo 99% là viết bằng elixir, nhưng lại cần đến zig. Đoạn này tôi mù mịt rồi rồi nên phải nhờ chatGPT.

  • Zig chỉ đóng vai trò hỗ trợ khi đóng gói/bundling, cụ thể là với burrito(tôi sẽ nói ở ngay sau)
  • Nếu mà chỉ cần tạo ra release với mix release đơn thuần (cái loại mà tạo ra nhiều thư mục, file, kèm theo runtime), Zig là hoàn toàn không cần thiết.

3. Burrito

Burrito có mục đích lớn nhất là tạo ra một file executable duy nhất cho mix project. Bạn nhớ cái mix release truyền thống chứ, nó bao gồm (erlang runtime, nhiều file, thư mục đi kèm), Burrito thì ngược lại, nó sẽ build ra chỉ một file executable duy nhất.

Bạn còn nhớ thằng Zig ở trên chứ, nó giúp Burrito tạo ra executable file phù hợp cho đa nền tảng (linux, mac, window). Zig nó kết nối(link), đóng gói những header .h và file liên quan vào.

Kết quả là với cùng một source code expert - language server, chúng ta có phiên bản cho

  • expert_windows_amd64.exe (window)
  • expert_linux_arm64 (linux + chip kiến trúc arm64)
  • expert_linux_amd64 (linux + chip kiến trúc amd64)
  • expert_darwin_arm64 (macos + chip kiến trúc arm64)
  • expert_darwin_amd64 (macos + chip kiến trúc amd64)

Xem danh sách mới nhất ở đây: Expert Releases

Chuyện của ông ngoại - 1

Lời đầu tiên, anh muốn nói lời cảm ơn em Nguyễn Xuân Mai (Bống) đã ghi chép lại câu chuyện của ông ngoại. Bài viết này chỉ đơn giản là phiên bản số hóa từ ghi chép của em Bống.


I. Kính viếng hương hồn cậu

Tôi viết truyện này xảy ra 72 năm về trước, tại đình làng Chèm, huyện Từ Liêm, Hà Nội.

Tôi có bốn người cậu, hai cậu đã hi sinh trong cuộc kháng chiến chống Pháp.

Cậu Hoàng Viên đã tốt nghiệp trường Trung học Albert Sarraut, tham gia Vệ Quốc Đoàn, đóng lại làng Chèm, hi sinh năm 1946.

Cậu Hoàng Tâm,tốt nghiệp trường trung học Chu Văn An, hi sinh tại chiến trường Cao-Bắc-Lạng.

Năm 1946, phát xít Nhật đầu hàng quân đồng minh. Quân đội Tưởng Giới Thạch kéo vào Đông Dương, giải giáp vũ khí Nhật. Quân Tưởng với khẩu hiệu: "Diệt Cộng Cầm Hồ". Chúng cướp bóc, sát hại phụ nữ, trẻ thơ Việt Nam.

Hành động của chúng đã lọt vào mắt người biệt động thành Hoàng Lan (bí danh)

Bọn Tưởng lừa bà con vào sân đình, lôi ra một người nông dân 35 tuổi và một em bé 14 tuổi, hãm hiếp cho tới chết và vứt xác xuống ao. Bà Hoàng Lan cùng cậu Hoàng Viên bày kế hoạch bắt chúng trả nợ máu.

Sáng hôm sau, trong vai người bán rượu, bà mời cho bọn Tưởng uống say và trói chúng, thu vũ khí và vứt xác xuống sông.

Có một điều không ngờ đã xảy ra, một tên Tưởng cới trói được về báo cáo với bọn Tưởng. Chính phủ cụ Hồ quyết định tử hình bảy người tại bến Chèm.

Đêm hôm trước thi hành án, bố tôi, cụ Nguyễn Xuân Tuyết (lão thành cách mạng), cụ Lưu Quyên (trưởng ban tạp chí Cộng Sản) đã có ý định giải thoát cho cậu tôi, bằng cách thay thế người khác. Cậu Hoàng Viên trả lời: “Em làm em chịu, cho em hỏi thăm Hoàng Lan”.

Cuộc hành hình diễn ra sáng hôm sau tại bến Chèm, có sự chứng kiến của mợ Lan, cụ Nguyễn Xuân Tuyết, cụ Lưu Quyên.

Sau này, cậu Hoàng Viên được công nhận là liệt sĩ và quy tập về nghĩa trang Mai Dịch, Hà Nội.

Tháng 10 năm 1953, tôi tình cờ gặp được mợ Hoàng Lan tại nhà bà ngoại. Một người phụ nữ mảnh mai, rắn rỏi, đôi mắt sáng hiền và đượm buồn man mác.

Mợ Hoàng Lan nói với bà ngoại tôi: “Con xin làm con dâu của mẹ” Bà ngoại trả lời: “Thằng Viên nó chết vì dân, vì nước. Con phải lập gia đình để có người trả thù cho nó”

Mợ Lan khóc trong khói hương, nước mắt chảy trên gò má
Từ ngày đó qua đi, tôi không còn được gặp mợ, thấy mợ
Tôi có trở lại làng Chèm, hỏi thăm vài bà cùng trang lứa với mợ, họ cho biết bà là biệt động thành, sau này không lấy chồng và đi tu tại chùa Yên Tử.

Câu chuyện này con viết ra đây, nếu mợ còn sống hãy cho con biết được nhé. Con, Hoàng Nhu, giảng viên Vật Lý Đại Học Quốc Gia, số nhà 28, ngõ 255, Nguyễn Khang, Hà Nội.

Tôi tìm được một người đồng đội với cậu tôi là ông Quý, xóm Tre, làng Cót, Yên Hòa, Cầu Giấy, biết chuyện này.

Tập sau xin đăng tiếp.

Hoàng Nhu
27/7/2019


II. Thơ: Đi tìm cậu

Lên cao ngắm nhìn trời
Mây trôi nước trôi
Cả một dòng đời
    Trôi theo thời gian
        Trôi mãi

Công sự ngày xưa lô cốt ngày xưa
    Tan thành hết
Xa xa phía chân trời
    Cậu nằm lại

Cho đất trời giao nhau
Cho đôi lứa chụm đầu
Cho tình yêu dịu ngọt
Cho đất trời đắm say
    Mợ đứng đợi
        Cây vọng phu - thời đại

        Hoàng Nhu
        27/7//2019

III. Hình ảnh chép tay, bằng chứng

[1] Ảnh 1
[1] Ảnh 1
[2] Ảnh 2
[2] Ảnh 2
[3] Ảnh 3
[3] Ảnh 3

IV. Trích dẫn, tài liệu liên quan

SQL Join Visualized (repost)

28/08/2025 @ Saigon SQL

I write this post because:

  • The original blog hosting provider is having error, I cannot enlarge the summary image. link.
  • It’s super useful.

SQL Join Visualized
SQL Join Visualized

All credit goes to C.L. Moffatt. Thank you so much!

References

Discord setup script

18/08/2025 @ Saigon Linux

I am tired downloading Discord discord.tar.gz and setup manually when it has new version! This post is all about doing it automatically!

#!/bin/zsh
discord_setup() {
    DISCORD_DIRECTORY=/home/nguyenvinhlinh/Software/Discord # change it to yours
    echo "Create directory $DISCORD_DIRECTORY"
    mkdir -p $DISCORD_DIRECTORY;
    echo "Remove temporary files: /tmp/discord.tar.gz"
    /usr/bin/rm -rf /tmp/discord.tar.gz;
    echo "Remove temporary files: /tmp/Discord/"
    /usr/bin/rm -rf /tmp/Discord/;
    echo "Remove old discord files: $DISCORD_DIRECTORY/*"
    /usr/bin/rm -rf /home/nguyenvinhlinh/Software/Discord/*;
    echo "Download discord and save to /tmp/discord.tar.gz";
    wget -O /tmp/discord.tar.gz "https://discord.com/api/download?platform=linux&format=tar.gz"
    echo "Extract discord.tar.gz to /tmp/Discord"
    tar -xf /tmp/discord.tar.gz --directory /tmp/;
    echo "Copy new Discord files to $DISCORD_DIRECTORY/"
    cp -r /tmp/Discord/* /home/nguyenvinhlinh/Software/Discord/;
}

Then, when you want to update your Discord, you can open your terminal and execute discord_setup.

Good luck!

Optimizing MPV for Wayland and Nvidia

15/08/2025 @ Saigon Linux

I. What is it?

MPV is my favorite open source media player. On Fedora 42, the default display manager is Wayland (as a replacement for X11). MPV does not play well with Wayland, playing videos is delay/lagging. In addition, I am using an NVIDIA graphic card 3080. it could be a reason that my video playing is delay.

This post is all about customize mpv’s flags to work with Wayland and NVIDIA graphic card.

II. How to do?

Go to ~/.local/share/applications and create a new file named mpvfast.desktop.

[Desktop Entry]
Type=Application
Name=mpv (Fast Mode)
Exec=mpv --gpu-context=wayland -vo=gpu --video-sync=display-resample --profile=gpu-hq --hwdec=auto --demuxer-max-bytes=8G %U
Icon=mpv
Terminal=false
Categories=AudioVideo;Player;Video;
MimeType=video/x-matroska;video/mp4;video/x-msvideo;video/webm;audio/mpeg;audio/x-flac;audio/x-wav;
  • --gpu-context=wayland: Tells mpv to create its GPU rendering context using Wayland APIs instead of X11, SDL, or other backends.
  • -vo=gpu: select GPU as video output
  • --video-sync=display-resample: Syncs video playback to the display refresh rate and dynamically resamples audio to keep A/V in perfect sync.
  • --profile=gpu-hq: GPU high quality — enables higher-quality scaling algorithms
  • --hwdec=auto: Enables automatic hardware video decoding if available.
  • --demuxer-max-bytes=8G: The demuxer buffer is where mpv stores pre-read data from a file/network before decoding.

Then execute update-desktop-database to update desktop.

$ update-desktop-database ~/.local/share/applications

III. Credit

Thank for ChatGPT, it helps me so much! I can’t understand all 1250 options of MPV.

Compressing image directly on Fedora's Nautilus (File Explorer)

15/08/2025 @ Saigon Linux

I. What is it?

This post is all about compressing image on Gnome Desktop Environment with GUI. This is core script

ffmpeg -i "$img" -q:v 4 "$output_dir/$filename"

-q:v 4: refers to quality for video. It’s value range is 1-31, the smaller this value is, the higher the quality.

There are two way to executable the script

  • [1] Open gnome-terminal and execute script.
  • [2] Open nautilus (default file explorer on GNOME).

In addition, to enhance user experience, I used zenity to display progress bar.

II. How to do?

  • Create a file named 01-compress-images.sh at ~/.local/share/nautilus/scripts/
#!/bin/bash
input_dir="$1"
output_dir="${input_dir}_compressed"
mkdir -p "$output_dir"

shopt -s nullglob
files=("$input_dir"/*.{jpg,jpeg,png,webp})
total=${#files[@]}
count=0

(
for img in "${files[@]}"; do
    [ -f "$img" ] || continue
    filename=$(basename "$img")
    ffmpeg -i "$img" -q:v 4 "$output_dir/$filename" &>/dev/null
    count=$((count+1))
    echo $(( count * 100 / total ))
    echo "# [$count/$total] Compressing: $filename"
done
) | zenity --progress --title="Compress Images" --percentage=0 --auto-close

zenity --info --text="Finished! Compressed images stored at:\n$output_dir"
  • Use chmod to make 01-compress-images.sh executable.
$ chmod +x 01-compress-images.sh

III. Result

IV. Credit

Thank to ChatGPT, It helps me so much!

How to generate UUID in Libreoffice Calculator/Excel?

10/07/2025 @ Saigon etc

LibreOffice Calc & UUID formula
LibreOffice Calc & UUID formula

In this post, I would like to make a note about generating UUID in Libreoffice Calc/Excel.

=LOWER(CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,4294967295),8),DEC2HEX(RANDBETWEEN(0,65535),4)))

References