- Fotoğraf dosyalarını alfabetik sıraya göre sıralamaya çalıştı, ancak işletim sistemi ile dosya yöneticisinin sıralama sonuçları farklı çıktı
- Linux
ls içinde sıralama beklendiği gibi çalışsa da Windows, Google Drive, KDE Dolphin gibi çoğu GUI dosya yöneticisi, sayı içeren dosya adlarına sayısal olarak yorumlanan “doğal sıralama (natural sort)” uygular
- Bu yüzden
file-10.txt, file-9.txt dosyasından önce gelebilir; yani geleneksel karakter dizisi sıralamasından farklı bir sonuç ortaya çıkar
- Asıl sorun, iki telefonun farklı dosya adı kuralları kullanmasıydı: biri saniyeden sonra milisaniyeyi doğrudan ekliyor, diğeri ise alt çizgiyle ayırıyordu; bu da sıralama ölçütünü değiştiriyordu
- Sonuçta çözüm, dosya adı kuralını birleştirmek veya her dosya yöneticisinin gizli ayarlarını değiştirmekten ibaret; yazar da “bilgisayarların kullanıcı komutundan çok tahmine öncelik verdiği çağ”dan yakınıyor
Arka plan ve sorun durumu
- Yazar, babasıyla yürüyüş yaparken kendi Android telefonlarıyla fotoğraf çekip tüm fotoğrafları tek bir klasörde topluyor
- Fotoğraf dosyası adları
IMG_YYYYMMDD_HHmmss biçiminde ya da bunun sonuna ek sayı ve .jpg eklenmiş halde
- Bu adlandırma yıl-ay-gün ve saat sırasını içerdiği için, dosyalar alfabetik olarak sıralanırsa çekim zamanına göre de sıralanmış olur diye düşünüyor
- Ancak Windows PC, Google Drive, KDE Dolphin gibi araçlarda, aynı kurala sahip dosyalar sırayla dizilmiyor
- Örnek: babasının telefonuyla çekilen 5:54 fotoğrafı 9:20 fotoğrafından önce görünüyor ve 12:11 fotoğrafından sonra yer alıyor; yani sıralama düzgün çalışmıyor
- Gnome ve telefondaki diğer dosya yöneticilerinde de sonuç aynı
- Linux
ls komutu ise doğru sırayı koruduğu için kafa karışıklığını artırıyor
Nedenin analizi
- Başta, iki telefondan birinin alt çizgi (_) yerine farklı bir karakter kullandığını düşündü; ancak Linux
ls ile kontrol edince sıralamanın normal olduğu görüldü
- Çeşitli Linux dağıtımlarında ve OpenBSD sunucusunda da
ls doğru alfabetik sıralama yapıyor
- Buna karşılık çok sayıda GUI dosya yöneticisi (Windows, Google Drive, KDE Dolphin vb.), dosya adında sayı varsa bunu gerçek sayısal büyüklüğe göre karşılaştırıyor
- Yani alfabetik sıra yerine doğal sıralama (natural sorting) varsayılan olarak uygulanıyor
- Doğal sıralama, metin içindeki sayıları basit karakter değeri değil sayısal değer olarak karşılaştırır
- Örnek:
file-9.txt < file-10.txt → insanın beklediği sıra
- Oysa geleneksel sıralamada
1 < 9 olduğu için file-10.txt önce gelir
- Ancak günümüz dosya yöneticileri, bir “sayı bölümü” gördüğünde o kısmı sayının gerçek değeri olarak yorumlayıp 9’un 10’dan önce gelmesini zorunlu kılar
- Bu da dosya adını oluşturan kullanıcının amaçladığı sıradan farklı olabilir
Gerçek neden ve çözüm
- Babanın telefonu, milisaniye değerini saniyeden hemen sonra ekliyor; yazarın telefonu ise bunu alt çizgiyle ayırarak gösteriyor
- Babanın telefonu: milisaniyeyi saniyenin sonuna doğrudan ekliyor → sayı büyüdüğü için daha sona itiliyor
- Yazarın telefonu: alt çizgiyle ayırıyor → ayrı bir metin parçası gibi işleniyor
- Çözüm: iki taraftan birinin dosya adlarını tutarlı bir desene göre yeniden düzenlemek sorunu çözüyor
- KDE Dolphin'de seçeneklerden saf alfabetik sıralama seçilebiliyor, ancak ayar gizli olduğu için uğraştırıcı
- Programdan programa özellikler değiştiği için her seferinde ayrı ayar yapmak gerekebiliyor
Yazarın vardığı sonuç
- “Alfabetik sıra” seçilmiş olmasına rağmen, yazılımın kullanıcının niyetini tahmin edip farklı bir sıralama uygulamasını eleştiriyor
- Geçmişteki gibi, bilgisayarların sadece verilen komutu uyguladığı daha basit yaklaşımı özlediğini söylüyor
1 yorum
Hacker News görüşü
Microsoft, Google ve KDE'nin benimsediği sıralama yönteminin daha sezgisel olduğunu ve daha yaygın kullanım durumlarını kapsadığını düşünüyorum; yazarın durumu son derece nadir görünüyor, çoğu insanın “10”un “9”dan sonra gelmesini istemesi çok daha olası. Masaüstü ortamları da sıralamayı “alfabetik” değil “ada göre” diye etiketlediği için ortada bir yanıltıcılık yok. Bilgisayarın niyet okumaya çalışmasından hoşlanmıyorum ama otomatik kaydetme gibi özelliklerde olduğu gibi bunun gerçek hayatta faydalı olduğu da açık. Gerçek alfabetik sıralama için ayrıca bir seçenek olsa güzel olurdu ama varsayılanın genel durumda sezgisel olan olması bence doğru.
Bu konu bana “Worse is better” tartışmasını hatırlatıyor. Yazarın istediği ANSI/Unicode tabanlı basit sıralama aslında yalnızca küçük bir geliştirici azınlığının ihtiyaç duyduğu bir özellik. Gerçekte GUI kullanıcılarının %99'u sezgisel sıralama istiyor. Ana kullanıcı kitlesini tanımak ürün tasarımını çok etkiliyor. Daha iyi bir özellik bir ürüne yakışabilir ama bir sistem için büyüme ve evrim açısından sadelik daha uygun olabilir.
Hash değeriyle adlandırılmış dosyaları ararken otomatik sıralama en can sıkıcı şeylerden biri. Windows'ta kayıt defterinden hemen kapattığım nadir seçeneklerden biri bu. Bilgisayarların kendilerine söyleneni yaptığı günleri sık sık özlüyorum. Bugünlerde bu yaklaşım “kullanıcının aklını okumak”tan çok “düşüncesini değiştirmeye çalışmak” gibi geliyor ve bundan hoşlanmıyorum. Açık kaynak dahil, “kullanıcı haksız” diyen buyurgan zihniyetten rahatsızım.
Herkes ortalama kullanıcının ihtiyaçlarını bildiğini iddia ediyor ama nedense kimse bilgisayarın dosya adlarını da istediği gibi otomatik değiştirmesini önermiyor. ASCII sıralaması zorunlu değilse uzantı dahil dosya adına da bu kadar bağlı kalmak gerekmiyor. Sonuçta kullanıcı için jpg ya da png uzantısı önemli değil, büyük/küçük harf ayrımı da pek umursanmıyor. Windows dünyasında uzantılar çoğunlukla eski uyumluluk nedenleriyle kullanıldı. “Bilgisayar usulü dosya adları”nı dayatırken neden yalnızca “bilgisayar usulü sıralama”yı özellikle bozuyoruz, anlayamıyorum. Kullanıcının ne istediğini gerçekten bilmiyorsak bunu kesin bir dille varsaymamalıyız.
Ben çoğu durumda bu yazıda anlatılan sürüm tabanlı sıralamanın daha iyi olduğunu düşünüyorum; alfabetik sıralama gibi gösterilmesi neredeyse bir hata gibi hissettiriyor. Bence sorun sıralama kavramında değil, etiketlemede.
sortkomutu da artık sürüm sıralamasını (sort -V) destekliyor. İç işleyişini tam bilmiyorum ama çoğu durumda iyi çalışıyor; en önemlisi bunu açıp kapatmak çok kolay.Burada dosyaları “alfabetik” sırala diye komut verilmiyor; “ada göre” sıralama isteniyor, dolayısıyla yorum işletim sistemine göre değişebilir. Çoğu kullanıcı açısından daha uygun olan yorumu mantık ve verilere dayanarak seçtiklerini düşünüyorum. Belki gelecekte sayı grubunda başta 0 varsa özgün alfabetik sıralamaya dönmek gibi kurallar eklenir ya da kullanıcıya seçim sunulur.
macOS Foundation, Finder sıralamasında kullanılan
NSString.localizedStandardCompare()işlevini resmen sağlıyor. Windows daStrCompareLogicalsunuyor. Yani platformlar “ada göre” sıralama, yani doğal sıralama ölçütünü resmileştiriyor.lskomutundan farklı olmasına şaşırdım ve artık bu yöntemin daha iyi olduğunu düşünüyorum. Fotoğraf uygulamalarında zaten genelde zaman damgasına göre sıralama yapılır; bir dosyanın gerçekten ad sırasına göre sıralanması gerekiyorsa oluşturulma tarihine göre sıralar ya da doğrudan dosya adını kendim normalize ederim.Unicode raporunda, bağlama ve dile göre sıralama yönteminin değişebildiği açıkça belirtiliyor. Örneğin “A-10”, sayıyı tanımadan alfabetik sıralanırsa “A-2”den önce gelir. Karmaşık bir konu ama dosya tarayıcılarının bu nedenle doğal sıralamayı seçmesi bence doğru.
“foo9”un “foo10”dan önce gelmesini sağlayan şey “natural sort”. Kısa süre önce Python'da iki satırlık bir kodla doğal sıralamanın nasıl yapıldığını öğrendim ve çok memnun kaldım; ilgili Stack Overflow kodunu tavsiye ederim.
sort(1)komutu da doğal sıralamayı (-V) destekliyor. Görüntü dosyaları oluşturupls | sort -Vile sıralarsanız düzgün çalışıyor.du -sh *çıktısını dasort -hseçeneğiyle sıralayabilirsiniz.“Image-1.jpg, Image-11.jpg, Image-2.jpg” gibi karışan sıralamayı hiç özlemiyorum. Doğal sıralama bir zamanlar tuhaf geliyordu ama Windows'ta sayısal değere göre sıralamaya geçilince gerçekten çok rahat ettim. Dosyaların doğal biçimde sıralanması beni epey memnun etmişti.