Hexa's Blog

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

Fedora, Change directory quickly with autojump

13/06/2025 @ Saigon Linux

Why do I create this post?

Damn man, I really expected that after install dnf install autojump-zsh, everything should run without any modification, I can start using j command. But no, command j not found. This post is all about installing autojump on Fedora.

Each user has their favorite shell, I am using zsh. this guide is all about setup autojump on zsh. The methodology is the same for fish or bash.

How to install

Step 1: Install dnf install autojump-zsh -y

$ sudo dnf install autojump-zsh -y
# Output
Updating and loading repositories:
Repositories loaded.
Package                                  Arch              Version           Repository        Size
Installing:
 autojump-zsh                            noarch            22.5.3-17.fc41    fedora         2.8 KiB
Installing dependencies:
 autojump                                noarch            22.5.3-17.fc41    fedora        93.2 KiB

Transaction Summary:
 Installing:         2 packages

Complete!

Step 2: Find installed file location rpm -ql autojump-zsh

$ rpm -ql autojump-zsh
# Output
/usr/share/autojump/autojump.zsh
/usr/share/zsh/site-functions/_j

Step 3: Load autojump.zsh when start terminal

I am using zsh, it means that I need modify ~/.zshrc and append source /usr/share/autojump/autojump.zsh.

It will load autojump.zsh when terminal start.

# File ~/.zshrc

source /usr/share/autojump/autojump.zsh

Good luck, have fun!

Firefox on Wayland, can't do mouse click

12/06/2025 @ Saigon Linux

Hi, I am running Firefox on Fedora 41, my display manager is wayland by default. While using Firefox, sometime, I can’t do mouse click on Firefox. This post will help you save 5 minutes.

First of all, the key point here is environment variable MOZ_ENABLE_WAYLAND=1. We need it before running firefox.

You can test by running this command. If it works, you can read futher, else, stop wasting your time reading my post.

$ export MOZ_ENABLE_WAYLAND=1
$ firefox

I assume that you have play with your firefox smoothly. Now, we will edit .desktop file. So what is it? it’s a application shortcut for GNOME. You can find it /usr/share/applications.

$ ll /usr/share/applications  | grep firefox
-rw-r--r--. 1 root root 9.4K Jun 12 11:16 org.mozilla.firefox.desktop

Now, edit /usr/share/applications/org.mozilla.firefox.desktop, add env MOZ_ENABLE_WAYLAND=1 on Exec= line. Remember that there are many places need to update.

Example:

# Before
Exec=firefox %u

# After
Exec=env MOZ_ENABLE_WAYLAND=1 firefox %u

Done, and good luck!

References:

How to fix ssh: connect to host github.com port 22: Connection timed out

09/06/2025 @ Saigon Linux

At first, let make it clear! on May 25th, vietnamese goverment started blocking telegram.

As a consequence, I have to use CloudFlare WARP to dogde it. It’s fine till I have trouble pushing/cloning my source code to github. I am pretty sure that CloudFlare did something as a middle man!

$ ssh -T git@github.com
# ssh: connect to host github.com port 22: Connection timed out

So, there are two choices:

  • [1] Turn off cloudflare’s warp client
  • [2] Change github ssh port from 22 to 443

This post is all about the second solution. Do ssh to ssh.github.com port 443 instead of github.com port 22.

If you run ssh -T -p 443 git@ssh.github.com and it works, you can continue reading this post. Else, this post is not for you cause ssh.github.com port 443 is also BLOCKED.

$ ssh -T -p 443 git@ssh.github.com
# Hi nguyenvinhlinh! You've successfully authenticated, but GitHub does not provide shell access.

If you see that message Hi nguyenvinhlinh! You've successfully authenticated, but GitHub does not provide shell access. You can alias ssh’s config and work around ssh's port 22, connection timeout error.

I will make it short! Edit file ~/.ssh/config with the following config.

Host github.com
Hostname ssh.github.com
Port 443

And test it with: ssh -T git@github.com. You should see output like:

Hi nguyenvinhlinh! You've successfully authenticated, but GitHub does not provide shell access.

Good luck!

References

How to install phx_new manually from source code?

05/06/2025 @ Saigon Elixir

Before going further, you must prepare your dev environment. I choose asdf - version manager. This is my .tool-versions

erlang 28.0
elixir 1.18.4

1. Clone the source code

In this post, I choose the latest version v1.8.0-rc.3

$ git clone --depth 1 --branch v1.8.0-rc.3 git@github.com:phoenixframework/phoenix.git

2. Go to directory phoenix/installer and build

$ cd phoenix/installer;
$ MIX_ENV=prod mix archive.build;
# Output
Compiling 11 files (.ex)
Generated phx_new app
Generated archive "phx_new-1.8.0-rc.3.ez" with MIX_ENV=prod

3. Install archive

$ mix archive.install phx_new-1.8.0-rc.3.ez
# Output
Are you sure you want to install "phx_new-1.8.0-rc.3.ez"? [Yn] Y
* creating /home/nguyenvinhlinh/.asdf/installs/elixir/1.18.4/.mix/archives/phx_new-1.8.0-rc.3


$ mix phx.new --version
# Output
Phoenix installer v1.8.0-rc.3

4. How to remove phx_new

$ mix archive.uninstall phx_new