[Công nghệ Thông tin] -- [Web] -- [Công nghệ phần mềm] -- [PhoThong] -- [Đăng ký các khóa học] -- [Langbiang's Portfolio] -- [Học viên cũ] -- [10.000 giờ]
--------------- <> -----------------
---  KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM --->>>  CÁC KHÓA HỌC...
---  Nhận làm website, web app, chạy quảng cáo, digital marketing --->>>  LIÊN HỆ...

Tìm kiếm trong Blog

Web back-end (13) - Lập trình client-server

Bài trước: Web back-end (12) - Ứng dụng client-server

-----
13. Lập trình client-server
13.1 Gửi request tới web server

Ở các phần trước, chúng ta đã có trải nghiệm với lập trình client-server. Tuy nhiên, chúng ta mới chỉ dừng lại mức độ làm theo hướng dẫn, mà chưa hiểu được cơ chế giao tiếp, cách thức xử lý giữa client và server. 

Phần này, chúng ta sẽ tìm hiểu chi tiết hơn về lập trình giao tiếp giữa client và server.

Như đã đề cập, các bước xử lý ở web server gồm 7 bước, như hình sau:

Cụ thể, 7 bước xử lý gồm:

[1] nhận request

[2] phân tích request, gửi tới ứng dụng web để xử lý

[3] đọc dữ liệu từ cơ sở dữ liệu

[4] đổ dữ liệu vào trang HTML (các template HTML)

[5] gửi trang HTML (đã bao gồm dữ liệu) (response) về trình duyệt người dùng

[6] trình duyệt người dùng hiển thị nội dung response

[7] trình duyệt gửi riêng một request khác để lấy các nội dung tĩnh của ứng dụng web (HTML, CSS, JavaScript, hình ảnh, và các tài nguyên khác)

Để đơn giản, chúng ta sẽ lập trình theo tình huống sau:

- Bước 1: web server luôn ở trạng thái đang hoạt động, sẵn sàng chờ client gửi yêu cầu (request) tới.

- Bước 2: một người dùng bất kỳ, sử dụng trình duyệt web, gửi request tới web server.

- Bước 3: web server nhận request

- Bước 4: web server phân tích, xử lý request

- Bước 5: web server gửi response về client

- Bước 6: client (trình duyệt) nhận response, hiển thị thông tin lên trình duyệt.

Chúng ta cùng lập trình từng bước.

Bước 1: web server luôn ở trạng thái đang hoạt động, sẵn sàng chờ client gửi yêu cầu (request) tới

Mở tập tin index.js nhập đoạn mã sau:

[index.js]

'use strict'

const express = require('express')

const app = express();

const port = process.env.PORT || 9000

 

 

// khoi dong web server

app.listen(port, () => {

    console.log(`server dang chay tren cong ${port}`);

});

Dòng mã app.listen() luôn được đặt ở cuối tập tin index.js. Dòng mã này sẽ khởi chạy web server, mở cổng có số hiệu là port (ví dụ 9000) để chờ đón các request từ client; đồng thời xuất một dòng thông báo server dang chay tren cong ${port}.  Hiểu nôm na, hàm app.listen() giống như hành động mở cửa của tiệm bán quần áo, mời bà con vào mua. Tiệm quần áo là một kiot trong chợ, có số hiệu là 9000. Trong chợ có rất nhiều kiot bán quần áo, với các số hiệu khác nhau.

Mở cửa sổ dòng lệnh, chạy lệnh node index.js hoặc nodemon để thực thi mã nguồn index.js.

Lưu ý dòng thông báo server dang chay tren cong ${port} sẽ xuất ở cửa sổ console tại máy web server, chứ không phải cửa sổ console của máy client. Bạn không tắt cửa sổ console này, vì tắt nó là web server sẽ ngừng hoạt động.

Bước 2: một người dùng bất kỳ, sử dụng trình duyệt web, gửi request tới web server

Khi web server đang chạy, và sẵn sàng nhận request. Chúng ta sẽ sử dụng trình duyệt để gửi các request về web server.

Để gửi request về web server, bạn có thể sử dụng thanh địa chỉ của trình duyệt, web form, hoặc dùng hàm JavaScript (AJAX, fetch). Để đơn giản, chúng ta sẽ sử dụng thanh địa chỉ của trình duyệt.

Mở trình duyệt web (tuy nhiên, bạn phải hiểu là mở trình duyệt trên máy tính của người dùng, vì đang trong giai đoạn phát triển phần mềm, nên máy web server và máy người dùng sẽ chạy chung trên một máy), gõ vào thanh địa chỉ URL sau:

http://localhost:9000/?name=shoes&size=40

Bấm Enter, bạn sẽ nhận được thông báo trên trình duyệt là:

Cannot GET /

Lý do có thông báo trên: client gửi request về web server, tuy nhiên, server mới chỉ mở cổng (9000) để lắng nghe request, nhận request, nhưng chưa có xử lý request và gửi trả lời (response) cho client. Nó giống như kiot đã mở bán, nhưng bên trong chưa có sản phẩm, chưa có người bán (kiot trống).

URL (Uniform Resource Locator) là địa chỉ duy nhất, dùng để định vị tài nguyên trên web, như trang HTML, API, hoặc tập tin tài nguyên tĩnh (ví dụ hình ảnh, âm thanh). Bạn có thể xem URL giống như địa chỉ của kiot.

Ví dụ một số URL:

- Định vị một trang web: https://www.example.com/index.html

- Gọi một API: https://api.example.com/v1/users/123

- Trỏ tới một hình ảnh: https://www.example.com/images/logo.png

- Định vị một ứng dụng web (trên máy cục bộ): http://localhost:9000/

Cú pháp của một URL:

protocol://domain:port/path?query#fragment

Giải thích các thành phần của một URL:

- protocol (giao thức): xác định phương thức giao tiếp mà trình duyệt sử dụng để giao tiếp với server. Các giao thức phổ biến bao gồm http (Hypertext Transfer Protocol) và https (Hypertext Transfer Protocol Secure).

- domain (tên miền): tên của máy server. Ví dụ: google.com, wikipedia.org, localhost.

- port (cổng) (tùy chọn): số cổng mà server sử dụng để lắng nghe yêu cầu (request). Cổng mặc định cho http là 80 và cho https là 443.

- path (đường dẫn): đường dẫn đến một vị trí (thư mục, tập tin, API) trên server. Ví dụ: /images/logo.png, /articles/how-to-use-url, /users.

- query (truy vấn) (tùy chọn): chuỗi các tham số được sử dụng để truyền dữ liệu đến server. Ví dụ: ?name=shoes&size=40.

- fragment (phân mảnh) (tùy chọn): một phần cụ thể của tài nguyên, thường là một phần của trang HTML. Ví dụ: #section-2.

Như vậy, URL http://localhost:9000/?name=shoes&size=40

Có nghĩa là:

- Client sử dụng giao thức http để gửi request tới web server

- Web server có địa chỉ là localhost

- Gửi request vào cổng 9000 của web server

- Gửi request, có kèm theo 2 tham số là name=shoes và size=40

Ngoài việc dùng thanh địa chỉ của trình duyệt để gửi request, chúng ta còn có 2 cách khác để gửi request là web form và hàm JavaScript (AJAX, fetch). Chúng ta sẽ tìm hiểu về web form, AJAX, fetch ở các phần sau.

13.2 Gửi response về client

Bước 3: web server nhận request, Bước [4] phân tích, xử lý request, Bước [5] gửi kết quả (response) về cho client

Tại web server, chúng ta sử dụng phương thức GET của Express để nhận và xử lý các HTTP request kiểu GET (request gửi bằng giao thức HTTP) do client gửi tới.

Cú pháp:

app.get(path, callback)

Trong đó:

- path: luồng dùng để xử lý các request kiểu GET (GET request). 

- callback: hàm sẽ được thực thi khi có GET request đến luồng tương ứng. Hàm này thường có dạng (req, res) => { ... }, trong đó: 

  + req (request): đối tượng chứa thông tin request từ client.

  + res (response): đối tượng dùng để gửi response về client.

Client có thể gửi nhiều loại request về web server, ví dụ: GET, POST, PUT, DELETE. Chúng ta dùng thanh địa chỉ của trình duyệt để gửi request, mặc định đó là request kiểu GET.

Dấu “/” trong http://localhost:9000/?name=shoes&size=40, có nghĩa là thư mục gốc.

Chúng ta sẽ viết đoạn mã xử lý như sau:

[index.js]

'use strict'

const express = require('express')

const app = express();

const port = process.env.PORT || 9000

//xử lý khi người dùng gửi

//request kiểu GET tới thư mục gốc (/)

app.get("/", (req,res) => {

    //dùng phương thức query của req để lấy thông tin

    //của GET request

    const product = req.query.name;

    const size = req.query.size;

    //dùng hàm send() của đối tượng res

    //để gửi dữ liệu về client

    res.send(`Bạn muốn mua ${product} cỡ ${size}`);

});

//khoi dong web server

app.listen(port,() => {

    console.log(`server dang chay tren cong ${port}`);

});

Lưu lại mã nguồn, khởi động lại web server (nếu dùng Nodemon thì không cần).

Bước 6: client (trình duyệt) nhận response, hiển thị thông tin lên trình duyệt

Mở trình duyệt, nhập đường vào đường dẫn URL: http://localhost:9000/?name=shoes&size=40

Trên trình duyệt sẽ xuất hiện dòng chữ.

Bạn muốn mua shoes cỡ 40

Bạn có để ý là: đoạn mã app.listen() luôn được chạy trước, mặc dù nó nằm phía dưới đoạn mã app.get(). Về mặt xử lý: có thể hiểu nôm na app.listen() là động tác mở cửa kiot, chào đón khách tới mua hàng. Trong khi các đoạn mã phía trên là việc trưng bày hàng hóa, bán hàng, thanh toán. Như vậy, chúng ta sẽ trưng bày hàng hóa, sau đó, mở cửa hàng (app.listen()). Chờ có khách tới mua (request) thì sẽ thực hiện việc bán hàng, thanh toán.

Chúng ta sẽ tìm hiểu về kiến trúc của Nodejs, Express, lập trình hướng sự kiện ở các phần sau để hiểu rõ hơn về cách xử lý mã nguồn của ứng dụng web trên nền Express và Nodejs.

13.3 Bài tập

Bài tập 13.1 Viết đoạn mã thực hiện yêu cầu sau:

Từ trình duyệt, người dùng gửi GET request, có kèm theo MSSV, HoTen, DiemTrungBinh của một sinh viên. Ví dụ:

MSSV:11223344

HoTen:Nguyễn Văn Tèo

DiemTrungBinh:7.0 

Web server nhận request trên, lấy thông tin từ request và gửi về client dòng thông báo có nội dung và định dạng như sau:

Chào bạn Nguyễn Văn Teo

MSSV: 11223344

Điểm trung bình của bạn là: 70

Chúc bạn học chăm!

Câu hỏi 13.2 URL (Uniform Resource Locator) là gì? Phát biểu nào sau đây không đúng?

A. URL là một địa chỉ duy nhất xác định vị trí của một tài nguyên trên Internet.

B. URL bao gồm các thành phần như giao thức, tên miền, đường dẫn, truy vấn và phân mảnh.

C. Phần "truy vấn" (query) trong URL được sử dụng để truyền dữ liệu đến máy chủ thông qua các tham số.

D. Giao thức "FTP" là giao thức phổ biến nhất được sử dụng trong URL để truy cập các trang web.

-----

Cập nhật: 31/3/2025
-----
Bài sau:

Web back-end (12) - Ứng dụng client-server

Bài trước: Web back-end (11) - Lập trình giao diện
-----
12. Ứng dụng client-server
12.1 Ứng dụng kiểu cục bộ

Trước khi tìm hiểu về ứng dụng kiểu client-server, chúng ta cùng tìm hiểu về ứng dụng kiểu cục bộ (gọi tắt là ứng dụng cục bộ).

Ứng dụng cục bộ

Ứng dụng cục bộ (local application) là các ứng dụng chạy trực tiếp trên thiết bị của người dùng, như máy tính cá nhân, điện thoại hoặc máy tính bảng, mà không cần kết nối liên tục với máy chủ ở xa.

Một số đặc điểm của ứng dụng cục bộ:

- Chạy độc lập: ứng dụng cục bộ được cài đặt và chạy trực tiếp trên thiết bị của người dùng, không phụ thuộc vào kết nối internet để thực hiện các chức năng cơ bản.

- Truy cập tài nguyên thiết bị: ứng dụng cục bộ có thể truy cập trực tiếp vào các tài nguyên của thiết bị, chẳng hạn như hệ thống tập tin, phần cứng và các ứng dụng khác.

- Hiệu suất cao: do chạy trực tiếp trên thiết bị, ứng dụng cục bộ thường có hiệu suất cao hơn so với các ứng dụng web hoặc ứng dụng dựa trên đám mây.

- Khả năng ngoại tuyến: nhiều ứng dụng cục bộ có thể hoạt động mà không cần kết nối Internet, cho phép người dùng làm việc khi không có mạng.

- Bảo mật: dữ liệu của ứng dụng cục bộ thường được lưu trữ trên thiết bị của người dùng, giúp tăng cường bảo mật và quyền riêng tư.

Ví dụ một số ứng dụng cục bộ: Microsoft Word, Excel, Photoshop, Premiere, Notepad, các trò chơi máy tính.

Lập trình ứng dụng cục bộ

Có thể bạn đã rất quen thuộc với lập trình ứng dụng cục bộ, ví dụ khi bạn làm các bài tập của môn Nhập môn lập trình, Kỹ thuật lập trình, Lập trình hướng đối tượng, dùng ngôn ngữ C, C++, C#, Java hoặc Python.

Dù bạn lập trình theo kiểu hướng cấu trúc hay hướng đối tượng thì cấu trúc của một chương trình thường là: 

- Có một điểm vào chương trình (entry point) là hàm main().

- Khi chạy hàm main() sẽ xuất ra một menu, hoặc một màn hình chính (main window).

- Chờ các tương tác của người dùng để xử lý, thực thi các xử lý logic, đọc dữ liệu, xuất kết quả.

- Sử dụng một trình dịch (trình thông dịch hoặc biên dịch) trên máy cục bộ để chuyển từ mã nguồn thành mã thực thi.

- Sử dụng các bộ thư viện cục bộ, truy cập cơ sở dữ liệu trên máy cục bộ.

12.2 Ứng dụng kiểu client-server

Ứng dụng kiểu client-server (gọi tắt là ứng dụng client-server) là một ứng dụng, trong đó công việc được phân chia giữa hai thành phần chính là client và server.

- Client (máy khách): gửi yêu cầu (request) để truy cập dịch vụ hoặc tài nguyên. Client là giao diện người dùng (UI) trên máy tính, điện thoại, hoặc trình duyệt.

- Server (máy chủ): nhận yêu cầu, xử lý, và gửi phản hồi (response) về client. Server lưu trữ dữ liệu, thực hiện xử lý logic, và cung cấp dịch vụ.

- Giao tiếp giữa client và server được thực hiện qua mạng (thường dùng giao thức HTTP, TCP/IP). Client và server chạy trên các thiết bị khác nhau. Tuy nhiên, trong giai đoạn phát triển phần mềm, client và server có thể chạy trên cùng một máy tính.

Đặc điểm của một ứng dụng client-server:

- Phân vai trò: client tập trung hiển thị, server tập trung xử lý logic, xử lý dữ liệu.

- Kết nối mạng: yêu cầu giao tiếp qua giao thức mạng như HTTP, WebSocket, TCP/IP.

Một số ứng dụng client-server: ứng dụng web, ứng dụng email, trò chơi trực tuyến, hệ quản trị cơ sở dữ liệu.

12.3 Ứng dụng web dưới góc nhìn của lập trình viên

Ứng dụng web dưới góc nhìn của lập trình viên:

- Là ứng dụng kiểu client-server. Client là trình duyệt web, server là web server.

- Giao diện của ứng dụng được hiển thị trên trình duyệt web.

- Hầu hết các xử lý logic, xử lý dữ liệu được thực hiện tại server.

- Để lập trình phía client (client-side) cần các ngôn ngữ HTML, CSS, JavaScript, các thư viện và framework. Lập trình phía client được gọi là lập trình front-end. Người làm mảng công việc này được gọi là lập trình viên front-end (front-end developer).

- Để lập trình phía server (server-side) cần một trong các ngôn ngữ lập trình phía back-end (C#, Java, Python, Ruby, PHP, Go, JavaScript), SQL, các thư viện, và framework. Lập trình phía server được gọi là lập trình back-end. Người làm mảng này được gọi là lập trình viên back-end (back-end developer)

- Người làm được cả front-end và back-end được gọi là full-stack developer.

- Tùy theo khả năng, một lập trình viên có thể chọn làm ở mảng front-end, hoặc back-end hoặc cả hai (full-stack). Dù làm ở mảng front-end thì bạn cũng phải biết căn bản về mảng back-end và ngược lại.

Xem hình minh họa.

Trình duyệt web thường gồm 3 vùng sau:

- [1] Menu, và thanh công cụ của trình duyệt web

- [2] Thanh địa chỉ (address bar): cho phép người dùng gửi yêu cầu (request) tới một trang web, website hoặc ứng dụng web.

- [3] Giao diện của trang web, website hoặc ứng dụng web.

Xem hình minh họa: giao diện của một ứng dụng web.

12.4 Bài tập

Câu hỏi 12.1 Ứng dụng cục bộ là gì? Phát biểu nào sau đây không đúng?

A. Ứng dụng cục bộ chạy trực tiếp trên thiết bị của người dùng mà không cần kết nối liên tục với máy chủ ở xa.

B. Ứng dụng cục bộ luôn yêu cầu kết nối internet ổn định để hoạt động hiệu quả.

C. Ứng dụng cục bộ có thể truy cập trực tiếp vào các tài nguyên của thiết bị như hệ thống tệp và phần cứng.

D. Dữ liệu của ứng dụng cục bộ thường được lưu trữ trên thiết bị của người dùng, giúp tăng cường bảo mật và quyền riêng tư.

Câu hỏi 12.2 Ứng dụng kiểu client-server là gì? Phát biểu nào sau đây không đúng?

A. Client tập trung chủ yếu vào việc hiển thị giao diện người dùng, trong khi server tập trung xử lý logic và dữ liệu.

B. Giao tiếp giữa client và server thường được thực hiện qua mạng, sử dụng các giao thức như HTTP, WebSocket hoặc TCP/IP.

C. Client và server luôn phải chạy trên các thiết bị riêng biệt, không bao giờ có thể cùng chạy trên một máy tính.

D. Server có nhiệm vụ nhận yêu cầu từ client, xử lý chúng, và gửi phản hồi lại cho client.

-----
Cập nhật: 28/3/2025
-----
Bài sau: Web back-end (13) - Lập trình client-server

Python thực hành (4) - Gỡ lỗi chương trình

Bài trước: Python thực hành (3) - Cú pháp của Python

-----
4. Gỡ lỗi chương trình

Như đã đề cập, để tạo ra một chương trình trong Python, chúng ta cần thực hiện 5 bước:

-  Phân tích bài toán và thiết kế thuật toán

- Lập trình

- Thông dịch và thực thi

- Kiểm thử và gỡ lỗi

- Hiển thị kết quả 

Ở  các phần trước chúng ta đã làm quen với một số bước như lập trình, thông dịch và thực thi, hiển thị kết quả.

Phần này, chúng ta sẽ tìm hiểu về Gỡ lỗi chương trình.

4.1 Gỡ lỗi chương trình

Trong lập trình, "lỗi" (bug) là những sai sót trong mã nguồn của chương trình khiến chương trình không hoạt động như mong đợi. Lỗi có thể dẫn đến nhiều kết quả khác nhau, từ việc chương trình bị treo, đưa ra kết quả sai, hoặc thậm chí gây ra sự cố bảo mật.

Các loại lỗi thường gặp: 

- Lỗi cú pháp (syntax error)

- Lỗi logic (logical error)

- Lỗi khi chạy (runtime error)

- Lỗi kiểu dữ liệu (type error)

- Lỗi tràn bộ nhớ (memory overflow)

- Lỗi bảo mật (security vulnerability)

Gỡ lỗi là gì?

Gỡ lỗi (debugging) là quá trình tìm kiếm và loại bỏ các lỗi trong mã nguồn của chương trình máy tính.

Để gỡ lỗi, chúng ta thực hiện theo các bước sau:

- Xác định lỗi: dựa vào thông báo lỗi, kiểm tra kết quả đầu ra chương trình, hoặc sử dụng các công cụ gỡ lỗi để xác định xem chương trình đang bị lỗi gì? Ở dòng mã nào?

- Phân tích lỗi: phân tích, phỏng đoán xem tại sao lại có lỗi.

- Sửa lỗi: khi đã biết được lỗi, chúng ta sẽ thực hiện sửa lại mã nguồn để chương trình chạy đúng.

- Kiểm tra lại: chạy lại chương trình để đảm bảo không còn lỗi.

4.2 Thực hành gỡ lỗi

Lỗi cú pháp

Lỗi cú pháp (syntax error) là loại lỗi xảy ra khi mã nguồn của chương trình vi phạm các quy tắc cú pháp của ngôn ngữ lập trình. Nói một cách đơn giản, lỗi cú pháp xảy ra khi bạn viết mã nguồn không đúng "ngữ pháp" mà ngôn ngữ lập trình đó yêu cầu.

Ví dụ 1:

Bạn tạo một chương trình Python, ví dụ loiCuPhap1.py với nội dung sau:

[loiCuPhap1.py]

# dòng mã sau bị lỗi cú pháp

print("hi ban Teo"

Mở chương trình cửa sổ dòng lệnh, thực thi chương trình, bạn sẽ nhận được thông báo lỗi như sau:

E:\pythonLabs>py loicuphap1.py

  File "E:\pythonLabs\loicuphap1.py", line 1

    print("hi ban Teo"

         ^

SyntaxError: '(' was never closed

Khi gặp lỗi, việc đầu tiên là đọc và hiểu thông báo lỗi nói gì?

Ví dụ, ở lỗi phía trên, máy tính thông báo là:

- Lỗi xảy ra ở hàng số 1 (line 1), trong tập tin loiCuPhap1.py

- Đây là lỗi cú pháp (Syntax Error), xảy ra tại dấu (^), nội dung lỗi là: có mở ngoặc nhưng không đóng ( ‘(‘ was never close).

- Cách sửa lỗi: là tìm tới vị trí bị lỗi: dòng số 1 trong tập tin loiCuPhap1.py, thêm dấu )

- Chạy lại chương trình sẽ không còn lỗi nữa, thấy có dòng chữ hi ban Teo xuất ra màn hình.

Ví dụ 2:

Tạo một chương trình Python, ví dụ loiCuPhap2.py với nội dung sau:

[loiCuPhap2.py]

# dòng mã sau bị lỗi cú pháp

a = 3

if a > 0:

print("a là số dương")

Mở chương trình cửa sổ dòng lệnh, thực thi chương trình, bạn sẽ nhận được thông báo lỗi như sau:

E:\pythonLabs>py loicuphap2.py

  File "E:\pythonLabs\loicuphap2.py", line 4

    print(f"{a} là số dương")

    ^^^^^

IndentationError: expected an indented block after 'if' statement on line 3

- Đọc thông báo, để xác định lỗi

- Lỗi xảy ra ở hàng số 4 (line 4), trong tập tin loiCuPhap2.py

- Đây là lỗi cú pháp (cụ thể là lỗi liên quan đến thụt lề - IndentationError), xảy ra tại dấu (^^^^^), nội dung lỗi là: mong đợi một dấu thụt lề cho đoạn mã sau lệnh if ở dòng số 3.

- Cách sửa lỗi: là tìm tới vị trí bị lỗi: dòng số 4 trong tập tin loiCuPhap2.py, thụt lề cho lệnh print()

- Chạy lại chương trình sẽ không còn lỗi nữa, thấy có dòng chữ 3 là số dương xuất ra màn hình.

4.3 Lập trình cũng là một cách để học tư duy

Tư duy (thinking) là gì?

Tư duy là cách mà bộ não của chúng ta suy nghĩ, giải quyết vấn đề hoặc hiểu về thế giới xung quanh. Nó giống như một "công cụ" trong đầu giúp ta tưởng tượng, phân tích, và đưa ra quyết định. Nói đơn giản, tư duy là khi bạn dùng đầu óc để nghĩ xem làm thế nào để làm một việc gì đó hoặc hiểu một điều gì đó.

Bạn nào chỉ chờ có hướng dẫn từng bước để làm theo thì khác gì cái máy, mình là con người mà, phải hơn cái máy chứ! Biến cái máy (máy tính, robot, chatbot, AI) trở thành công cụ để hỗ trợ con người trong quá trình tư duy, làm việc.

Một số ví dụ về tư duy.

Khi bạn chơi cờ:

- Bạn không chỉ di chuyển quân cờ một cách ngẫu nhiên, mà còn suy nghĩ về những nước đi tiếp theo của mình và của đối thủ.

- Bạn dự đoán những tình huống có thể xảy ra, và tìm ra những chiến thuật tốt nhất.

- Đó chính là tư duy chiến lược.

Khi bạn viết văn:

- Bạn không chỉ viết ra những câu văn đơn giản, mà còn suy nghĩ về cách diễn đạt ý tưởng của mình một cách rõ ràng và hấp dẫn.

- Bạn sắp xếp các ý tưởng theo một trình tự logic, và sử dụng ngôn ngữ một cách sáng tạo.

- Đó chính là tư duy sáng tạo.

Khi bạn sửa chữa một đồ vật bị hỏng:

- Bạn không chỉ thử một cách ngẫu nhiên, mà còn suy nghĩ về nguyên nhân gây ra hỏng hóc.

- Bạn phân tích cấu tạo của đồ vật, và tìm ra cách sửa chữa hiệu quả nhất.

- Đó chính là tư duy logic và phân tích.

Tư duy giúp chúng ta:

- Hiểu rõ hơn về thế giới xung quanh.

- Giải quyết vấn đề một cách hiệu quả.

- Đưa ra những quyết định sáng suốt.

- Sáng tạo ra những ý tưởng mới. 

- Học hỏi và phát triển bản thân.

Tư duy là một kỹ năng rất quan trọng, và chúng ta có thể rèn luyện nó bằng cách đọc sách, học hỏi, và thực hành.

Thông qua lập trình, bạn sẽ rèn luyện các phương pháp tư duy sau:

- Tư duy của một nhà toán học: sử dụng ngôn ngữ hình thức (ngôn ngữ lập trình) để biểu thị các ý tưởng.

- Tư duy của một kỹ sư: thiết kế mọi thứ, lắp ráp các thành phần thành một hệ thống và đánh giá kết quả khi thay đổi các giải pháp.

- Tư duy của một nhà khoa học: quan sát hành vi của các hệ thống phức tạp, hình thành giả thuyết và kiểm nghiệm các dự đoán.

4.4 Bài tập

Bài tập 4.1 Tìm lỗi, ghi lại lỗi và sửa lỗi cú pháp sau:

[baiTap4_1.py]

# dòng mã sau bị lỗi cú pháp

printer("hi ban Ti")

Bài tập 4.2 Tìm lỗi, ghi lại lỗi và sửa lỗi cú pháp sau:

[baiTap4_2.py]

# đoạn mã sau bị lỗi cú pháp

a = 6

b = 5

print(''ket qua: '')

print(a + b)

Câu hỏi 4.3 Lỗi lập trình là gì? Phát biểu nào sau đây không đúng?

A. Lỗi lập trình là những sai sót trong mã nguồn khiến chương trình không hoạt động như mong đợi.

B. Lỗi lập trình chỉ xảy ra khi chương trình đang chạy, không thể xảy ra trong quá trình viết mã (lập trình).

C. Lỗi lập trình có thể dẫn đến nhiều kết quả khác nhau, từ việc chương trình bị treo đến gây ra sự cố bảo mật.

D. Các loại lỗi lập trình thường gặp bao gồm lỗi cú pháp, lỗi logic, và lỗi kiểu dữ liệu.

Câu hỏi 4.4 Tư duy là gì? Phát biểu nào sau đây không đúng?

A. Tư duy là cách mà bộ não của chúng ta suy nghĩ, giải quyết vấn đề hoặc hiểu về thế giới xung quanh.

B. Tư duy giúp chúng ta hiểu rõ hơn về thế giới xung quanh, giải quyết vấn đề hiệu quả và đưa ra quyết định sáng suốt.

C. Tư duy là một kỹ năng quan trọng có thể rèn luyện bằng cách đọc sách, học hỏi và thực hành.

D. Tư duy chỉ đơn thuần là việc làm theo các hướng dẫn có sẵn, không cần suy nghĩ sáng tạo.

-----
Cập nhật: 28/3/2025
-----
Bài sau:
-----
Bài tiếp (theo lộ trình học tiếng Anh + Lập trình): Python căn bản ():

Web back-end (11) - Lập trình giao diện

Bài trước: Web back-end (10) - Hàm callback
-----

11. Lập trình giao diện

11.1 Commit đầu tiên

Sau các bài học về chủ đề JavaScript, các bạn đã có thể hiểu được cách viết mã trong tập tin index.js. Đã hiểu về lập trình bất đồng bộ, hàm mũi tên, hàm ẩn danh.

Chúng ta cũng đã thiết lập được môi trường lập trình ban đầu, gồm dựng web server, cài đặt một số module cần thiết (express, nodemon).

Quản lý mã nguồn là một kỹ năng cần thiết, vì vậy, nếu bạn chưa biết về nó thì có thể học các bài sau.

5. Git thực hành (5) - Các khu vực làm việc của Git (tiếp)

4. Git thực hành (4) - Các khu vực làm việc của Git

3. Git thực hành (3) - Cấu hình định danh người dùng 

2. Git thực hành (2) - Tổng quan về Git

1. Git thực hành (1) - Hệ thống quản lý phiên bản

Chúng ta sẽ tạo tập tin .gitignore trong thư mục dự án (TeoShop).

Nội dung của .gitignore các bạn tự tạo ra hoặc tốt nhất là lấy nội dung ở đây: https://github.com/github/gitignore/blob/main/Node.gitignore

Thực hiện commit đầu tiên (thực hiện theo các lệnh được tô đậm sau đây, để ý thông tin hiển thị sau mỗi lệnh):

E:\TeoShop>git status

On branch master

 

No commits yet

 

Untracked files:

  (use "git add <file>..." to include in what will be committed)

        .gitignore

        index.js

        package.json

        pnpm-lock.yaml

 nothing added to commit but untracked files present (use "git add" to track)

E:\TeoShop>git add .

warning: in the working copy of 'package.json', LF will be replaced by CRLF the next time Git touches it warning: in the working copy of

'pnpm-lock.yaml', LF will be replaced by CRLF the next time Git touches it

E:\TeoShop>git status

On branch master

No commits yet

Changes to be committed:

  (use "git rm --cached <file>..." to unstage)

        new file:   .gitignore

        new file:   index.js

        new file:   package.json

        new file:   pnpm-lock.yaml

E:\TeoShop>git commit -m "Initialize TeoShop project with Express and Nodemon"

[master (root-commit) 7857e02] Initialize TeoShop project with Express and Nodemon

 4 files changed, 749 insertions(+)

 create mode 100644 .gitignore

 create mode 100644 index.js

 create mode 100644 package.json

 create mode 100644 pnpm-lock.yaml

E:\TeoShop>git log

commit 7857e02e34142614edc2d685102d7658c02776c6 (HEAD -> master)

Author: Nguyen Van Ti <tinv@gmail.co>

Date:   Fri Mar 21 10:21:35 2025 +0700

    Initialize TeoShop project with Express and Nodemon

11.2 Sử dụng Free HTML template

Free HTML Template là gì

Free HTML Template là các mẫu giao diện web được thiết kế sẵn, bao gồm HTML, CSS, và đôi khi JavaScript, được cung cấp miễn phí từ các nguồn như ThemeForest (miễn phí giới hạn), BootstrapMade, FreeHTML5.co, htmlcodex, hoặc GitHub. Chúng thường có giao diện đẹp, cấu trúc cơ bản (header, footer, sidebar), và phù hợp cho nhiều loại dự án như blog, portfolio, hoặc trang doanh nghiệp nhỏ.

Khi nào nên sử dụng Free HTML Template trong dự án

- Dự án nhỏ, thời gian gấp: template giúp tiết kiệm thời gian thiết kế giao diện từ đầu.

- Khách hàng cần prototype nhanh: dùng để trình bày ý tưởng ban đầu.

- Ngân sách thấp: phù hợp khi khách hàng không đủ chi phí thuê thiết kế riêng.

Cách sử dụng

- Tải về: chọn template từ nguồn uy tín, kiểm tra giấy phép (thường là Creative Commons hoặc MIT).

- Tùy chỉnh: điều chỉnh CSS, thay đổi nội dung (văn bản, hình ảnh), tích hợp back-end (như Node.js, PHP).

- Tối ưu: nén CSS/JS, kiểm tra responsive, đảm bảo tốc độ tải trang.

Ưu điểm khi dùng template

- Tiết kiệm thời gian.

- Giao diện chuyên nghiệp: template thường được thiết kế bởi chuyên gia, đảm bảo thẩm mỹ (ví dụ: bố cục gọn gàng, màu sắc hài hòa).

- Học hỏi: phân tích mã nguồn của template để học các kỹ thuật thiết kế.

Nhược điểm

- Giới hạn tùy chỉnh: sẽ bị thiếu một số tính năng, vì mỗi dự án của bạn sẽ có những đặc thù riêng.

- Mã nguồn dư thừa: template thường có CSS/JS không cần thiết, làm chậm trang.

- Không độc đáo: dùng template miễn phí dễ trùng lặp với web khác, gây khó cho khách hàng nếu họ muốn tạo thương hiệu riêng.

Tải HTML template

Vào trang: https://htmlcodex.com/

Chọn một template tùy ý để tải về máy. Ví dụ chọn mẫu bootstrap-ecommerce-template

Khi tải về máy template có dạng tập tin nén .zip (bootstrap-ecommerce-template.zip). Bạn giải nén > chép vào thư mục dự án (TeoShop) > đổi tên thành public.

11.3 Static files

Trong Express, static files (tập tin tĩnh) là các tập tin không thay đổi nội dung hoặc không cần xử lý logic phía server, như HTML, CSS, JavaScript, hình ảnh, font. Chúng được gửi trực tiếp cho client thông qua middleware express.static.

Các tập tin tĩnh được chứa trong một thư mục riêng (ví dụ: public).

Mục đích static files:

- Tối ưu hóa hiệu suất: việc gửi trực tiếp tập tin tĩnh từ máy chủ giúp giảm tải cho ứng dụng Express, cải thiện tốc độ tải trang.

- Tổ chức dự án: giúp cấu trúc dự án rõ ràng, dễ quản lý hơn.

- Bảo mật: chỉ cho phép truy cập các tập tin được công khai, bảo vệ các tập tin quan trọng khác.

Đọc thêm về static files ở đây: https://expressjs.com/en/starter/static-files.html

Ở phần trên, chúng ta đã đổi tên template thành public. 

Chúng ta sẽ lập trình để người dùng có thể truy cập vào thư mục public.

Trong tập tin index.js thêm dòng mã:

app.use(express.static(__dirname + '/public'));

[index.js]

const app = express();

const port = process.env.PORT || 9000

 

// cấu hình static files

app.use(express.static(__dirname + '/public'));

 

// xu ly khi nguoi dung gui request toi web server

app.get("/", (req, res) => {

Nếu máy bạn chưa cài Nodemon, bạn phải khởi động lại web server, sau đó mở trình duyệt, truy cập vào web app (http://localhost:9000/) để xem kết quả.

Kết quả trên trình duyệt:


Hiểu về dòng mã: // cấu hình static files

app.use(express.static(__dirname + '/public'));

- app.use(): là phương thức của đối tượng app (ứng dụng Express), sử dụng để đăng ký middleware có tên là express.static().

- express.static(): là một middleware tích hợp sẵn trong Express, được sử dụng để gửi các tập tin tĩnh như CSS, JavaScript, hình ảnh. Nó nhận một tham số là đường dẫn đến thư mục chứa các tập tin tĩnh.

- __dirname: là một biến toàn cục trong Node.js, đại diện cho đường dẫn tuyệt đối đến thư mục chứa tập tin JavaScript hiện tại đang chạy (index.js).

- /public: là đường dẫn tương đối đến thư mục public trong thư mục dự án của bạn. Thư mục public thường được sử dụng để chứa các tập tin tĩnh.

Tóm lại, dòng mã trên sẽ trả về cho người dùng trang tĩnh (mặc định, ví dụ index.html) trong thư mục public, khi người dùng nhập đường dẫn http://localhost/9000

Chúng ta sẽ tìm hiểu về lập trình client-server và middleware ở phần tiếp theo.

11.4 Bài tập

Bài tập 11.1 Cài đặt các đoạn mã trong bài học.

Câu 11.2 Free HTML template là gì? Phát biểu nào sau đây không đúng?

A. Free HTML template là các mẫu giao diện web được thiết kế sẵn, bao gồm HTML, CSS, và đôi khi JavaScript, được cung cấp miễn phí.

B. Free HTML template thường có giao diện đẹp, cấu trúc cơ bản (header, footer, sidebar), và phù hợp cho nhiều loại dự án như blog, portfolio, hoặc trang doanh nghiệp nhỏ.

C. Sử dụng Free HTML template tốn nhiều thời gian, phù hợp cho các dự án lớn.

D. Free HTML template cho phép bạn tùy chỉnh CSS, thay đổi nội dung (văn bản, hình ảnh), tích hợp back-end (như Node.js, PHP).

Câu 11.3 Static files (tập tin tĩnh) trong Express là gì? Phát biểu nào sau đây không đúng?

A. Static files là các tập tin không thay đổi nội dung hoặc không cần xử lý logic phía server.

B. Static files được gửi trực tiếp cho client thông qua middleware express.static.

C. Mục đích của static files là tối ưu hóa hiệu suất, tổ chức dự án và bảo mật.

D. Không nên đặt các static files trong thư mục public.

-----
Cập nhật: 22/3/2025
-----
Bài sau: Web back-end (12) - Ứng dụng client-server