Bắt hình của IP Camera từ ứng dụng Python

Thỉnh thoảng tôi bắt gặp câu hỏi "Làm thế nào để lấy ảnh chụp của IP Camera bằng code Python". Hầu hết câu trả lời, của cả Tây lẫn Việt, đều là kêu người ta dùng OpenCV.

Camera

Quan điểm của tôi là, OpenCV tốt đấy, nhưng nếu chỉ để lấy ảnh chụp của camera thôi mà dùng OpenCV thì chuối quá. Thứ nhất, OpenCV là thư viện dành cho computer vision, nên nếu không khai thác gì đến tính năng đó mà ôm OpenCV vào thì nặng nề, dư thừa không cần thiết. Đằng nào thì tự OpenCV cũng không có khả năng xử lý giao thức RTSP mà nó phải gọi đến FFmpeg , nên để cho gọn ghẽ, tốt hơn là dùng thẳng FFmpeg để bắt hình camera đi. Thứ hai, tệ hơn nữa, mặc dù OpenCV sử dụng FFmpeg bên dưới, nó cũng không khai thác FFmpeg đúng cách nên có nhiều IP Camera cũng truyền video qua giao thức RTSP mà nó không lấy được. Lí do là RTSP có thể truyền trên TCP hoặc UDP, nhưng OpenCV được hardcode để gọi FFmpeg với chỉ mỗi TCP, thành ra nếu IP Camera truyền với "RTSP over UDP" thì OpenCV không lấy được.

Vậy giải pháp là gì?

...

Dùng Flask hay Django?

DjangoFlask là hai cái tên được nhắc đến nhiếu nhất khi nói về web framework của Python, đặc biệt là giữa những người mới bước chân vào thế giới Python. "Dùng Flask hay Django?" cũng là câu hỏi mà tôi hay nghe đi nghe lại trên các diễn đàn trao đổi, hỏi bài. Với kinh nghiệm về 2 thứ này, tôi viết một bài ngắn gọn, mong trả lời trước cho những ai mới chập chững bị "rắn cắn" này.

Flask_vs_Django Image credit: coderseye.com

Về Flask, tôi đã 3 lần sử dụng Flask cho phần mềm của mình. Lần sử dụng đầu tiên, khoảng năm 2013, tôi làm cho một tay nghiên cứu sinh về Big Data, khi anh chàng này viết một phần mềm xử lý dữ liệu lớn (Java + Hadoop) và cần một trang web để làm giao diện điều khiển cho việc chọn dữ liệu nguồn và lấy kết quả về sau khi xử lý. Lần tiếp theo, tôi viết server phân quyền cho cổng login của mạng wifi (có các tên gọi khác là Splash page, Captive Portal, Wifi Marketing), và sản phẩm cuối cùng tôi dùng Flask là để tạo trang blog này (viết lai rai từ 2013 đến nay).

...

Install GitLab-Runner in Ubuntu 19.04 and 19.10

In Ubuntu from 19.04 to 20.04, the GitLab Runner installer doesn't work completely. After installed by apt, you often have to do the post-installation process manually, running /usr/lib/gitlab-runner/mk-prebuilt-images.sh to build some Docker image, but fail at this step.

Here are step you need to do, to successfully build that Docker image (assumed that you already installed Docker).

First, find a Debian repository mirror near to you. I'm in Viet Nam, so the mirror I chose is http://opensource.xtdv.net/debian/.

...

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.

...

Combining SSH and subprocess pipe in Python asyncio

When creating tool for system administration tasks, we often have the need to execute some other command-line programs, execute some commands on remote machine, transferring data between local and remote machine via SSH. A straightforward thinking will be to implement the tool in shell. But what if you, like me, hate the syntax of shell and be happier with Python? And especially when you want to challenge yourself with the new (somehow) cool asyncio?

To have a clear picture, let's give an example that you want to implement a command like this:

ssh remote-server "pg_dump -O webdata | gzip" | gunzip | psql localdb

Yếu tố Đông Nam Á trong văn hóa Việt Nam, ghi chép 1

Dạo gần đây, phong trào "về nguồn", tìm hiểu lịch sử cha ông của giới trẻ Việt Nam lên cao. Đó là điều rất phấn khởi. Tuy nhiên tôi thấy có dấu hiệu thiên lệch về kiến thức của các bạn, khi có bạn có thái độ đề cao yếu tố Đông Á, Trung Hoa trong văn hóa Việt Nam mà coi thường yếu tố Đông Nam Á, hoặc là lờ đi như không có, hoặc coi như là thứ tầm thường, hạ cấp. Tôi cho rằng hiện tượng này có nguyên nhân khách quan, khi tầng lớp trí thức xưa phần lớn là Nho sĩ, khiến cho việc nghiên cứu theo chiều hướng "văn hóa Trung Hoa" được đào sâu hơn, để lại nhiều tư liệu hơn, và các bạn trẻ ngày nay cũng chỉ được tiếp cận nguồn tư liệu "một chiều" như thế. Trong khi việc nghiên cứu theo hướng Đông Á có sẵn tư liệu, có sẵn thành quả của người đi trước thì việc nghiên cứu theo hướng Đông Nam Á bị trở ngại bởi tư liệu không có, đòi hỏi phải đi thực địa nhiều hơn, phải tiếp cận các tài liệu của những ngoại ngữ "không mạnh" như tiếng nói của dân Đông Nam Á (tiếng Thái, tiếng Malay v.v...), hoặc thảm hơn là phải "giải mã" những chữ viết cổ, thất truyền như chữ Chăm cổ.

