Bài viết dành cho lập trình viên

Giải thích các định dạng mã hóa, làm việc với JSON và các chủ đề khác hữu ích cho lập trình viên, kèm liên kết đến các công cụ trực tuyến tulzy tương ứng.

Mã hóa

Base64: mã hóa để làm gì và hoạt động ra sao

Base64 biến dữ liệu nhị phân thành văn bản ASCII như thế nào và khi nào thực sự cần đến nó.

Base32: khác gì với Base64 và khi nào tiện hơn

Bảng chữ cái Base32 không phân biệt hoa thường và các trường hợp nó tiện hơn Base64.

URL Encode/Decode: percent-encoding trong liên kết

Các ký tự đặc biệt trong địa chỉ và tham số trở thành chuỗi %XX như thế nào.

HTML Entities: cách hiển thị ký tự đặc biệt an toàn

Vì sao các ký tự < > & cần được escape và điều đó giúp tránh hỏng mã HTML thế nào.

JWT: cấu trúc token và "giải mã" JWT nghĩa là gì

Header, payload và signature của JWT, và vì sao giải mã không giống với xác minh chữ ký.

Unicode Escape: chuỗi \uXXXX nghĩa là gì

Chuỗi kiểu \u0041 trong JSON và chuỗi JS đến từ đâu và chúng nghĩa là gì.

ROT13 và mật mã Caesar: thay thế ký tự đơn giản

Vì sao dịch 13 chữ cái khiến ROT13 tự nghịch đảo, và vì sao ngày nay người ta vẫn dùng nó.

Punycode: tên miền quốc tế hóa hoạt động thế nào trong DNS

Một tên miền chứa ký tự không phải Latinh trở thành dạng ASCII với tiền tố xn-- như thế nào.

Mã Morse: văn bản biến thành chấm và gạch ra sao

Nguyên lý mã hóa chữ cái thành chấm và gạch, và mã Morse còn được dùng ở đâu hiện nay.

Data URI: khi nào nên nhúng hình ảnh trực tiếp vào mã

Một Data URI nhúng nội dung tệp trực tiếp vào HTML hoặc CSS ra sao, và khi nào đáng làm vậy.

Gzip + Base64: nén dữ liệu để truyền dưới dạng văn bản

Vì sao dữ liệu nhị phân đã nén còn được mã hóa Base64 trước khi đưa vào trường văn bản.

XML Entities: escape ký tự trong tài liệu XML

Năm entity XML bắt buộc, thiếu chúng tài liệu sẽ hỏng khi phân tích cú pháp.

JSON

JSON Formatter: định dạng, thu gọn và xác thực

Định dạng để dễ đọc, thu gọn để giảm dung lượng, xác thực để đảm bảo đúng — ba việc khác nhau với JSON.

JSONPath: truy vấn dữ liệu JSON mà không cần phân tích thủ công

JSONPath giúp lấy ra giá trị cần thiết từ một JSON lớn chỉ bằng một biểu thức thay vì duyệt thủ công như thế nào.

JSON Diff: so sánh cấu trúc khác gì so sánh văn bản

Vì sao thứ tự khóa không nên ảnh hưởng đến việc so sánh hai tài liệu JSON.

JSON Schema: cách mô tả và xác thực cấu trúc của JSON

JSON Schema giúp tự động kiểm tra xem dữ liệu có khớp với hợp đồng mong đợi hay không như thế nào.

JSON Flatten: biến cấu trúc lồng nhau thành danh sách phẳng

JSON lồng nhau sâu biến thành danh sách phẳng các khóa như user.address.city ra sao.

JSON Sort Keys: vì sao cần sắp xếp khóa của object

Vì sao thứ tự khóa JSON không được quy định, nhưng sắp xếp vẫn hữu ích trong thực tế.

JSON Repair: vì sao JSON bị hỏng và cách sửa

Nguyên nhân phổ biến khiến JSON "hỏng" và những gì sửa tự động có thể và không thể khắc phục.

Mock JSON Generator: dữ liệu giả dùng để làm gì

Dữ liệu giả giúp bắt đầu xây dựng giao diện trước khi backend sẵn sàng như thế nào.

