Ứng dụng CLI để tăng hiệu suất trong công việc

Ứng dụng CLI để tăng hiệu suất trong công việc

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Hẳn là nhiều người ở đây đã nghe đến kiểu tấn công bảo mật Clickjacking rồi nhỉ. Kẻ tấn công thường nhúng một website (thường là mục tiêu) vào trong một iframe trên website của chúng, sau đó làm mờ hoặc ẩn nó đi rồi đặt vào vị trí các nút bấm trên web, ví dụ "Bấm vào để nhận quà". Đâu ai ngờ rằng phía trên nút bấm đó là một nút bấm khác trong iframe. Khá nguy hiểm!

    Nhưng trình duyệt đã có cách ngăn chặn kiểu tấn công này bằng các quy tắc như tiêu đề X-Frame-Options, frame-ancestors của CSP và SameSite: Lax/Strict của Cookies...

    Mới đây, đã xuất hiện thêm kiểu tấn công mới - "DoubleClickjacking" 😨. Đại ý là "hắn" lợi dụng hành động double click để lừa người dùng bấm vào một nút mà hắn muốn. Chi tiết hơn trong bài viết này: DoubleClickjacking: A New Era of UI Redressing.

    » Xem thêm
  • Mọi người đã nghe nói đến Jujutsu - jj - một dạng quản lý phiên bản cho mã nguồn (version control system) chưa? Có vẻ như nó đang nhận được nhiều sự quan tâm.

    Chờ xíu! Chẳng phải git đã quá tốt rồi sao? Thế thì chế ra thằng jj để làm gì nữa? Cũng hơi khó trả lời nhỉ? Mỗi công cụ sinh ra chắc chắn phải cải thiện hoặc khắc phục được nhược điểm của cái trước. Cho nên jj ắt hẳn phải làm được điều gì đó mà git chưa làm được nên mới nổi lên như vậy.

    Thật ra mình đã nghe nói đến jj từ vài tháng trước rồi, nhưng vào đọc thì toàn kiến thức cao siêu. Hoặc là đang mang nặng cái lối suy nghĩ của git vào trong đầu rồi nên chưa lĩnh hội ra được điều gì cả.

    Mình hay có kiểu cái gì đọc lần 1 mà không hiểu thì đọc tiếp lần 2, lần 2 không hiểu thì đọc tiếp lần 3... đến lần thứ n mà vẫn không hiểu thì bỏ. Cơ mà không phải là từ bỏ mà một thời gian sau đó quay lại đọc tiếp. Đến một lúc nào đó khả năng mình sẽ hiểu ra một ít vấn đề, thế mới tài 😆.

    Thì cái jj này có vẻ như nó đang mở ra được tính linh hoạt trong việc "cam kết" mã. Tưởng tượng bạn đang làm việc trên một dự án, đang ở nhánh này, muốn sang nhánh khác để sửa, nhưng mà lại đang viết dở ở nhánh này, thế là phải stash, rồi checkout, rồi commit, rồi merge hoặc rebase lại vào nhánh cũ... nhìn chung quá trình làm việc với git nghiêm ngặt đến mức cứng nhắc, cần nhiều thao tác để giải quyết một vấn đề, chưa kể cái cây commit (commit-tree) nữa thì ôi thôi, khỏi xem cho đỡ nhức mắt. Thế nên ông jj này đang làm cách nào đó để bạn khỏi cần phải quan tâm đến các nhánh luôn, sửa trực tiếp vào commit. Nghe ảo nhỉ 😂.

    Đấy mới lĩnh hội được đến đấy, hy vọng sau n lần đọc lại nữa mình sẽ viết được một bài chi tiết hơn về công cụ này.

    » Xem thêm
  • Gòi gòi tới công chiện gòi 🤤🤤🤤

    » Xem thêm

Vấn đề

Là một lập trình viên, tôi tin chắc rằng ai cũng đã nghĩ đến việc tận dụng những dòng code để "sai khiến" nó làm một việc gì đó tự động. Lấy ví dụ như là một đoạn mã JavaScript được một lập trình viên nào đó viết ra, để tính tổng số tiền mà bạn đã "nướng" vào một sàn thương mại điện tử nào đó, thay vì phải ngồi cộng từng đơn hàng trong danh sách kéo mãi không biết bao giờ mới hết.

