How to split Nginx logs for bot visits

Logs are the valuable resource for debugging. When we have a website, we also often look into Nginx logs to see what happened with our website. But they are often cluttered by the visit of search bots, which make us difficult to find the noteworthy lines. So how to tell Nginx to log the search bot activities to another file, to make our access log cleaner?

To do that, first, create an file to help Nginx distinguish who is search bot. Create a file bot_definition.conf in /etc/nginx/conf.d folder, with this content:

map $http_user_agent $is_bot {
        ~Pingdom 1;
...

Website phiên bản mới từ ruột

Hôm nay mình vừa triển khai phiên bản mới của website này. Nhìn giao diện thì không khác gì nhưng bên trong là đã làm mới hoàn toàn. Mới từ ngôn ngữ lập trình đến database.

Website này được mình viết lại bằng ngôn ngữ Rust và dùng database EdgeDB. Phiên bản cũ được viết bằng Python, dựa trên framework Flask, và database thì dùng PostgeSQL, được viết cũng khá lâu rồi (khoảng 10 năm), lại không được chăm sóc, cập nhật (trừ một đợt cập nhật lớn về frontend năm kia) nên bộ code rất cũ. Nhân việc mình đang có hứng luyện tay nghề về Rust nên mình quyết định dùng website này làm "bài tập". Về mặt frontend thì website này áp dụng cả hai kĩ thuật:

  • Server side rendering: Dùng cho các trang bên ngoài, mà khách truy cập sẽ nhìn thấy. Với các trang này thì mình dùng MiniJinja để render dữ liệu ra HTML.
...

Tại sao trên Linux hay dùng những định dạng file nén như *.gz, *.xz thay vì *.zip, *.7z?

Những bạn đang dùng Windows mà tìm hiểu về Linux sẽ thấy trên Linux, những định dạng file nén quen thuộc như *.zip, *.7z lại không được ưa chuộng, mà lại thấy người ta hay sử dụng *.gz, *.tar.gz, *.zz, *.tar.xz, mặc dù cả định dạng và thuật toán của zip, 7zip đều là mã nguồn mở. Thế thì tại sao?

Đầu tiên, hãy nói về một định dạng file nén khác cực kì được ưa chuộng trên Windows là *.rar. Lý do định dạng này vắng mặt trên Linux thì dễ hiểu hơn, đó là nó không phải là phần mềm nguồn mở.

Quay lại *.zip*.7z. Lý do chúng không được ưa chuộng là vì chúng không hỗ trợ nén và giải nén theo kiểu "cuốn chiếu". Theo kiểu "cuốn chiếu" nghĩa là, ví dụ như bạn đang download một file nén lớn và bạn muốn download tới đâu, giải nén tới đó, không phải chờ download xong xuôi rồi mới giải nén. Tính năng "cuốn chiếu" này quan trọng đối với người dùng Linux vì trên Linux, môi trường dòng lệnh rất mạnh, có một tính năng gọi là "pipe" và tính "cuốn chiếu" kết hợp với "pipe" thì giúp công việc hiệu quả gấp nhiều lần.

Ví dụ, tôi hay sử dụng "pipe" (truyền dữ liệu đầu ra của chương trình này vào đầu vào của chương trình khác) khi tôi muốn copy cơ sở dữ liệu từ server về máy cá nhân:

...

Suppress Django error reporting email

In Django, by default, when an exception raises, and is not handled, Django will send an email to people listed in ADMINS, reporting the error. But in many setup, we already have other mechanism to track those errors (like throwing to Sentry), so those emails will become annoying. How to stop Django from sending those emails.

We can do it by overriding mail_admins log handler, to use logging.NullHandler as handler class, like this:

LOGGING = {
    'version': 1,
...

Phần mềm để nạp firmware OpenWrt trong chế độ recovery

Gần đây mình lại có duyên đụng vào OpenWrt và router wifi. Mình phải nạp firmware OpenWrt cho một số router đã bị bricked (HĐH bị liệt, không chạy). Vì đã bị bricked nên chỉ có thể nạp trong chế độ recovery, qua cổng serial. Nay mình liệt kê một số phần mềm để dùng cho việc này.

Truy cập qua cổng serial

Để truy cập qua cổng serial, mình dùng PySerial thông qua lệnh sau:

$ pyserial-miniterm /dev/ttyUSB0 115200
...

Xem thông tin phần cứng máy ảnh được nhúng trong file hình

Gần đây mình mua máy ảnh về để tập chụp ảnh. Máy ảnh mình mua là loại DSLR, nhờ vậy mình vô tình khám phá được phần mềm trên Linux xịn cỡ nào.

Câu chuyện là vì mình là người mới tập chơi nên chỉ mua máy secondhand. Mình có người bạn giới thiệu chỗ mua cho mình. Khi mua xong thì anh chàng muốn kiểm tra coi máy mình mua có phải hình dựng không, bằng cách so sánh số serial in trên thân máy và nhúng trong file hình. Bạn đầu, anh đấy dùng website http://shuttercounter.com/, upload ảnh chụp bởi máy lên để xem thông tin. Nhưng sau đó mình phát hiện hóa ra trên Linux cũng có phần mềm làm được chuyện này, là gThumb:

gThumb image properties

Và điểm lợi là phần mềm này miễn phí. Mình so sánh với các phần mềm trên Windows thì không thấy phần mềm miễn phí nào làm được chuyện này.

...

Món cá nướng lá chúc Campuchia

Ngày này 4 năm trước, mình đón năm mới bằng chuyến đi ngẫu hứng qua Campuchia. Ấn tượng sâu đậm nhất còn lưu lại đến hôm nay là món cá nướng giấy bạc ướp lá chúc của nước bạn. Chúc là một loại cây giống như chanh, trái nhăn nheo, lá rất thơm, hay gặp trong ẩm thực Thái Lan, Campuchia. Mình chưa chụp hình lá chúc nên lấy ảnh từ Internet để minh họa.

lá chúc

Địa điểm tìm món này: Sau khi qua cửa khẩu Mộc Bài - Bà Vẹt, đi theo Quốc Lộ 1 đến thị xã Svay Rieng. Ngay cửa ngõ Svay Rieng có một cái hồ lớn, sau khi đi xuyên qua cái hồ này, bạn rẽ trái đi ven bờ hồ. Lúc này bên trái là hồ, bên phải là một dãy nhà thưa thớt, có một vài quán nhậu dựng bằng tre nứa, khách ngồi ăn trên sập. Các quán này có bán món cá nướng kể trên.

...

Chuyển ảnh số lượng lớn từ điện thoại vào máy tính

Thời buổi này điện thoại có dung lượng bộ nhớ trong lớn và việc gắn thẻ nhớ bất tiện hơn nên người dùng thường không dùng thẻ nhớ nữa. Tuy nhiên với nhu cầu quay phim, chụp ảnh lớn mà bộ nhớ trong có hạn thì cũng sẽ có một ngày ta cần chuyển bớt ảnh vào máy tính để lấy chỗ trống lưu dữ liệu mới. Vì lâu lâu mới làm một lần nên số lượng mỗi lần chuyển là rất lớn, sẽ tốn khá nhiều thời gian. Hôm nay tôi trình bày cách làm để tiết kiệm thời gian hơn. Việc này được thực hiện với điện thoại Android và máy tính cá nhân chạy hệ điều hành Ubuntu. Cách này cũng áp dụng được với các HĐH Linux khác.

Để làm việc này, ta sẽ dùng phần mềm gThumb. Việc cài gThumb thì đơn giản, chỉ cần gõ lệnh sau:

$ sudo apt install gthumb
...

Tiềm năng ứng dụng thực tế của blockchain & Web3

Mấy nay nghe báo chí ca ngợi về blockchain & Web3 quá nên mình quyết định bước chân vào lĩnh vực này để tìm hiểu coi nó có ứng dụng thực tế gì không. Sau một tháng đọc tài liệu và viết code thử, mình nghĩ là đã tìm thấy câu trả lời.

Mình tìm hiểu về blockchain & Web3 với tâm thế của một người làm kĩ thuật, tức là mình không chỉ đọc khơi khơi. Mình muốn lập trình, làm ra được một ứng dụng cụ thể từ blockchain. Trong số các hệ thống blockchain, mình chọn Solana để nghiên cứu. Mình chọn nó là vì:

  • Nó cho phép lập trình bằng ngôn ngữ Rust. Mình ưu tiên Rust không chỉ vì lý do cảm tính (yêu thích) mà còn vì lý do thực dụng: Đầu tư vào Rust để sau khi làm về blockchain, mình có thể sử dụng Rust để làm việc cho các mảng khác (web, hệ thống nhúng v.v...). Nếu mình theo Ethereum thì phải học ngôn ngữ Solidity, nhưng Solidity chỉ có giá trị với smart contract. Rời blockchain ra thì chẳng dùng Solidity được vào việc gì khác, phí thời gian học tập.
  • Solana có tốc độ xử lý giao dịch nhanh. Theo mình, muốn có ứng dụng thực tế thì phải nhanh. Tương tự như bạn vô một website mà tải chậm thì lần sau bạn chẳng muốn ghé lại nữa.
...

Enable auto-completion for Solana CLI

If you are using the command-line tool for Solana blockchain, you may be tired from remembering and typing its subcommands and options. How to get auto-completion for it?

Thank to great Rust libraries, Solana CLI automatically has a feature to generate auto-completion scripts. It is just that the feature is not mentioned in documentation yet. To generate this script for your shell, just run:

$ solana completion -s <your-shell>
...