Dữ liệu chuẩn về bảng mã các địa phương Việt Nam

Dù tình hình dịch bệnh CoVid-19 căng thẳng, mình vẫn ráo riết thực hiện ý tưởng quảng bá dữ liệu mở riêng biệt của Việt Nam và đóng góp vào kho thư viện Python, mong muốn biến Python trở thành ngôn ngữ thân thiện nhất với vấn đề bản địa Việt Nam 🇻🇳

Một thư viện mình đã xuất bản gần đây là VietnamProvinces, cung cấp danh sách tỉnh thành, quận huyện, phường xã Việt Nam cùng mã số.

Vietnam

Lý do ra đời thư viện này là vì mình thấy nhiều công ty ở VN có nhu cầu lưu dữ liệu nghiệp vụ kinh doanh kèm thông tin địa chỉ, và để có thể lọc dữ liệu, xuất báo cáo chính xác thì các quận huyện phải phân loại dưới dạng mã số. Tuy nhiên, có thực tế là mỗi cty có một bảng mã riêng, gây khó khăn cho việc trao đổi dữ liệu qua lại giữa các cty đối tác.


Tạo kho lưu cho các gói thư viện Python

Python là ngôn ngữ chính cho hệ thống backend của AgriConnect. Với đội ngũ giàu kinh nghiệm về Python, luôn đẩy sự khai thác, "bóc lột" Python đến mức cao nữa, cao nữa, nên quá trình vận hành của AgriConnect thường dẫn đến những nhu cầu "không giống ai". Một trong số đó là nhu cầu dựng một kho chứa gói thư viện Python "tại nhà". Bài dưới đây xin chia sẻ kinh nghiệm như thế.

Khi hệ thống của AgriConnect vận hành, tác vụ cài đặt các gói thư viện Python được thực hiện lặp đi lặp lại rất nhiều lần. Chúng đến từ:

  • Hệ thống chạy test tự động, kích hoạt mỗi khi có code mới được đẩy lên Git.

  • Việc deploy bản cập nhật đến các server nội bộ đặt rải rác ở các trang trại khách hàng.

...

Bút nhớ USB tốc độ cao

Thời gian vừa qua, do có việc hay phải tạo Live USB để cài Windows cho bạn bè nên tôi có dịp test tốc độ của bút nhớ USB.

File ISO của Windows 10 rất nặng (5GB) nên việc ghi vào USB rất tốn thời gian. Tôi vốn có sẵn một chiếc SanDisk chuẩn 3.0 và sau đó, do cái SanDisk đang bận dùng cho việc khác, tôi tìm mua thêm một chiếc USB khác, rồi vô tình mua trúng Moment chuẩn USB 3.1 Gen 1, hàng Đài Loan. Khi xả file ISO của Windows 10 vào chiếc Moment, tôi ngạc nhiên thấy tốc độ nhanh gấp nhiều lần chiếc SanDisk cũ. Không biết tại sao. Đọc trên Wiki thì thấy nói USB 3.1 Gen 1 không có cải tiến gì về tốc độ so với 3.0:

USB 3.1 preserves the existing SuperSpeed transfer rate, giving it the new label USB 3.1 Gen 1


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

...