Truy xuất mảng trong JavaScript một cách an toàn

Gần đây mới biết rằng trong JavaScript, khi truy xuất một phần tử trong mảng sau khi kiểm tra trước độ dài của mảng, thì vẫn không đảm bảo được rằng phần tử đó tồn tại.

Ví dụ trong đoạn code 1, biến "first" tại dòng 3 có thể bị undefined, dẫn đến "tz" tại dòng 4 cũng bị undefined theo. Lý do là mảng trong JS là mảng thưa, cho phép các vị trí phần tử không liên tục. Tức là có thể có phần tử ở vị trí 1 mà không có ở vị trí 0.

function useFirst(items: Date[]) {
  if (items.length) {
...

Lập trình nhúng, Rust đã có những gì?

Rust là một ngôn ngữ hiện đại dành cho lập trình hệ thống và rất phù hợp cho việc lập trình nhúng. Nếu bạn làm trong lĩnh vực điện tử, IoT và muốn thử áp dụng Rust mà đang phân vân vì chưa biết có đủ "đồ chơi" hay chưa, có thể tham khảo bài viết dưới đây.

Ferris

Trước hết, nhắc lại những ưu điểm khiến Rust đáng để thử. Sau khi dùng Rust thì tôi thấy:

  • Giúp tăng năng suất làm việc. Sự chặt chẽ của Rust khiến lập trình viên tránh bug từ sớm, và giảm đáng kể thời gian, công sức test đi test lại. Thông thường, người lập trình nhúng hay phải nạp xuống board thường xuyên để chạy thử. Nhưng với Rust, tôi có thể viết code chay liền tù tì cả tháng mà không cần nạp xuống board. Ở AgriConnect Khi tôi bắt tay vào viết những dòng code đầu tiên của dự án thì thực ra đội điện tử chỉ mới xong bản vẽ chứ chưa làm mạch. Khi mạch thử nghiệm vừa hàn xong thì code cũng gần xong. Do làm việc từ xa nên tôi cũng không trực tiếp nạp code mà nhờ bạn khác trên văn phòng kéo code từ Git về, build, nạp, quan sát log và báo lại lỗi để tôi sửa tiếp. Tính chất này của Rust có lợi cho việc phát triển song song giữa đội phần cứng và đội lập trình.
...


How to play Zoo Tycoon 2001 in Ubuntu

Zoo Tycoon is one of my favourite games. Though I played it the first time around 2003, today, after more than 20 years, I still miss it. It is a Windows game, and I have switch to Linux for more than ten years, I still want to play it. Here is how to play it on Ubuntu.

Zoo Tycoon on Ubuntu

This article assumes that you already have its two CDs as ISO files. I cannot tell where to download them.

Released in 2001, where PCs are just 32-bit, this game can only run in 32-bit environment. This is a key to remember.

...

Effectly copy part of code file from remote machine

Let's say you have a source code file on a remote machine (accessed via SSH) and you want to copy a portion of the content to your local machine. There are many ways to do this, but I want to present an effective way, as it will take advantage of Helix's very convenient block selection feature.

For example, in the following image, the window on the left is accessing a remote machine, via SSH, on which I am opening a source code file using Helix. The window on the right is an editor, e.g. Geany, of your local machine. I want to copy the source of the enable_mqtt_on_gsm_modem function to Geany. In the left window, we should use a slightly modern Terminal application, e.g. Kitty, WezTerm, Alacritty because of a feature that I will explain later.

Figure 1

On the source file, we'll move the cursor to any line inside the enable_mqtt_on_gsm_modem body, then press m. Helix will bring up a menu of m command, let's press a to select "Select around object". Helix then shows the menu of m a.

...

Sao chép nội dung một phần file code từ máy ở xa

Giả sử bạn có một file source code trên máy ở xa (truy cập qua SSH) và bạn muốn sao chép một phần nội dung sang máy trước mặt. Có nhiều cách để làm, nhưng tôi muốn trình bày một cách hiệu quả, vì sẽ tận dụng tính năng chọn khối rất tiện lợi của Helix.

Ví dụ trong hình sau, cửa sổ bên trái là đang truy cập vào một máy ở xa, qua SSH, trên đó tôi đang mở một file source code bằng Helix. Cửa sổ bên phải là một trình soạn thảo, ví dụ Geany, của máy trước mặt. Tôi muốn sao chép source của hàm enable_mqtt_on_gsm_modem sang Geany. Cửa sổ bên trái, ta nên dùng một ứng dụng Terminal hiện đại một tí, ví dụ Kitty, WezTerm, Alacritty vì một tính năng mà tôi sẽ giải thích sau.

Hình 1

Bên file nguồn, ta sẽ di chuyển con trỏ đến bất cứ dòng nào phía trong thân hàm enable_mqtt_on_gsm_modem, sau đó nhấn m. Helix sẽ hiện ra menu của lệnh m, nhấn a để chọn "Select around object". Sau đó Helix lại hiện ra menu của "m a".

...

Những quán ăn ngon Quận 9 (Tp Thủ Đức)

Sống ở Quận 9 (nay là một phần Tp Thủ Đức) một thời gian, mình thỉnh thoảng chạy tới chạy lui ăn thử các quán để khám phá chỗ ăn ngon mà ít người biết đến. Nay xin giới thiệu một vài địa điểm:

  1. Tam Đa quán

Ấn tượng là món lẩu bò có nhiều khoai môn. Nồi lẩu có 150.000đ mà ngon, hai người ăn đủ no. Mặc dù mình nhấn mạnh khoai môn, nhưng thịt bò cũng không ít.

Các món khác cũng ngon và rẻ:

...

Thư viện ghi log cho ứng dụng Python

Trong quá trình phát triển phần mềm, ghi log là một hoạt động quan trọng phục vụ cho người lập trình. Khi một chương trình chạy không như mong muốn, ta cần phải biết sai chỗ nào để sửa. "Ghi log" là bắt chương trình của ta "kể lại" diễn biến hoạt động của nó, giá trị của một vài biến lúc ấy, để giúp ta kiểm tra lại được chỗ nào sai.

Vậy mình thường dùng thư viện nào cho việc ghi log?

Như đã đề cập trong bài "Khởi đầu dự án Python như thế nào để thuận tiện phát triển lên", Python có một thư viện chuẩn logging, mà điểm lợi là khi các thư viện cùng dùng nó, ta có thể từ tầng ứng dụng điều chỉnh "log level" cho tầng thư viện mà không cần can thiệp vào code của thư viện ấy. Vì lẽ đó, đương nhiên các ứng dụng của mình cũng dùng logging nhưng cũng kèm thêm một số thư viện bổ trợ khác để thỏa mãn nhu cầu / sở thích cá nhân.

Một trong những nhu cầu của mình là cần màu sắc phân biệt, để truy tìm điểm cần tìm cho dễ, ít nhất là các log level cần có màu sắc khác nhau để dễ dàng lọc lựa, bỏ qua thông điệp ít quan trọng. Về khoản màu sắc thì mình ưa dùng thư viện rich. Nó thậm chí còn hơn cả mong đợi vì nó còn nhận diện và tô màu theo "kiểu dữ liệu", ví dụ dữ liệu số có màu khác, dữ liệu chuỗi, đối tượng... có màu khác.

...

Máy pha cafe phù hợp xe đẩy

Vừa rồi lang thang ở Quận 12, Tp HCM, mình bắt gặp một máy pha cafe khá sáng tạo của người Việt, phù hợp với mô hình xe đẩy bán cafe:

máy cafe VN

Điều đặc biệt của mẫu máy pha cafe này là:

  • Chiếm ít không gian.
...

Lập trình ESP32 với Rust: cập nhật firmware OTA

AgriConnect, anh em đã sử dụng Rust để lập trình firmware cho ESP32 (và cả một phần backend của nền tảng IoT). Từ hôm nay tôi sẽ bắt đầu một loạt bài nhằm giúp những đồng đội trên hành trình này. "Cập nhật firmware qua mạng (OTA / over-the-air)" là bài chia sẻ đầu tiên vì đây là chủ đề mà một trong những tác giả của esp-idf-hal đã đề nghị tôi viết.

Để có tính năng cập nhật firmware OTA, esp-if-svc đã cung cấp API rồi, nhưng còn thiếu tài liệu hướng dẫn sử dụng API, cách chuẩn bị phân vùng để sử dụng API. Bài viết này là để bổ sung chỗ thiếu đó.

(English version is here.)

Chuẩn bị phân vùng

...