Tự dựng proxy để truy cập web nước ngoài nhanh hơn

Mấy bữa nay, nghe đâu cáp Internet đại dương lại bị đứt, khiến việc truy cập website nước ngoài rất khó khăn. Tuy nhiên đường truyền tại các datacenter trong nước thì vẫn nhanh như lũ về, cho nên nếu đi ké được qua đường truyền này thì ngon. Ta có thể làm việc ấy bằng cách tự dựng proxy, để "bẻ lái" đường truy cập từ nhà đến datacenter rồi từ datacenter ra thế giới.

Trước tiên, phải nhắc nhở rằng bài hướng dẫn này không dành cho tất cả mọi người, mà nó dành cho "nhà có điều kiện". "Điều kiện" ấy là bạn phải có một server trong nước. Bạn có thể tự thuê cá nhân hay xài ké server công ty. Và như thường lệ, bài hướng dẫn này áp dụng cho hệ điều hành Linux, cụ thể là Ubuntu 20.04.

Phía server

Để nói cụ thể hơn thì phần mềm proxy mà ta sẽ dùng thuộc thể loại HTTP proxy, tức là nó chỉ chuyển hướng các truy cập website (giao thức HTTP/HTTPS). Các phần mềm game, chat dùng giao thức riêng thì sẽ phải dùng các loại proxy khác.

...

Khắc phục tình trạng VPN WireGuard bị treo

Trước đây tôi có viết bài Dựng mạng VPN với WireGuard . Sau một thời gian sử dụng, để ý thấy do các máy con (client) của tôi thỉnh thoảng xảy ra tình trạng treo WireGuard: từ các máy khác không ping đến nó được. Vì vậy tôi lại tiếp tuc đề tài WireGuard này, giới thiệu một cách khắc phục.

Trước tiên, xin nêu vài nguyên nhân khiến VPN WireGuard bị treo:

  • WireGuard của năm 2018 (lúc tôi viết bài trên) được nạp lên hệ thống dưới dạng DKMS. Như ta đã biết, khác với các giải pháp VPN thông thường, WireGuard chạy dưới dạng một driver/module của nhân Linux. Nhưng khi được phân phối ở dạng DKMS, mỗi lần máy được nâng cấp nhân mới thì module này phải trải qua quá trình build lại từ mã nguồn bên ngoài. Điều này đôi khi gây ra tình trạng, phiên bản cũ vẫn còn lơ lửng trong RAM và phiên bản mới chưa thế chân vào được, thế là WireGuard bị treo. Từ Linux 5.6 trở đi thì WireGuard đã được tích hợp vào nhân, không còn ở dạng DKMS nữa nên tình trạng này không còn.

  • Network interface của WireGuard (ví dụ wg0) được khởi tạo khi máy vẫn chưa thực sự kết nối với Internet (sai thứ tự), việc kết nối với server VPN không thành công, khiến việc cấu hình không hoàn tất. Hoặc khi đang chạy ngon bỗng dưng Internet bị rớt, mất luôn mối kết nối với server. Điều này hay xảy ra với các máy con (client) vì các máy này không được đảm bảo luôn có Internet, thậm chí là không phải lúc nào cũng có điện.

...

Giao diện mới

Hôm nay, sau rất nhiều năm tạo website cá nhân này, tôi mới có một đợt tu sửa giao diện đầu tiên.

new ui

Nhìn qua thì không khác gì mấy với giao diện cũ: vẫn thanh điều hướng màu cam trên đỉnh, với dòng chữ Playground to đùng phía dưới. Thực ra, sự thay đổi lớn nhất là nằm trong code: Đổi framework CSS từ Bootstrap v3 sang TailwindCSS v2, bỏ jQuery và thay bằng AlpineJS. Kết quả lớn nhất của sự thay đổi này là sửa được lỗi thanh điều hướng trong màn hình điện thoại như sau:

Before ...

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.

...