JSON ↔ YAML/CSV/XML/TOML: khi nào và vì sao cần chuyển đổi

Dữ liệu nào bị mất khi chuyển JSON sang CSV, và vì sao YAML cùng TOML phổ biến cho tệp cấu hình.

Văn bản

Case Converter: vì sao có các kiểu đặt tên khác nhau

Vì sao trong một dự án, biến được viết camelCase nhưng tệp lại kebab-case, và những quy tắc này đến từ đâu.

Text Diff: thuật toán tìm sự khác biệt giữa hai văn bản như thế nào

Thuật toán diff tìm tập hợp thay đổi tối thiểu giữa hai phiên bản văn bản như thế nào.

Biểu thức chính quy: cú pháp cơ bản và các mẫu thường gặp

Cách đọc một biểu thức chính quy, và khớp tham lam khác khớp lười ra sao.

Sắp xếp và loại bỏ dòng trùng lặp: dùng để làm gì

Vì sao sắp xếp theo số đặt "10" trước "9" là một lỗi, và cách tránh điều đó.

String Escape: vì sao cùng một văn bản cần escape khác nhau

Vì sao cùng một dấu ngoặc kép lại được escape khác nhau trong chuỗi JS, JSON và lệnh shell.

CRLF so với LF: vì sao ký tự cuối dòng vẫn còn quan trọng

Vì sao một tệp được viết trên Windows có thể hiển thị là "toàn bộ đã thay đổi" trong git trên Linux.

Đếm ký tự và từ: vì sao không phải lúc nào cũng đơn giản

Vì sao một emoji hoặc chữ có dấu có thể được tính là nhiều ký tự cùng lúc.

Lorem Ipsum: văn bản giữ chỗ đến từ đâu và dùng để làm gì

Vì sao các nhà thiết kế cố tình dùng văn bản "vô nghĩa" thay vì nội dung thật trong bản phác thảo.

Slugify: cách biến bất kỳ văn bản nào thành URL

Một tiêu đề như "Xin chào, Thế giới! Bạn khỏe không?" biến thành chuỗi tương thích URL như xin-chao-the-gioi-ban-khoe-khong ra sao.

Markdown: vì sao cú pháp văn bản đơn giản đánh bại trình soạn thảo phức tạp

Vì sao lập trình viên chọn viết tài liệu bằng Markdown thay vì trình soạn thảo văn bản định dạng phong phú.

Khoảng trắng và ký tự vô hình: nguyên nhân ẩn giấu của các lỗi kỳ lạ

Vì sao hai chuỗi trông giống hệt nhau có thể không khớp do một ký tự vô hình.

Text Reverse: vì sao "đảo ngược văn bản" khó hơn tưởng tượng

Vì sao đảo ngược chuỗi ngây thơ có thể biến một emoji thành các byte không sử dụng được.

Phân tích tần suất văn bản: vì sao cần đếm số lần từ lặp lại

Tần suất chữ cái trong văn bản mã hóa giúp phá vỡ các mật mã thay thế đơn giản nhất như thế nào.

Hash/Mật mã

Hash Generator: MD5, SHA-1 và SHA-256 khác nhau ở điểm nào

Vì sao MD5 vẫn được dùng để kiểm tra tính toàn vẹn của tệp, nhưng không dùng cho mật khẩu.

Checksum Verifier: cách kiểm tra một tệp có bị hỏng hay không

Vì sao checksum trùng khớp xác nhận tính toàn vẹn của một tệp, nhưng không xác nhận ai đã tạo ra nó.

HMAC: hash có khóa khác gì so với hash thông thường

Vì sao SHA-256 thông thường không bảo vệ khỏi việc giả mạo tin nhắn, nhưng HMAC thì có.

Bcrypt: vì sao mật khẩu được băm chậm chứ không nhanh

Vì sao SHA-256 nhanh là lựa chọn tồi cho mật khẩu, còn bcrypt chậm mới là lựa chọn đúng.

UUID: cách tạo ra định danh gần như không bao giờ trùng lặp

Vì sao UUID v4 có thể được tạo độc lập trên hàng triệu máy mà không có nguy cơ trùng lặp.

