Phần mềm để nạp firmware OpenWrt trong chế độ recovery

Gần đây mình lại có duyên đụng vào OpenWrt và router wifi. Mình phải nạp firmware OpenWrt cho một số router đã bị bricked (HĐH bị liệt, không chạy). Vì đã bị bricked nên chỉ có thể nạp trong chế độ recovery, qua cổng serial. Nay mình liệt kê một số phần mềm để dùng cho việc này.

Truy cập qua cổng serial

Để truy cập qua cổng serial, mình dùng PySerial thông qua lệnh sau:

$ pyserial-miniterm /dev/ttyUSB0 115200
...

Xem thông tin phần cứng máy ảnh được nhúng trong file hình

Gần đây mình mua máy ảnh về để tập chụp ảnh. Máy ảnh mình mua là loại DSLR, nhờ vậy mình vô tình khám phá được phần mềm trên Linux xịn cỡ nào.

Câu chuyện là vì mình là người mới tập chơi nên chỉ mua máy secondhand. Mình có người bạn giới thiệu chỗ mua cho mình. Khi mua xong thì anh chàng muốn kiểm tra coi máy mình mua có phải hình dựng không, bằng cách so sánh số serial in trên thân máy và nhúng trong file hình. Bạn đầu, anh đấy dùng website http://shuttercounter.com/, upload ảnh chụp bởi máy lên để xem thông tin. Nhưng sau đó mình phát hiện hóa ra trên Linux cũng có phần mềm làm được chuyện này, là gThumb:

gThumb image properties

Và điểm lợi là phần mềm này miễn phí. Mình so sánh với các phần mềm trên Windows thì không thấy phần mềm miễn phí nào làm được chuyện này.

...

Món cá nướng lá chúc Campuchia

Ngày này 4 năm trước, mình đón năm mới bằng chuyến đi ngẫu hứng qua Campuchia. Ấn tượng sâu đậm nhất còn lưu lại đến hôm nay là món cá nướng giấy bạc ướp lá chúc của nước bạn. Chúc là một loại cây giống như chanh, trái nhăn nheo, lá rất thơm, hay gặp trong ẩm thực Thái Lan, Campuchia. Mình chưa chụp hình lá chúc nên lấy ảnh từ Internet để minh họa.

lá chúc

Địa điểm tìm món này: Sau khi qua cửa khẩu Mộc Bài - Bà Vẹt, đi theo Quốc Lộ 1 đến thị xã Svay Rieng. Ngay cửa ngõ Svay Rieng có một cái hồ lớn, sau khi đi xuyên qua cái hồ này, bạn rẽ trái đi ven bờ hồ. Lúc này bên trái là hồ, bên phải là một dãy nhà thưa thớt, có một vài quán nhậu dựng bằng tre nứa, khách ngồi ăn trên sập. Các quán này có bán món cá nướng kể trê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
...

Tiềm năng ứng dụng thực tế của blockchain & Web3

Mấy nay nghe báo chí ca ngợi về blockchain & Web3 quá nên mình quyết định bước chân vào lĩnh vực này để tìm hiểu coi nó có ứng dụng thực tế gì không. Sau một tháng đọc tài liệu và viết code thử, mình nghĩ là đã tìm thấy câu trả lời.

Mình tìm hiểu về blockchain & Web3 với tâm thế của một người làm kĩ thuật, tức là mình không chỉ đọc khơi khơi. Mình muốn lập trình, làm ra được một ứng dụng cụ thể từ blockchain. Trong số các hệ thống blockchain, mình chọn Solana để nghiên cứu. Mình chọn nó là vì:

  • Nó cho phép lập trình bằng ngôn ngữ Rust. Mình ưu tiên Rust không chỉ vì lý do cảm tính (yêu thích) mà còn vì lý do thực dụng: Đầu tư vào Rust để sau khi làm về blockchain, mình có thể sử dụng Rust để làm việc cho các mảng khác (web, hệ thống nhúng v.v...). Nếu mình theo Ethereum thì phải học ngôn ngữ Solidity, nhưng Solidity chỉ có giá trị với smart contract. Rời blockchain ra thì chẳng dùng Solidity được vào việc gì khác, phí thời gian học tập.
  • Solana có tốc độ xử lý giao dịch nhanh. Theo mình, muốn có ứng dụng thực tế thì phải nhanh. Tương tự như bạn vô một website mà tải chậm thì lần sau bạn chẳng muốn ghé lại nữa.
...

