Khám phá Nushell

Ai dùng Linux thì cũng phải đụng vào shell, với hình thức đơn giản nhất là chạy một chương trình / lệnh nào đó từ Terminal. Khi làm việc với server không có giao diện đồ họa, mọi tác vụ quản lý phải thực hiện qua dòng lệnh thì cũng là lúc ta sử dụng shell ở mức độ nâng cao hơn. Ta sẽ cần viết một lệnh dài để thực hiện nhiều việc theo chuỗi, hoặc viết thành một file script với điếu kiện if else, với vòng lặp để thi hành nhiều tác vụ phức tạp. Tuy nhiên, thật tình mà nói thì các phần mềm shell phổ biến trên Linux như Bash, Zsh tôi đều không thích cú pháp của chúng, nên nếu cần viết lệnh dài, viết ra file script thì tôi sẽ chuyển qua viết script Python. Mọi việc thường là thế cho đến khi tôi bắt gặp Nushell...

Sau khi chạy thử vài dòng lệnh theo bài giới thiệu nhanh, tôi thấy Nu quyến rũ với tư tưởng khá mới mẻ, đó là thiết kế dữ liệu chảy qua các ống dẫn (pipe) là dữ liệu có cấu trúc, có các field, chứ không đơn giản là văn bản text như các shell truyền thống. Để hình dung được ý tưởng này, xét ví dụ sau, là chạy lệnh ls trong Nu:

❯ ls
╭───┬────────────────┬─────────┬─────────┬────────────────╮
...

How to automatically deploy Python web application

Recently I saw a question from a Python fellow, how to deploy Django application without manually SSH to server and run commands. This style is single-server deployment, where you put all components, from the application code, database, to static, media files, in the same server. No Docker involves. With this deployment strategy, we will need some way to deliver new version of our app everytime new code is pushed to the "release" branch of Git repository. Here is a guide.

Why we need automation? Because it is boring to do these things by hand again and again:

  • SSH to the server, cd to the installation folder.
  • Run git pull.
  • Run commands to stop your services.
...

So sánh hệ thống kiểu của Python và TypeScript

Với hơn một nửa công việc hàng ngày là làm web, Python và JavaScript là hai ngôn ngữ mình dùng nhiều. Đây vốn là hai ngôn ngữ "kiểu động" (dynamic type), nhưng mình vẫn tận dụng hệ thống kiểu (type system) của chúng để viết như với một ngôn ngữ "kiểu tĩnh" (static type). Sau một thời gian thì mình rút ra được một số kinh nghiệm để làm việc với hai hệ này.

Thật ra, ngôn ngữ JavaScript không có ký hiệu kiểu, nên nói chính xác hơn là mình đang dùng TypeScript chứ không phải JavaScript. Trước hết, người đã làm quen với JavaScript mà được giới thiệu về TypeScript thì sẽ bật lên một câu hỏi, tại sao chúng là ngôn ngữ dynamic type thì lại mất công viết như static type làm gì. Đó là vì những ích lợi sau:

  • Giúp các công cụ kiểm tra (static analysis) như MyPy, tsc hiểu được code mình, để phát hiện được bug tiềm tàng trong những trường hợp ngách mà mình chưa test.
  • Giúp các trình soạn thảo (code editor, IDE) hiểu được biến đang có kiểu gì, để đưa ra gợi ý autocomplete đúng hơn.
...


Prevent Firefox from being installed as snap package

Though being a long-time Ubuntu user, I still prefer softwares distributed as deb packages to snap. Every time upgrading to new Ubuntu version, I have to repeat the task of removing Firefox snap and install Firefox from deb.

When installing Firefox from APT repositories (like PPA or Mozilla APT repository), we have to set some configuration to prevent Ubuntu from installing Firefox snap again.

This snippet is introduced on Mozilla help page to do that:

...

Món ăn kèm của đồng bào miền núi

Trên hành trình đi bụi qua các địa phương miền núi, ghé quán cơm dọc đường, mình thấy một điểm thú vị là các món ăn kèm, nó thể hiện sự đặc sắc vùng miền thấy rõ.

Ví dụ, trên bàn ăn của khắp vùng Tây Nguyên, từ Đắk Nông tới Kon Tum, luôn luôn có chén cà pháo ngâm mắm, miễn phí. Quán cơm dưới xuôi thì thỉnh thoảng mới có cà pháo mắm tôm, nhưng muốn ăn thì phải kêu, và tính tiền thêm. Còn quán trên này thì lúc bưng cơm ra, chủ quán sẽ tự động cho thêm chén cà. Cà ở đây thường được cắt nhỏ, ngâm với loại mắm gì đó mà mình không nhận ra. Mỗi tỉnh thì cách cắt miếng cà và màu mắm có khác nhau một chút. Ăn xong vẫn còn thòm thèm thì cứ việc kêu thêm, không tính tiền. À, tuy cùng là Tây Nguyên, nhưng ở Lâm Đồng thì mình lại không thấy món này trên bàn.

Cà Tây Nguyên

Người Tây Nguyên mê cà pháo thì người miền núi phía Bắc mê măng ngâm ớt. Tây Bắc mình chưa đi nên không rõ, mới đi phía Đông Bắc là Hà Giang và Cao Bằng thôi, thì vô quán nào cũng thấy để sẵn keo măng. Ai ăn bao nhiêu lấy bấy nhiêu, cũng không tính tiền, cũng như Tây Nguyên.

...

Đến Phú Mỹ (BR-VT) ăn gì

Thị xã Phú Mỹ (tên cũ "Tân Thành", thuộc tỉnh Bà Rịa - Vũng Tàu) không phải là nơi du lịch nổi tiếng. Tuy nhiên nếu lỡ đến đây rồi, thì cũng phải có món ngon đãi khách chứ nhỉ. Sau đây là một số món ăn / quán ăn đáng để thử.

Phú Mỹ

1. Vịt nướng chao

...

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