Trình tạo mật khẩu: điều gì thực sự làm cho mật khẩu mạnh

Vì sao mật khẩu dài gồm các từ trong từ điển mạnh hơn mật khẩu ngắn có ký hiệu và số.

AES: mã hóa đối xứng hoạt động như thế nào

Vì sao cùng một khóa vừa mã hóa vừa giải mã dữ liệu trong AES, và điều này khác gì với mã hóa bất đối xứng.

Argon2: vì sao thuật toán này giành chiến thắng cuộc thi băm mật khẩu

Argon2 phòng thủ trước các cuộc tấn công bằng GPU tốt hơn các thuật toán băm mật khẩu cũ như thế nào.

Scrypt: vì sao thuật toán cần nhiều bộ nhớ đến vậy

Vì sao scrypt cố ý đòi hỏi nhiều bộ nhớ để gây khó khăn cho việc dò trên thiết bị ASIC.

TOTP: mã dùng một lần trong ứng dụng xác thực hoạt động như thế nào

Vì sao mã trong Google Authenticator hoạt động không cần internet và chỉ đồng bộ với máy chủ qua thời gian.

PBKDF2: tiêu chuẩn kéo giãn khóa lâu đời nhất

Vì sao số lần lặp khuyến nghị của PBKDF2 tăng lên mỗi năm.

X.509: bên trong một chứng chỉ SSL có gì

Trình duyệt kiểm tra chính xác điều gì trong chứng chỉ của một trang web trước khi hiển thị ổ khóa xanh.

PGP: mã hóa bằng khóa công khai và khóa riêng hoạt động như thế nào

Vì sao có thể chia sẻ tự do khóa công khai PGP, nhưng không bao giờ chia sẻ khóa riêng.

Thời gian/Số

Thời gian Unix: vì sao máy tính đếm thời gian từ năm 1970

Vì sao ngày 1 tháng 1 năm 1970 trở thành mốc thời gian tham chiếu cho hầu hết các hệ thống máy tính.

Biểu thức cron: cách giải mã lịch chạy tác vụ

Cách giải mã một biểu thức như */15 * * * * và biết chính xác khi nào tác vụ sẽ chạy.

Hệ đếm số: vì sao có hệ nhị phân, bát phân và thập lục phân

Vì sao màu #FF5733 trong CSS được viết bằng chữ số thập lục phân thay vì thập phân.

Phép toán bit: AND, OR và XOR hoạt động như thế nào ở cấp độ bit

AND theo bit khác gì với AND logic, và vì sao lại cần thao tác trên từng bit riêng lẻ của một số.

Chênh lệch ngày: vì sao đếm số ngày phức tạp hơn tưởng tượng

Vì sao trừ ngày một cách ngây thơ có thể cho kết quả sai vì năm nhuận.

Tính tuổi: vì sao không đơn giản chỉ là trừ năm

Vì sao chỉ đơn giản trừ năm sinh có thể cho ra tuổi lớn hơn thực tế một tuổi.

Múi giờ: vì sao UTC không giống với GMT

Vì sao UTC không bao giờ thay đổi hai lần một năm, trong khi giờ London (GMT/BST) thì có.

Máy tính thời lượng: cách cộng đúng giờ, phút và giây

Vì sao khi cộng phút và giây cần "chuyển" phần dư sang hàng tiếp theo, giống như trong phép cộng thập phân.

ISO 8601 Duration: cách viết một khoảng thời gian theo định dạng chuẩn

Vì sao PT1H30M có nghĩa là "1 giờ 30 phút", không phải "1 phút 30 giờ".

Số tuần: vì sao các quốc gia khác nhau đếm tuần khác nhau

Vì sao ngày 1 tháng 1 đôi khi thuộc tuần 52 hoặc 53 của năm trước theo chuẩn ISO 8601.

Số La Mã: một hệ thống không có số 0 và không có giá trị theo vị trí hoạt động ra sao

Vì sao IV có nghĩa là 4 chứ không phải 6, và quy tắc trừ hoạt động thế nào trong số La Mã.

IEEE 754: vì sao 0.1 + 0.2 không bằng 0.3 trong code

