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.
SEO
Meta tag: thẻ nào thực sự ảnh hưởng đến tìm kiếm và mạng xã hội
Vì sao công cụ tìm kiếm đôi khi bỏ qua meta description của bạn và tự tạo đoạn trích từ nội dung trang.
robots.txt: bot tìm kiếm quyết định những gì được thu thập dữ liệu như thế nào
Vì sao quy tắc Disallow trong robots.txt không ẩn một trang khỏi kết quả tìm kiếm nếu nơi khác có liên kết đến nó.
Sitemap.xml: vì sao công cụ tìm kiếm cần một bản đồ trang web
Vì sao xuất hiện trong sitemap.xml không đảm bảo công cụ tìm kiếm sẽ lập chỉ mục trang đó.
Favicon: vì sao một biểu tượng lại cần nhiều kích thước và định dạng đến vậy
Vì sao một favicon.ico duy nhất không còn đủ để hiển thị đúng trên mọi thiết bị.
Tạo sitemap.xml: cách xây dựng bản đồ trang web tự động
Vì sao công cụ tìm kiếm phần lớn bỏ qua trường priority trong sitemap.xml dù nó là một phần của đặc tả.
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.