Nhằm bù đắp cho sự mất cân bằng trên, tôi sẽ bắt đầu ghi lại những khám phá của tôi, trong quá trình tìm hiểu văn hóa lịch sử Đông Nam Á, nhằm cung cấp tư liệu để những người đam mê lịch sử có cái nhìn toàn diện hơn. Những gì tôi sẽ viết dưới đây, chỉ là những ghi chép vụn vặt, chứ không phải là bài nghiên cứu hoàn chỉnh, bởi vì tôi không phải là nhà nghiên cứu chuyên nghiệp. Tôi cũng chỉ hi vọng mình đóng góp được nhiều nhất là mặt "tư liệu".

Bắt đầu cho chuỗi bài này, xin kể về cách dùng từ ngữ về gia đình trong tiếng Việt, Thái (của Thái Lan), và Hán (tôi không biết chữ Hán nên sẽ trình bày về nó thông qua dạng Hán - Việt).

Nếu như trong tiếng Hán, "cha mẹ" là "phụ mẫu", thì trong tiếng Thái là "po me" (phát âm với thanh "thô", nằm giữa thanh ngang và thanh sắc của tiếng Việt), nghe rất giống với "bố mẹ", là một phương ngữ phổ biến của miền Bắc.


Python và cách tiết kiệm dung lượng cho phần mềm nhúng

Khi tôi bắt đầu bước chân vào mảng IoT đầu năm 2016, tôi bắt đầu lân la tiếp xúc với cộng đồng làm IoT Việt Nam (trên Facebook là chính). Ở Việt Nam, lực lượng tech làm IoT đa phần là dân điện tử đi lên, thế nên tôi hay gặp những câu hỏi như "nên dùng ngôn ngữ nào để lập trình nhúng" từ những bạn sinh viên mới. Tôi cũng ngạc nhiên khi thấy các bạn kháo nhau dùng NodeJS, theo phong trào.

Nếu cần dùng các ngôn ngữ biên dịch như C++, Go thì không nói. Nhưng nếu dùng ngôn ngữ thông dịch thì Python nên được dùng hơn NodeJS/JavaScript. Một khía cạnh nên tính đến là độ lớn file cần lưu trữ. Các board máy tính nhúng chạy Linux thường dùng thẻ nhớ, hoặc bộ nhớ flash trong (còn có cách gọi khác là NAND Flash, SPI Flash, eMMC) để thay thế ổ cứng (HDD) nên có dung lượng khiêm tốn. Nếu cách lưu trữ không phù hợp, có khi thư viện đã ngốn hết không gian lưu trữ đáng lẽ phải dành cho chương trình và dữ liệu (data).

Thứ nhất, cách quản lý các gói thư viện phụ thuộc của NodeJS cực kỳ tốn dung lượng, với sự trùng lắp các file thư viện.

node_modules

...

Let VirtualBox bridge network adapter work with Alpine Linux guest

There are many times that I need to launch a virtual Linux server to test something. If no Ubuntu specific feature is needed, I often use Alpine Linux for the virtual machine, for its lightness.

When I run a Linux VM, I always need to SSH to it, so in VirtualBox, I need to select "Bridge Adapter" as network adapter. Things just work fine if the guest machine is Ubuntu. But the first time setup for Alpine Linux (as guest machine), it doesn't work and the virtual machine cannot talk DHCP. In that case, you have to do one more step. Under Network Adapter > Advanced, look for "Adapter Type" and change it to "Paravirtualized Network (virtio-net)".

virtio-net

For more info about VirtIO, you can read here: https://www.ibm.com/developerworks/library/l-virtio/

...

Tìm kĩ sư phần mềm - CTO thay thế

Vì lí do gia đình nên từ năm sau mình sẽ dần dần giảm vai trò của mình tại AgriConnect, và cần tìm một "đệ tử chân truyền" để thay mình nối nghiệp lớn. Công việc là đề ra các giải pháp công nghệ phần mềm, mạng, phương thức kết nối giao tiếp trong hệ thống IoT nông nghiệp, đảm bảo quy trình phát triển phần mềm một cách chuyên nghiệp.

Software Engineer

Yêu cầu cho vai trò này như sau (tạm gọi là CTO):

  • Có tâm huyết với ngành nông nghiệp (VN hay ASEAN cũng được).

Dựng mạng VPN với WireGuard

Tiếp nối bài trước, Câu chuyện sử dụng VPN, tôi xin mô tả cách dựng một mạng VPN cho mục đích cá nhân bằng phần mềm WireGuard.

Mục đích sử dụng mạng VPN của tôi chỉ là để truy cập từ xa vào các thiết bị IoT của tôi nên mô hình VPN của tôi chỉ phù hợp với nhu cầu đó. Nếu bạn cần dùng VPN cho mục đích khác, ví dụ để vượt tường lửa, truy cập vào website bị chặn, thì bạn không nên trông đợi gì vào bài viết này.

Trước khi bắt tay vào việc, ta cần mường tượng sơ đồ mạng sẽ như thế nào:

...