Vì sao hầu như mọi ngôn ngữ lập trình đều in 0.1 + 0.2 thành 0.30000000000000004.

Số thành chữ: vì sao cần biến chữ số thành từ ngữ

Vì sao các văn bản ngân hàng ghi số tiền cả bằng số lẫn bằng chữ cùng một lúc.

Mạng/HTTP

Phân tích URL: một địa chỉ web gồm những phần nào

Vì sao một URL có phần sau ký tự # mà server thậm chí không bao giờ nhận được.

Query String so với JSON: vì sao tham số GET lại hạn chế đến vậy

Vì sao truyền một mảng hoặc object lồng nhau qua query string của URL không đơn giản như với JSON.

User-Agent: vì sao chuỗi này lại lộn xộn đến vậy

Vì sao Chrome, Safari và Edge đều chứa đồng thời cả từ "Mozilla" và "Safari" trong User-Agent của chúng.

Basic Authentication: cách đơn giản nhất để bảo vệ một tài nguyên HTTP hoạt động như thế nào

Vì sao Basic Auth bắt buộc phải có HTTPS, vì Base64 chỉ là mã hóa định dạng, không phải mã hóa bảo mật.

HTTP header: điều gì ẩn giấu trong mỗi request và response

Vì sao header Content-Type quyết định cách trình duyệt diễn giải phần thân của response từ server.

Cookie: một đoạn văn bản nhỏ lưu giữ trạng thái phiên làm việc như thế nào

Vì sao thuộc tính HttpOnly bảo vệ cookie khỏi bị đánh cắp bởi mã JavaScript độc hại.

CORS: vì sao trình duyệt chặn các request "bình thường" đến một domain khác

Vì sao lỗi CORS xảy ra ở trình duyệt, không phải ở server, và ai thực sự đang chặn request.

Header email: cách theo dấu hành trình một email từ người gửi đến bạn

Vì sao cần đọc header Received từ dưới lên trên để theo dấu hành trình của một email.

Phát triển Web

HEX, RGB, HSL: vì sao có nhiều cách viết một màu đến vậy

Vì sao các nhà thiết kế thường chọn HSL thay vì HEX khi chọn sắc độ màu bằng tay.

Rút gọn CSS: điều gì thực sự bị loại bỏ khỏi tệp và vì sao

Vì sao CSS đã rút gọn hoạt động chính xác như cũ trong trình duyệt, dù trở nên khó đọc với con người.

Rút gọn JavaScript: sự khác biệt giữa rút gọn và làm rối mã

Vì sao mã đã rút gọn vẫn có thể đọc được nếu muốn, còn mã đã làm rối thì không.

Rút gọn HTML: vì sao khoảng trắng trong markup lại có ý nghĩa

Vì sao loại bỏ khoảng trắng bên trong <pre> hoặc một textarea có thể phá vỡ giao diện trang, khác với hầu hết mọi nơi khác.

Gradient CSS: linear khác gì với radial và conic

Vì sao conic-gradient phù hợp với biểu đồ tròn, còn radial-gradient tạo hiệu ứng vệt sáng.

Thuật toán Luhn: cách kiểm tra tính đúng đắn của số thẻ

Vì sao một số thẻ vượt qua kiểm tra Luhn không có nghĩa là thẻ đó thực sự tồn tại.

IBAN: cấu trúc của một số tài khoản ngân hàng quốc tế

Vì sao hai chữ cái đầu tiên của IBAN là mã quốc gia, không phải một phần của số tài khoản.

Mã QR: một liên kết vừa vặn trong ô vuông điểm ảnh như thế nào

Vì sao một mã QR có logo ở giữa vẫn quét được dù một phần hoa văn bị che.

Mã vạch: Code 128 khác gì với EAN-13

Vì sao sản phẩm trên kệ hàng gần như luôn dùng EAN-13 thay vì Code 128.

Ảnh placeholder: vì sao ảnh giả lại quan trọng trong quá trình phát triển

Vì sao các nhà phát triển cố tình chèn hình chữ nhật xám thay vì ảnh thật khi một bố cục vẫn đang được xây dựng.