Enable auto-completion for Solana CLI

If you are using the command-line tool for Solana blockchain, you may be tired from remembering and typing its subcommands and options. How to get auto-completion for it?

Thank to great Rust libraries, Solana CLI automatically has a feature to generate auto-completion scripts. It is just that the feature is not mentioned in documentation yet. To generate this script for your shell, just run:

$ solana completion -s <your-shell>
...

Công cụ tra cứu nơi sinh từ mã định danh cá nhân

Gần đây, nhân có vụ lùm xùm hộ chiếu mẫu mới (màu tím than) của Việt Nam bị vài nước từ chối vì thiếu thông tin nơi sinh, mình quyết định làm công cụ online này để tra cứu nhanh: https://vietnam-personal-id.info

Personal ID tool

Hộ chiếu mẫu mới vốn đã in kèm mã định danh cá nhân, và một số thông tin cá nhân như nơi sinh, giới tính, năm sinh vốn đã được mã hóa trong mã định danh cá nhân rồi, nên nếu các cơ quan xuất nhập cảnh sử dụng công cụ này, thủ tục sẽ được giải quyết nhanh chóng.

Đây là một ứng dụng thuần front-end, viết bằng TypeScript, theo framework VueJS 3 và dùng TailwindCSS cho CSS. Ban đầu mình cho nó kết hợp với backend, là trang https://provinces.open-api.vn/ của mình, để tra cứu tỉnh thành từ mã số. Nhưng sau đó, vấn đề dữ liệu phức tạp hơn dự kiến mà một mình trang open-api.vn không đáp ứng đủ. Đó là khi cá nhân được sinh ra ở nước ngoài, thì ba chữ số đầu sẽ tương ứng với mã nước. Mã quốc gia này không thấy quy định ở nơi khác ngoài Thông tư 07/2016/TT-BCA của Bộ Công an, và lấn cấn ở chỗ là dùng tên nước theo cách gọi của tiếng Việt, ví dụ "Bờ Biển Ngà". Thế là mình phải lọ mọ viết thêm một công cụ bằng Python, kết hợp tra cứu, nhập liệu thủ công, để có được tên chính thức của quốc gia. Dữ liệu này làm xong thì cho tích hợp vào front-end luôn. Sau đó thì thấy rằng, dữ liệu mã quốc gia nặng hơn (có tới 196 nước) dữ liệu tỉnh thành mà còn nhúng vào được thì mắc mớ thì dữ liệu tỉnh thành lại phải gọi API bên ngoài để tra cứu, chưa kể trang https://provinces.open-api.vn/ đang bị vượt quá lưu lượng sử dụng nữa. Thế là dẹp backend luôn.

...

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

Lưu đọng dữ liệu Iconify để dùng offline

Là một nhà phát triển web, bạn có thể đã biết đến Iconify, một kho dữ liệu icon dành cho web cực kỳ phong phú, tổng hợp từ nhiều bộ khác nhau (FontAwesome, Material Design v.v...) để đưa về một cách sử dụng chung. Tôi cũng không ngoại lệ, cũng sử dụng Iconnify trong nhiều dự án, vì ngoài việc tích hợp dễ dàng vào dự án, Iconify còn cho phép trộn lẫn nhiều bộ, vì nhiều khi hình ảnh mà tôi cần không tồn tại trong bộ này mà chỉ có ở bộ kia (bạn có thể lo ngại việc trộn lẫn khiến phong cách hình ảnh không thống nhất, đành chịu, vì với người không có khả năng thiết kế thì phải chấp nhận thôi).

Để có được ưu điểm kể trên, Iconify không bắt bạn phải đóng gói hết nội dung icon của các bộ cần dùng, mà dùng cơ chế gọi API để lấy về nội dung của icon khi cần (và nội dung này cũng được lưu trữ tạm để khỏi gọi API lại nhiều lần).

icon api

Với phần lớn trường hợp thì cách làm này là ổn, nhưng một số trường hợp thì nó lại gây băn khoăn. Ví dụ với một sản phẩm IoT, khi mà website đó chạy trong mạng nội bộ, để có thể tự hành khi rớt Internet, hoặc được truy cập ở vùng sâu vùng xa nơi điều kiện Internet không tốt, khi việc gọi API lấy nội dung icon có thể thất bại và ảnh hưởng xấu đến giao diện website. Với những trường hợp như thế thì tôi phải tìm cách thu thập nội dung icon và đính kèm theo website, để không phải gọi API nữa.

...