Làm việc từ xa bằng máy tính ở nhà

Mình là người hay làm việc bên ngoài văn phòng, cụ thể là quán cafe hay trên đường đi du lịch. Thế nhưng laptop thì không mạnh bằng máy bàn nên mình vẫn thực sự dùng máy tính bàn ở nhà cho công việc, dù đang dùng màn hình và bàn phím của laptop. Vậy mình làm thế nào?

Dù làm về lập trình và có thâm niên nhưng mình vẫn chỉ sử dụng máy móc bình dân. Cụ thể laptop của mình chỉ là Dell Vostro 5568 với CPU Core i5 (2 nhân 4 luồng).

Laptop

Trong thời gian bị phong tỏa vì CoVid, mình cứ băn khoăn lỡ laptop này bị hư thì làm sao đi sửa để tiếp tục làm việc được, nên sau khi được mở cửa lại, mình cũng mua luôn một máy bàn để dự phòng, lỡ bị phong tỏa nữa. Máy bàn mà mình mua, mặc dù rẻ hơn laptop nhưng mạnh hơn nhiều, là con ASRock DeskMini X300, với CPU Ryzen 5 5600G (6 nhân 12 luồng). Máy chạy nhanh, mát, ít tốn điện nên mình cho nó bật 24/24 và làm công cụ kiếm cơm chính luôn. Dù đi đâu thì mình vẫn truy cập từ xa vào nó. Đặc biệt, công việc của mình cũng thường phải chạy biên dịch code Rust, build ảnh Docker, là những tác vụ ngốn CPU, nên việc tận dụng sức mạnh của máy bàn sẽ giúp tiết kiệm thời gian hơn, làm việc năng suất hơn.

...

Setup EdgeDB for single-server deployment

Today, many people talk about microservice. The new-born EdgeDB also doesn't stay outside that trend. But not every website is applicable for microservice. Due to low traffic, low budget, some websites still prefer single-server deployment, meaning that everything, application and databases, are hosted in the same server. But EdgeDB lacks a traightforward documentation for this setup. This post is to guide how to do.

Install EdgeDB package

Follow this guide to install EdgeDB package on your server, but hold on before "Enable a systemd unit​" section.

Setup simple authentication for EdgeDB

...

How to find the largest files

Recently, my company website wants to host media files (user uploaded files) to some cloud storage service. But in preparation, we realized that our media folder is too big, about 48GiB. We need to delete unnecessary files to save the storage cost. Part of it, we need to hunt down big files.

I looked around to find a command to list largest files in Linux. Most of the tutorials on Internet tell you to use a combination of commands, which is often du | sort | head, or find | sort | head. None of them satisfies me, because:

  • Combination with du only gives result of directories, not files.

...

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;
...

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:

...

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
...

Một số trục trặc khi nâng cấp server từ Ubuntu 20.04 lên 22.04

Một tháng sau khi Ubuntu 22.04 ra mắt, mình quyết định nâng cấp dàn server của mình, đang chạy Ubuntu 20.04, lên Ubuntu 22.04. Trong quá trình làm, một số bất ngờ nảy sinh như sau:

  • Một số server của mình có chạy Mosquitto, một MQTT broker, để thu nhận dữ liệu từ các cảm biến ngoài trang trại gửi về. Sau khi nâng cấp lên Ubuntu 22.04 tự dưng không nhận được dữ liệu nữa. Ban đầu tưởng lý do không nằm ở Mosquitto vì thử publish gói tin lên từ cùng một máy vẫn thấy nhận được dữ liệu. Mất một ngày để phát hiện, hóa ra trên Ubuntu 22.04 thì Mosquitto thay đổi hành vi, mặc định nó không lắng nghe trên mọi network interface nữa mà chỉ nghe trên localhost, nên gói tin gửi từ cùng một máy thì nhận được, gửi từ bên ngoài vào thì không nhận.

  • Mình sử dụng TimescaleDB làm database lưu trữ dữ liệu IoT. TimescaleDB là một extension của PostgreSQL. Trên Ubuntu 20.04 thì là PostgreSQL 12, trên Ubuntu 22.04 thì là PostgreSQL 14 nên phải tìm cách nâng cấp bộ dữ liệu đang chứa trên máy từ Postgres 12 lên 14. Bình thường nếu không cài TimescaleDB thì việc này rất nhanh chóng, dùng lệnh pg_upgradecluster là được. Nhưng khi có TimescaleDB thì mới lộ ra là lệnh này có bug, chạy không thành công. May mắn có người giải quyết vấn đề này trước và viết hướng dẫn trên mạng. Thực hiện hơi lòng vòng nhiều bước nhưng cũng thành công.

...

Fix missing key issue for Slack APT repo in Debian/Ubuntu

If you are using Debian/Ubuntu, having Slack installed, you will see this warning when doing apt update:

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://packagecloud.io/slacktechnologies/slack/debian jessie InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY C6ABDCF64DB9A0B2
W: Failed to fetch https://packagecloud.io/slacktechnologies/slack/debian/dists/jessie/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY C6ABDCF64DB9A0B2
W: Some index files failed to download. They have been ignored, or old ones used instead.
...

CoBang, phần mềm quét mã QR cho Linux

