Viết hàm thêm cho PostgreSQL: Chú voi bay

Vừa rồi tôi đã viết bài Dùng Python viết hàm xử lý dữ liệu dưới tầng database cho PostgreSQL. Sau khi chơi với Python một chút, tôi tự hỏi, có thể tăng tốc độ thực thi thêm nữa không. Thế nên hôm nay tôi nghịch thêm vài cách khác nhau, để gắn thêm tên lửa vào đít chú voi PostgreSQL.

Dumbo Picture credit: Walt Disney

Bây giờ tôi sẽ chuyển đổi code kia sang Cython và Rust.

...

Dùng Python viết hàm xử lý dữ liệu dưới tầng database cho PostgreSQL

Có một bận, tôi ôm trong tay một bộ CSDL của website nọ, với nhiều thông tin danh tính người thật. Để tránh cho dữ liệu danh tính bị lộ, hưởng ứng tinh thần của Luật An Ninh Mạng, tôi quyết định phải làm xáo trộn dữ liệu đó để nó không còn phản ánh danh tính thật nữa. Cụ thể là tôi sẽ ghi thêm vài kí tự bừa bãi vào cột email, cho nó thành email "xạo" hết.

Nói tới nhu cầu này thì cách dễ nhất là viết đoạn code cho nó chạy một vòng lặp, lặp qua các dòng của bảng dữ liệu, tại mỗi dòng lấy ra cột email, ghi nội dung mới vào rồi lưu lại. Cách đó dễ, nhưng hơi cơ bắp, không tinh tế, sẽ chậm khi bảng dữ liệu hơi lớn. Tôi quyết định thử phương án tạo hàm tùy thêm cho hệ CSDL đó, để có thể sửa tất cả trong một câu truy vấn (query) duy nhất, ví dụ:

UPDATE web_users SET email = my_func(email)
...

Mát máy sau khi chuyển từ InfluxDB sang TimescaleDB

Làm việc trong lĩnh vực IoT (Internet of Things) nên tôi khá cần một hệ quản trị cơ sở dữ liệu chuyên dụng cho kiểu dữ liệu time-series (chuỗi thời gian), để lưu trữ dữ liệu do các thiết bị giám sát gửi lên.

Mặc dù IoT dựa trên những cơ sở công nghệ đã được phát triển từ lâu, thậm chí hệ CSDL time-series cũng không phải là khái niệm mới, nhưng mỗi nhà có một nhu cầu, nên mãi cho tới hồi đầu năm nay (2020), vẫn chưa có một hệ cơ sở dữ liệu nào thỏa mãn ý của tôi cả (khi viết bài này thì đã tìm được cái ưng ý).

Vậy nhu cầu của tôi khác với các đơn vị khác như thế nào? Đó là:

...

Một số mẹo cho việc phát triển ứng dụng hệ thống nhúng

Trong quá trình phát triển ứng dụng cho hệ thống nhúng, do sự hạn chế của thiết bị, đôi khi có những việc lắt nhắt làm tốn mớ thời gian. Sau đây mình liệt kê một số mẹo để đi tắt, giúp tiết kiệm thời gian cho công việc. Các hướng dẫn này chỉ dành cho hệ điều hành Linux (như Ubuntu).

1. Chia sẻ Internet từ laptop cho máy tính nhúng

Đây là tình huống mà bạn đang phát triển ứng dụng cho máy tính mini (NUC, Raspberry Pi, Beagle Bone...) và chủ yếu dùng mạng dây (chưa setup wifi hoặc máy đó không có card wifi). Đôi lúc bạn cần phải xách nó đi đâu đó (để trình diễn demo, để cài đặt lại chẳng hạn) mà chỗ đó không có router để cấp mạng, bạn có thể chia sẻ Internet từ laptop (laptop đang kết nối Internet qua wifi) cho nó. Để cho ngắn gọn, mình sẽ gọi máy tính nhúng là RPi trong bài này.

Nguyên lý của việc này là biến laptop của bạn thành một thiết bị router mạng đơn sơ, tạo một mạng con với RPi, do laptop của bạn quản lý.

...

Chuyển đổi Unicode dựng sẵn & tổ hợp với Python

Dạo này các ứng dụng với dữ liệu tiếng Việt đang ngày một nhiều, trong đó vấn đề sai khác giữa Unicode dựng sãn và tổ hợp, tuy nhỏ, nhưng cũng gây mất chút kha khá thời gian debug cho những người mới vào nghề. Mình chia sẻ xíu kinh nghiệm này, để việc phát triển ứng dụng tiếng Việt trở nên trơn tru hơn, và cũng để "khoe hàng" về hệ sinh thái giàu mạnh của Python.

Tưởng tượng một tình huống sau. Ứng dụng của bạn cho người dùng nhập vào một chuỗi tiếng Việt, khi nhận được chuỗi, phần mềm sẽ dò trong cơ sở dữ liệu để chọn ra bản ghi nào ăn khớp với chuỗi đó. Cơ sở dữ liệu này được một người khác nhập liệu. Bạn đã chắc chắn rằng chuỗi đó có tồn tại trong cơ sở dữ liệu, nhưng không hiểu sao phần mềm so sánh, dò tìm không ra. Hóa ra là người nhập liệu, khi gõ chuỗi vào thì dùng Unicode tổ hợp (decomposed), trong khi người dùng lúc nhập chuỗi tìm kiếm vào thì dùng Unicode dựng sẵn (composed). Dưới dạng chuỗi byte thì hai chuỗi này không giống nhau, nên bằng biện pháp so sánh chuỗi unicode thông thường, phần mềm sẽ không nhận ra.

Lấy ví dụ một chuỗi sau, Tiếng Việt bão táp, nếu là Unicode dựng sãn, khi thể hiện dưới dạng chuỗi byte, dàn theo bảng mã UTF-8, thì là chuỗi byte này:

...

Áp dụng quy trình hiện đại khi làm phần mềm cho hệ thống nhúng

Đi qua đi lại một vài đơn vị làm phần mềm nhúng, IoT Việt Nam, mình thấy không hài lòng lắm về cách làm việc hơi cũ. Mình thấy nhiều bạn làm điện tử có thể lập trình được, những vẫn còn một khoảng trống dài về phương pháp làm việc giữa những người này và những người thuần về phần mềm. Thế nên mình viết bài này, hi vọng kéo những người làm phần mềm nhúng tiến lên vài bước cho gần với chuẩn.

Lưu ý: Những cách làm sau đây, ban đầu sẽ gây thiệt thòi vì vẽ ra quá nhiều chuyện để làm, nhưng về lâu dài thì có lợi cho việc tiếp tục phát triển sản phẩm.

1. Chia nhỏ phần mềm thành những gói gần như độc lập

Lấy ví dụ về một hoạt động kiểm nghiệm ý tưởng thiết kế phần mềm tại AgriConnect.


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.

...

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