Việc tự động hóa mang lại nhiều lợi ích, dễ thấy nhất đó là tiết kiệm thời gian và giảm sai sót cho một tiến trình lặp đi lặp lại. Mặt khác, nếu thấy đoạn mã mà mình viết ra có thể chia sẻ được cho người khác thì đúng là một công đôi việc.

Tôi cũng hay tạo ra những dòng mã như vậy, nhưng thay vì đếm giá trị đơn hàng thì chúng lại tập trung giải quyết một vấn đề hay gặp phải trong công việc hơn. Lấy ví dụ như là một đoạn mã giúp đồng bộ hóa dữ liệu giữ hai máy chủ production với development của trang blog này. Bởi vì đôi khi cần thử nghiệm tính năng mới trên dữ liệu thật cho an toàn trước khi đưa nó vào môi trường "sản xuất".

Tôi thường lưu trữ các mã này vào một nơi nào đó, ví dụ như trong ứng dụng ghi chú của hệ điều hành, để nó được đồng bộ đến tất cả nơi tôi làm việc, và sau này có gặp một vấn đề gì đó thì sẽ mở ra, "copy" lại và "paste" vào cho nó chạy. Thật sáng suốt!

Đấy chỉ là một ví dụ đơn giản cho cách tự động hóa công việc lặp đi lặp lại. Vài tuần trước, khi tôi đang tập trung tối ưu hóa hình ảnh cho blog thì vấn đề trở nên rắc rối hơn. Nếu cứ "copy" rồi "paste", chỉnh sửa lại nội dung cho nó chạy, thì lại tốn nhiều thời gian hơn. Tôi chợt phát hiện những đoạn mã như thế lại chỉ phù hợp với những công việc có tần suất sử dụng thấp, dụ như 1 ngày chỉ sử dụng 1 lần thôi, hmm.. kiểu như thế.

Nói đến đây thì có lẽ bạn đọc cũng đang hình dung ra cách giải quyết vấn đề cho mình. Tôi biết là có nhiều cách để làm, riêng tôi thì chọn cách tạo ra một ứng dụng CLI làm tất cả công việc trên.

CLI là gì?

Giao diện dòng lệnh (CLI) là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành của mình thông qua bàn phím. Một cơ chế trái ngược với CLI là giao diện người dùng đồ họa (GUI).

Điểm mạnh của GUI là điều hướng một cách trực quan, như bấm vào các biểu tượng và hình ảnh để sử dụng phần mềm, ứng dụng đó. Tuy nhiên, GUI không hiệu quả đối với các tác vụ quản trị hệ thống, đặc biệt là với môi trường ảo hoặc từ xa.

Với CLI, bạn có thể nhập các lệnh văn bản để định cấu hình, điều hướng hoặc chạy các chương trình trên bất kỳ máy chủ hoặc hệ thống máy tính nào. Tóm lại là CLI tập trung vào tính năng và tốc độ sử dụng.

CLI khá là rộng lớn khi nhắc đến, nhưng trong phạm vi bài viết này, thì tôi chỉ muốn nói đến khả năng ứng dụng CLI trong các ứng dụng phần mềm. Hiểu đơn giản CLI là các ứng dụng bằng dòng lệnh mà chúng ta gõ gõ hàng ngày trong Terminal, khi đó cd, ls, pwd... cũng có thể coi là các ứng dụng phần mềm để giúp chúng ta thực hiện một chức năng nào đó.

Khi nào cần tạo cho mình một CLI?

Quay trở lại với bài toán tối ưu hóa hình ảnh mà tôi có một bài viết Tối ưu hóa hiển thị hình ảnh bằng blur placeholder và lazyload. Có nhiều bước cần làm để tạo ra một hình ảnh sử dụng được trong bài viết của blog. Nhưng tựu chung lại thì có hai hành động chính:

Thứ nhất là định dạng lại hình ảnh về dạng webp, điều chỉnh chất lượng hình ảnh và cắt hình để cho ra kích thước mong muốn.

Thứ hai là tải tất cả hình ảnh vừa tạo ra lên R2, đồng thời lấy được tất cả liên kết đến chúng.

