- Tác giả định sắp xếp các tệp ảnh theo thứ tự alphabet, nhưng kết quả sắp xếp của hệ điều hành và trình quản lý tệp lại khác nhau
- Trong
ls trên Linux, các tệp được sắp xếp đúng như mong đợi, nhưng hầu hết GUI file manager như Windows, Google Drive, KDE Dolphin lại áp dụng “natural sort” (sắp xếp tự nhiên), tức diễn giải tên tệp có chứa số theo giá trị số
- Vì vậy, có thể xuất hiện kết quả khác với cách sắp xếp chuỗi truyền thống, chẳng hạn
file-10.txt đứng trước file-9.txt
- Nguyên nhân thực sự là do hai điện thoại dùng quy tắc đặt tên tệp khác nhau: một bên gắn mili giây ngay sau phần giây, bên còn lại tách bằng dấu gạch dưới, khiến tiêu chí sắp xếp thay đổi
- Cuối cùng, cách giải quyết chỉ có thể là thống nhất quy tắc đặt tên tệp hoặc chỉnh các thiết lập ẩn của từng trình quản lý tệp; tác giả tiếc nuối về “thời đại mà máy tính ưu tiên phỏng đoán hơn là làm đúng theo chỉ thị của người dùng”
Bối cảnh và tình huống vấn đề
- Tác giả đi leo núi cùng cha, mỗi người chụp ảnh bằng điện thoại Android của mình rồi lưu toàn bộ ảnh vào cùng một thư mục
- Quy tắc tên tệp ảnh là
IMG_YYYYMMDD_HHmmss hoặc có thêm số phía sau trước .jpg
- Vì tên tệp đã được sắp theo thứ tự năm-tháng-ngày và thời gian, tác giả cho rằng chỉ cần sắp theo alphabet (thứ tự từ điển) là ảnh sẽ tự động xếp theo thời điểm chụp
- Nhưng khi dùng Windows PC, Google Drive, KDE Dolphin..., các tệp theo cùng quy tắc lại không được xếp đúng thứ tự
- Ví dụ: một bức ảnh chụp lúc 5:54 bằng điện thoại của cha lại xuất hiện trước ảnh 9:20, rồi còn nằm sau ảnh 12:11, cho thấy thứ tự bị sai
- Gnome và các trình quản lý tệp khác trên điện thoại thông minh cũng cho ra kết quả tương tự
- Trong khi đó, lệnh
ls trên Linux vẫn giữ đúng thứ tự, càng làm mọi chuyện thêm khó hiểu
Phân tích nguyên nhân
- Ban đầu, tác giả nghĩ rằng một trong hai điện thoại đã dùng ký tự lạ thay cho dấu gạch dưới (_), nhưng khi kiểm tra bằng lệnh
ls trên Linux thì thứ tự vẫn hoàn toàn bình thường
- Trên nhiều bản phân phối Linux khác nhau, cũng như trên máy chủ OpenBSD,
ls đều sắp xếp đúng theo alphabet
- Trái lại, nhiều GUI file manager như Windows, Google Drive, KDE Dolphin... lại so sánh phần số trong tên tệp theo đúng độ lớn số học
- Tức là mặc định dùng natural sorting thay vì thứ tự alphabet thuần túy
- Natural sort sẽ so sánh các chữ số trong chuỗi không phải như ký tự đơn lẻ, mà như giá trị số
- Ví dụ:
file-9.txt < file-10.txt → đúng theo kỳ vọng của con người
- Nhưng trong cách sắp xếp truyền thống, vì
1 < 9 nên file-10.txt lại đứng trước
- Tuy nhiên, các trình quản lý tệp hiện nay nếu thấy có “phần số” thì sẽ ép phần đó được hiểu là giá trị số thực tế để 9 luôn đứng trước 10
- Điều này có thể khác với thứ tự mà người đặt tên tệp thực sự mong muốn
Nguyên nhân thực tế và cách giải quyết
- Điện thoại của cha gắn luôn phần mili giây ngay sau phần giây, còn điện thoại của tác giả thì tách bằng dấu gạch dưới
- Điện thoại của cha: gắn mili giây ngay sau phần giây → con số trở nên lớn hơn và bị đẩy về sau
- Điện thoại của tác giả: tách bằng dấu gạch dưới → được xử lý như một chuỗi riêng
- Cách xử lý là sắp xếp lại tên tệp của một trong hai bên theo cùng một mẫu thống nhất
- Với KDE Dolphin, có thể chọn tùy chọn sắp xếp theo alphabet thuần túy trong phần cài đặt, nhưng thiết lập này bị ẩn nên khá phiền
- Vì mỗi chương trình có tính năng khác nhau, có thể phải chỉnh riêng từng nơi
Kết luận của tác giả
- Dù đã chỉ định “thứ tự alphabet”, tác giả vẫn phê phán việc phần mềm tự đoán ý người dùng rồi áp dụng một kiểu sắp xếp khác
- Tác giả nhớ thời mà máy tính chỉ đơn giản làm đúng theo những gì được yêu cầu
1 bình luận
Ý kiến trên Hacker News
Tôi nghĩ cách sắp xếp mà Microsoft, Google và KDE áp dụng trực quan hơn và bao quát các trường hợp dùng phổ biến hơn, còn tình huống của tác giả là cực kỳ hiếm; phần lớn mọi người thường muốn “10” đứng sau “9” hơn nhiều, môi trường desktop cũng ghi là sắp xếp “theo tên” chứ không phải “theo bảng chữ cái” nên không gây hiểu nhầm; dù tôi không thích việc máy tính cố đoán ý người dùng, nhưng giống như tính năng tự động lưu, những thứ như vậy lại hữu ích trong đời sống thực; sẽ tốt nếu có thêm tùy chọn sắp xếp đúng theo thứ tự chữ cái, nhưng để mặc định thì việc chọn trường hợp phổ quát và trực quan hơn là hợp lý
Chủ đề này làm tôi nhớ đến tranh luận “Worse is better”; kiểu sắp xếp đơn giản dựa trên ANSI/Unicode mà tác giả đòi hỏi thật ra lại là tính năng chỉ một số ít lập trình viên cần, còn trong thực tế 99% người dùng GUI muốn cách sắp xếp trực quan; việc xác định người dùng chính có ảnh hưởng rất lớn đến thiết kế sản phẩm; tính năng tốt hơn có thể phù hợp với sản phẩm, nhưng với hệ thống thì sự đơn giản đôi khi lại phù hợp hơn cho việc phát triển và tiến hóa
Khi tìm các file được đặt tên bằng hash, sắp xếp tự động là thứ gây khó chịu nhất; trên Windows đây là một trong số ít tùy chọn tôi tắt ngay bằng Registry; tôi thường nhớ thời máy tính chỉ làm đúng thứ mình bảo; bây giờ có cảm giác nó không chỉ “đọc ý người dùng” mà còn “muốn thay đổi cả cách nghĩ của người dùng”, nên tôi rất dị ứng; kể cả trong mã nguồn mở, tôi cũng khó chịu với tư duy độc đoán kiểu “người dùng sai rồi” này
Nếu ai cũng khẳng định mình hiểu nhu cầu của người dùng trung bình, vậy tại sao lại chẳng thấy ai đề xuất để máy tính tự động đổi luôn tên file theo ý nó? Nếu đã không bắt buộc sắp xếp theo ASCII thì cũng đâu cần bám chặt vào tên file có cả phần mở rộng; thực tế người dùng không quan tâm lắm jpg hay png, cũng chẳng để ý chữ hoa chữ thường; trên hệ Windows người ta dùng phần mở rộng nhiều chủ yếu vì tương thích cũ; thật khó hiểu khi cứ ép “tên file kiểu máy tính” nhưng lại cố tình phá vỡ “cách sắp xếp kiểu máy tính”; vì chẳng ai biết chắc người dùng muốn gì, nên đừng khẳng định như thể mình biết rõ
Tôi thấy trong đa số trường hợp cách sắp xếp dựa trên phiên bản như bài viết mô tả là tốt hơn; hiển thị theo thứ tự chữ cái còn khiến tôi thấy như là lỗi; theo tôi, vấn đề không nằm ở khái niệm sắp xếp mà nằm ở cách gắn nhãn
sorttrên Linux hiện cũng hỗ trợ sắp xếp theo phiên bản (sort -V); tôi không rõ chi tiết cơ chế bên trong, nhưng nó hoạt động tốt trong hầu hết tình huống; quan trọng hơn cả là có thể bật/tắt rất dễĐiều người dùng yêu cầu không phải là sắp xếp file “theo bảng chữ cái” mà là sắp xếp “theo tên”, nên cách diễn giải có thể khác nhau tùy hệ điều hành; tôi nghĩ đa số hệ thống đã chọn cách diễn giải phù hợp hơn với phần lớn người dùng dựa trên logic và dữ liệu; có lẽ trong tương lai sẽ có thêm quy tắc như nếu nhóm số có số 0 ở đầu thì dùng thứ tự chữ cái gốc, hoặc sẽ có tùy chọn cho người dùng tự chọn
Trong macOS Foundation,
NSString.localizedStandardCompare()được cung cấp chính thức để Finder dùng cho việc sắp xếp; Windows cũng cóStrCompareLogical, tức là tiêu chí sắp xếp theo tên, hay nói cách khác là natural sort, đang được chuẩn hóa chính thức trên từng nền tảngls, và giờ tôi lại thấy cách này tốt hơn; trong ứng dụng ảnh thì thường sắp theo timestamp, còn nếu thực sự cần sắp file đúng theo tên thì tôi sẽ sắp theo ngày tạo hoặc tự chuẩn hóa lại tên fileBáo cáo Unicode nói rất rõ rằng cách sắp xếp thay đổi theo ngôn ngữ và ngữ cảnh; ví dụ nếu sắp xếp “A-10” theo bảng chữ cái mà không nhận diện số, thì “A-10” sẽ đứng trước “A-2”; tuy phức tạp, tôi vẫn nghĩ việc các trình duyệt file chọn natural sort vì lý do này là hợp lý
Việc sắp xếp để “foo9” đứng trước “foo10” chính là “natural sort”; gần đây tôi mới biết cách làm natural sort bằng 2 dòng Python và rất hài lòng, xin giới thiệu đoạn mã Stack Overflow liên quan
sort(1)cũng hỗ trợ natural sort (-V); nếu tạo các file ảnh rồi chạyls | sort -Vthì sẽ sắp xếp đúng; kết quảdu -sh *cũng có thể sắp bằng tùy chọnsort -hTôi không hề nhớ nhung kiểu sắp xếp lộn xộn như “Image-1.jpg, Image-11.jpg, Image-2.jpg”; đúng là từng có lúc natural sort khiến tôi thấy lạ, nhưng khi Windows chuyển sang sắp theo giá trị số thì mọi thứ trở nên rất tiện; các file được sắp tự nhiên hơn và tôi khá hài lòng