Năm 2020 quả là một năm với nhiều biến động lớn, quy mô rung chuyển toàn cầu, tiêu điểm là dịch cúm CoVid-19 khiến nhiều cường quốc mất mặt và một nước "ít quan trọng" như Việt Nam trở thành điểm sáng. Hòa chung xu thế đó mình cũng tung ra một phần mềm "Made in Viet Nam" nhưng hướng đến người dùng quốc tế. Chém thế thôi chứ nó thật ra xuất phát từ nhu cầu cá nhân.

CoBang

CoBang là phần mềm quét mã QR dành cho desktop Linux. Mã QR đang ngày càng phổ biến, nó là phương tiện để trao đổi thông tin khó viết và khó nhớ. Một trong những hoàn cảnh mình bị buộc phải đụng đến mã QR là khi mình cần kết nối vào một mạng wifi nhưng không biết password. Thông tin wifi đó thì có lưu trong điện thoại nhưng điện thoại không cho xem password (một quan điểm kì cục của những người thiết kế HĐH điện thoại ban đầu). May thay hồi đó mình dùng điện thoại Xiaomi và nó nó chức năng chia sẻ thông tin wifi qua mã QR. Trong khi những phần mềm quét mã QR có ra rả trên Android thì trên Linux lại rất hiếm. Lí do của sự hiếm này là khi nói đến "quét mã QR", người ta chỉ hình dung đến việc cầm điện thoại lên soi thôi. Hồi đó trên laptop mình dùng QtQR nhưng khá cùi và có bug. Điều đó làm nảy sinh nhu cầu bức thiết là phải tạo một phần mềm mới. Dù nhu cầu là có nhưng vì có nhiều công việc gấp hơn nên mình đành trì hoãn đến năm nay mới bắt tay vào làm, nhân dịp muốn tìm một luồng gió mới thay cho công việc làm web hàng ngày.

Do cũng khá am hiểu những lớp công nghệ bên dưới desktop Linux nên mình dễ dàng hình dung được việc cần dùng những thư viện, công nghệ gì bên dưới và liên kết chúng ra sao. Thành tố quan trọng nhất là GStreamer, một thư viện/framework xuất sắc của thế giới Linux. Nó giúp hiện thực hóa ý tưởng của mình về cách luồng media vận hành ra sao: Sau khi lấy nguồn video liên tục từ webcam thì dòng video sẽ được chia làm 2 nhánh, một nhánh cho hiển thị lên cửa sổ giao diện, nhánh kia thì cho tách ra từng frame, lấy ảnh, và cho vào thư viện ZBar để soi tìm mã QR. Về giao diện đồ họa thì mình đi ngược với hot trend "cross-platform" để gắn bó với GTK, một thư viện native trên Linux.

...

Lại tản mạn về vai trò của Linux

Nghe đồn giới IoT muốn ứng dụng Bluetooth LE nhưng gặp khó.

Quay đi quay lại thì mình thấy thư viện về Bluetooth có độ hoàn thiện nhất là BlueZ. Khó ở đây là thư viện này được tạo ra với mục đích dành cho viết ứng dụng Linux, vì nó dùng event loop của GLib ở trỏng. GLib là một trong những thành phần lõi của bộ GTK, bộ toolkit dành cho lập trình giao diện đồ họa của Linux. Đã thế nó còn dùng D-Bus nữa chứ. D-Bus là một đường giao tiếp chung, cho phép các ứng dụng desktop giao tiếp với nhau. Sau đây là ví dụ về ứng dụng của D-Bus: Vào thời mà Yahoo Messenger còn phổ biến, dân Linux thường chat Yahoo bằng một phần mềm "nhiều trong một" tên là Pidgin (ngoài Yahoo ra, còn có thể chat cùng lúc với Google Hangout, Facebook Messenger). Phần mềm này có khả năng thú vị là nhận biết khi nào máy bạn đang có mạng, rớt mạng để hiện chỉ thị tương ứng (trạng thái màu xám, các avatar bạn bè bị phủ màu xám). Khi có mạng trở lại thì phần mềm này sẽ tự đổi trạng thái, tự đăng nhập vào các dịch vụ chat và cập nhật danh sách bạn bè. Để nhận biết tình trạng mạng, nó không chơi trò cơ bắp là liên tục kết nối đại vào server nào đấy. Thay vì vậy nó trao đổi với một phần mềm khác tên là NetworkManager. Khi rớt mạng hoặc có mạng, NetworkManager sẽ thông báo trên đường D-Bus và các phần mềm khác "đăng ký" vào D-Bus sẽ nhận được tin.

Đối với những người cần dùng thiết bị USB-3G (như cục D-Com 3G của Viettel chẳng hạn), trên Linux cũng có một phần mềm tên là ModemManager, chạy ngầm để khai thác thiết bị này, ví dụ như chọn sóng của nhà mạng nào, nhập username, password để quay số vào nhà mạng đó, bật sang chế độ data, gửi tin nhắn SMS v.v. ModemManager cũng cho phép giao tiếp qua D-Bus. Chẳng hạn khi cắm thiết bị vào thì danh mục của Network Manager sẽ xuất hiện mục để kết nối mạng 3G, hoặc bạn có thể viết ứng dụng riêng để gửi tin nhắn SMS, lấy các danh bạ lưu trong SIM, tất cả bằng việc giao tiếp với ModemManager qua D-Bus.

...