Nếu áp dụng phương pháp "copy paste" như ở đầu bài thì có phần rườm rà. Như vậy, để quản lý tập trung và tiết kiệm thời gian gõ phím, thì tạo ra một ứng dụng CLI trong trường hợp này là hết sức hợp lý.

Tưởng tượng, ứng dụng của tôi có tên là img, khi muốn tạo ra tất cả hình ảnh đã được tối ưu hóa, chỉ cần chạy:

$ img all path/to/file

Với path/to/file là đường dẫn đến ảnh gốc. Sau khi chạy xong, hình ảnh mới được tạo ra sẽ lưu vào path/to/new/file. Lúc này, tôi tạo thêm một lệnh upload nữa cho hành động tải ảnh lên R2:

$ img upload path/to/new/file

Hoàn hảo, mọi thứ hoạt động. Nhưng chưa hết, một điểm cộng của CLI đó là nó hỗ trợ tham số (args) và các cờ (flag), dựa vào flag, chúng ta còn có thể tạo ra nhiều trường hợp (options) xử lý phong phú hơn nữa.

Ví dụ, tôi muốn ngay sau khi tất cả hình ảnh được tạo ra thì tải lên R2 luôn thay vì tốn thêm một lệnh upload nữa thì viết thêm mã xử lý cho cờ --upload hoặc viết tắt là -u:

$ img all path/to/file --upload
# hoặc
$ img all path/to/file -u

Dĩ nhiên trên đây chỉ là giả thuyết, ứng dụng CLI có thể làm được nhiều hơn tùy vào cách của mỗi người. Vì thế bạn có thể thoải mái biến tấu các lệnh và các cờ theo sở thích của mình, nhưng với một lưu ý là nó phải rõ ràng và dễ nhớ, dễ sử dụng.

Cách tạo một CLI đơn giản

Ứng dụng CLI không giới hạn ở bất kỳ ngôn ngữ nào, nếu bạn đang làm Golang, hãy tìm kiếm thư viện hỗ trợ tạo CLI cho Go. Tương tự, tôi làm Node.js thì oclif giúp tôi làm điều này. Ngoài oclif ra thì còn nhiều thư viện giúp bạn tạo ra được ứng dụng CLI, hãy dành thời gian tham khảo chúng, nếu thấy cú pháp thân thiện, dễ sử dụng thì hãy chọn. Tham khảo thêm nhiều thư viện khác tại Command-line utilities | awesome-nodejs Public | Github.

oclif tương đối đơn giản để bắt đầu. Chỉ cần làm theo hướng dẫn Introduction | oclif docs là ngay lập tức chúng ta đã có một "lệnh" của riêng mình.

$ npx oclif generate mynewcli
? npm package name (mynewcli): mynewcli
$ cd mynewcli
$ ./bin/dev.js hello world
hello world! (./src/commands/hello/world.ts)

oclif hỗ trợ tạo tự động một lệnh mới (CLI Generator), Flag/Argument parsing, Testing, Autocomplete và nhiều tính năng khác. Bạn đọc tham khảo thêm tại Features | oclif docs.

Tổng kết

CLI là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành, phạm vi của CLI tương đối rộng nhưng trong phạm vi bài viết này, chúng ta tìm hiểu việc ứng dụng CLI để tạo ra một phần mềm cho riêng mình.

Nếu như trước đây, cách tôi thường làm là lưu lại các đoạn mã thường dùng để khi cần chỉ việc "copy paste" để chạy chúng thì việc tạo ra CLI sẽ đơn giản hóa quá trình này, đồng thời giúp tiết kiệm thời gian sử dụng.

oclif là một thư viện giúp tạo CLI đơn giản bằng Node.js. Ngoài ra nếu bạn đang sử dụng một ngôn ngữ nào khác thì hãy tìm kiếm một thư viện phù hợp cho mình nhé!

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Ẩn danh1 năm trước
đúng là một bài viết hay tôi muốn đọc thêm nhiều bài viết như thế này ưnax
Trả lời
Avatar
Xuân Hoài Tống1 năm trước
Bạn có thể cho phép blog "gửi thông báo" khi có bài viết mới để không bị bỏ lỡ nhiều bài hấp dẫn trong tương lai 🙌
Bấm hoặc cuộn mạnh để sang bài mới