3 điểm bởi GN⁺ 2024-07-04 | 1 bình luận | Chia sẻ qua WhatsApp
  • .DS_Store là viết tắt của Desktop Services Store, xuất hiện khi Finder dành cho Mac OS X được làm lại vào năm 1999
  • Khi đó codebase của Finder đã khoảng 8 năm tuổi, nên ngay cả thay đổi nhỏ cũng tốn nhiều chi phí và làm hỏng các chức năng tưởng như không liên quan, vì vậy cần viết lại toàn bộ
  • Finder mới tách giao diện người dùng khỏi backend; backend phụ trách liệt kê tệp, theo dõi thay đổi, và metadata như vị trí biểu tượng cùng thiết lập thư mục
  • Backend của Finder trở thành ứng viên API công khai có thể dùng cả bên ngoài Finder, và cùng với phương án đổi tên Finder thành “Desktop”, nó được đặt tên là Desktop Services
  • .DS_Store ban đầu chỉ nên được tạo khi thay đổi thiết lập hiển thị hoặc vị trí biểu tượng, nhưng do lỗi, trong nhiều trường hợp chỉ cần truy cập thư mục là nó cũng được tạo

Sự ra đời của tên gọi Desktop Services Store

  • Vào năm 1999, khi Apple đang xây dựng lại Finder cho Mac OS X, codebase Finder hiện có đã khoảng 8 năm tuổi
    • Việc thay đổi đòi hỏi nỗ lực kỹ thuật lớn
    • Các thay đổi thường làm hỏng 2–3 chức năng tưởng như không liên quan
    • Finder cho Mac OS X được quyết định viết lại từ đầu
  • Trong quá trình viết lại, giao diện người dùng của Finder được tách khỏi backend chức năng cốt lõi
    • Tên nội bộ lần lượt là Finder_FEFinder_BE
    • Backend phụ trách liệt kê tệp, theo dõi thay đổi hệ thống tệp, xử lý metadata, vị trí biểu tượng và thiết lập thư mục
  • Vì backend của Finder có thể hữu ích cả bên ngoài Finder, đã xuất hiện kế hoạch một ngày nào đó cung cấp nó dưới dạng API công khai
    • Dựa trên kinh nghiệm từng đặt các tên Icon ServicesNavigation Services, cái tên Desktop Services được chọn
    • Khi đó, phương án đổi tên Finder thành “Desktop” cũng đang được xem xét
    • .DS_Store là tên bắt nguồn từ “Desktop Services Store”
    • Dấu . ở đầu được chọn để nó được xem là tệp ẩn trên các hệ điều hành họ Unix và Mac OS

Điều kiện tạo và ảnh hưởng về sau

  • Tên gọi có thể đã mang tính mô tả hơn, nhưng sau khi đã được dùng rộng rãi thì trở nên khó thay đổi
  • Tệp .DS_Store ban đầu chỉ nên được tạo khi người dùng điều chỉnh thiết lập hiển thị của thư mục hoặc chỉ định thủ công vị trí biểu tượng
    • Tuy nhiên, do một lỗi chưa được sửa, tệp này bị tạo ra quá mức
    • Trên thực tế, gần như chắc chắn rằng chỉ cần truy cập một thư mục cũng sẽ tạo ra tệp .DS_Store
  • Finder_BE, tức Desktop Services, cũng được dùng bên ngoài Finder
    • Navigation Services, tức hộp thoại mở/lưu, về sau cũng sử dụng nó
    • Trong các bản phát hành đầu tiên của Mac OS, Navigation Services chưa sử dụng nó
    • Desktop Services API vẫn chưa được công khai hoàn toàn

1 bình luận

 
GN⁺ 2024-07-04
Ý kiến trên Hacker News
  • Ngoài tệp này ra, trước đây cũng có những lúc thấy rối vì khái niệm fork trong hệ thống tệp của Mac
    Ở đây fork không phải là fork() mà là cấu trúc trong đó thành phần dữ liệu và thành phần tài nguyên của một tệp tồn tại thành cặp; một bên được xem như metadata, một bên như nội dung tệp
    Trên Unix, metadata nằm ở phía inode của khối thư mục và không phải là định dạng gắn riêng với từng tệp, nên các cấu trúc như tar, cpio, zip phải biểu diễn riêng phần này
    Để triển khai hỗ trợ tệp tương thích Mac trên Unix, cần coi resource fork như dữ liệu hạng nhất, và cách tự nhiên là đặt một tệp kiểu .file cạnh mỗi tệp
    Khi đó, khối inode của UFS không thể ánh xạ mọi thuộc tính của resource fork, và trong đó còn có cả những thứ như biểu tượng. Các hệ thống tệp hiện đại hơn có cấu trúc khối thư mục lớn hơn nên xử lý kiểu dữ liệu này tốt hơn

    • Tôi không cho rằng mô tả “một bên là metadata, một bên là nội dung tệp” là chính xác để giải thích resource fork
      Đúng hơn nên xem nó như có hai bộ nội dung tệp, một gọi là data, một gọi là rsrc, và trên đĩa thì cả hai đều chỉ là các luồng byte
      Tuy vậy, resource fork thường lưu cấu trúc các mẩu dữ liệu nhỏ được lập chỉ mục bằng mã kiểu 4 byte và ID số nguyên 2 byte
      Các ứng dụng Mac 68K đặt gần như mọi thứ vào resource fork: mã lệnh, menu, hộp thoại, hình ảnh, biểu tượng, chuỗi ký tự, v.v.; vì thế nếu sao chép ứng dụng Mac đời cũ sang PC hay Unix mà không chuyển đổi thì nó sẽ trông như một tệp rỗng
      Vì vậy, để gửi ứng dụng Mac qua mạng thì phải mã hóa nó thành một luồng duy nhất; ban đầu dùng BinHex .hqx hoặc MacBinary .bin, về sau dùng kho lưu trữ Stuffit .sit
      Lý do cấu trúc này không khớp với inode là vì về cơ bản nó giống như cố nhét cả một tệp hoàn chỉnh vào đó. Bản thân cấu trúc resource fork có giới hạn 16MB, nhưng nếu coi nó là một luồng dữ liệu riêng thì có thể làm lớn tùy ý
    • Tôi nhớ resource fork từng chứa những thứ được chỉnh sửa bằng ResEdit. Có thể là biểu tượng, nhiều tài nguyên GUI, cũng như văn bản và tài nguyên bản dịch
      Ví dụ, plugin Escape Velocity dùng các kiểu tài nguyên tùy biến và có thể chỉnh sửa dễ dàng bằng plugin ResEdit
    • NTFS cũng có Alternate Data Streams nhưng theo tôi thì gần như không được dùng
      https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(AD...
    • Metadata ứng dụng như định dạng tệp mà ứng dụng có thể mở, hay nên dùng biểu tượng nào khi khớp với creator code của ứng dụng, được lưu trong resource fork của chính ứng dụng đó, nhưng metadata của tệp thì không được lưu trong resource fork
      Những thứ như file type, creator code, lock, invisible, bozo bit, v.v. luôn được lưu trong hệ thống tệp
      Có thể xem mô tả định dạng đĩa MFS, ví dụ: https://wiki.osdev.org/MFS#File_Directory_Blocks
    • Dữ liệu dạng fork từng khiến việc tạo CD/DVD định dạng kép khá thú vị. Ban đầu đó giống một kiểu lách luật, nhưng về sau phần mềm ghi đĩa trên Mac đã xử lý khá dễ dàng
      Việc tạo DVD khởi động cho Mac cũng không hề đơn giản
  • Tôi nhớ trước đây từng có cách tắt việc tạo .DS_Store, nhưng Apple đã bỏ nó đi, và tôi hoàn toàn không hiểu vì sao họ lại thay đổi như vậy
    Cuối cùng tôi còn tự viết hẳn một chương trình theo dõi toàn bộ hệ thống tệp rồi xóa .DS_Store ngay khi nó xuất hiện
    [0] https://github.com/slmjkdbtl/dskill

    • Có thể tắt trên volume mạng
      defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
      https://support.apple.com/en-us/102064
      Tôi không nhớ từng có cách tắt trên volume cục bộ
    • Apple thực sự đã làm mọi thứ trở nên lộn xộn khi bắt đầu tạo các tệp bắt đầu bằng . ở thư mục gốc của hệ thống tệp
      Sau khi .DS_Store được chấp nhận, có vẻ như các kỹ sư khác cũng dễ dàng được duyệt thêm những thứ như .fseventsd, .Spotlight-V100
      Không biết tôi đã thấy bao nhiêu hệ thống tệp bị “ô nhiễm” bởi các tệp này rồi. Chủ yếu là thẻ SD hay USB flash, nhưng đôi lúc còn có những trường hợp kinh khủng hơn nhiều
      Thường trong các tình huống đó tôi sẽ chạy rm -rf .DS_Store .Trashes ._.Trashes .fseventsd .Spotlight-V100, rồi nhanh chóng tháo ổ ra trước khi có thứ gì khác kịp được ghi vào
      Đặc biệt khi phải sao chép dữ liệu từ một đĩa đang xuống cấp, điều cuối cùng bạn muốn là nó bắt đầu lập chỉ mục toàn bộ và ghi dữ liệu lên đĩa
      Nghiêm túc mà nói, chuyện này nên có tùy chọn cấu hình
    • find / -name ".DS_Store" -exec rm {} \; 2>/dev/null
      Chỉ cần đưa cái này vào script rồi thêm vào crontab là được
  • .DS_Store trông đúng là một thiết kế khá xui xẻo. Dù nó có mục đích và cũng có nhiều cách lách, nhưng trên thực tế nó đã trở thành thứ phát tán rác tệp tới 99% những người phải chạm mặt
    Xét về độ hoàn thiện trải nghiệm người dùng thì điều này không giống Apple cho lắm
    Tôi lớn lên khi dùng cùng lúc System 7.5, OS X và Windows, và Mac vốn là phía không bắt người dùng phải nhìn thấy những chi tiết triển khai như tệp không cần thiết, định dạng tệp hay “máy tính thực sự hoạt động bên trong ra sao”
    Vì vậy việc tệp này mọc ra khắp nơi khiến tôi thấy rất lạ, vì nó hoàn toàn không khớp với mental model của tôi về Mac

    • Những người chỉ sống trong hệ sinh thái Apple sẽ không bao giờ nhìn thấy tệp .DS_Store trừ khi họ dùng terminal
      Finder giờ đây không hiển thị chúng ngay cả khi bật chế độ hiện tệp ẩn
      Nhưng khi chia sẻ tệp từ Mac cho người dùng Windows thì nó thực sự rất chướng mắt, và tôi nghĩ nó có thể tạo ấn tượng ban đầu xấu với những ai đang cân nhắc chuyển sang Mac
    • Chất lượng hoàn thiện của Apple từ trước đến nay luôn gần với phần bề mặt hơn là phần bên trong
  • Tôi không hiểu vì sao nó phải nằm ngay trong cùng thư mục. Chẳng phải hệ điều hành có thể giữ một cơ sở dữ liệu nhỏ nào đó ở đâu đó và tham chiếu từng đường dẫn sao?

    • Ý đồ là để metadata như nhãn tệp có thể di chuyển cùng ổ đĩa mạng bất kể nó được dùng trên thiết bị nào
    • Đặt trong thư mục cũng có lợi thế là khi thư mục bị xóa thì nó tự nhiên cũng bị xóa theo
  • Tôi đồng ý với ý rằng “chỉ nên tạo khi người dùng thực sự chỉnh cài đặt hiển thị hoặc tự tay sắp vị trí biểu tượng trong thư mục”. Nhưng trên thực tế, gần như chỉ cần ghé qua thư mục là .DS_Store chắc chắn sẽ được tạo ra
    Đây là điều tôi khó chịu nhất ở Finder
    Khả năng tùy biến hình dạng và kích thước của từng cửa sổ thư mục như Finder của Classic Mac OS thực sự là một tính năng rất hay
    Nhưng chỉ cần đi ngang qua cùng thư mục đó trong cửa sổ trình duyệt là phần lớn tùy biến ấy sẽ bị ghi đè bằng cài đặt của cửa sổ trình duyệt, dù bạn chẳng hề thay đổi gì
    Nếu nó dễ bị phá hỏng như vậy thì việc cho phép tùy biến tuyệt vời đó cũng chẳng còn nhiều ý nghĩa
    Tôi mở thư mục Applications bằng phím tắt toàn cục, nhưng dù có muốn chỉnh giao diện cửa sổ đó thì cũng vô ích. Mỗi lần bấm phím tắt tôi đều không biết mình sẽ thấy gì, và nó cứ liên tục bị đặt lại
    Lý do là Finder không có cách đặt cấu hình cửa sổ trình duyệt mặc định. Thay vào đó, nó ghi lại cài đặt trình duyệt hiện tại vào từng thư mục bạn ghé qua, điều này thật sự rất bực mình

    • Trước thời Darwin, mỗi thư mục mở ra tương ứng với một cửa sổ và cũng chỉ có một người dùng, nên cách tiếp cận đó khá phù hợp
      Việc cùng một cửa sổ bật lên phía trước đúng y như trạng thái cuối cùng bạn để lại thật tuyệt, và tôi vẫn nhớ điều đó
    • Dù không phải toàn cục, nhưng trong Finder bạn có thể mở thư mục Applications bằng cmd-shift-A, và mở thư mục Utilities bằng cmd-shift-U
  • Tôi không phải người dùng Mac, nên mỗi khi trong file .tgz tải từ những nơi như GitHub có đầy .DS_Store thì tôi luôn thấy khá bực
    Có vẻ macOS chắc dùng GNU tar, nên việc họ không sửa hay cấu hình mặc định để bỏ qua .DS_Store khá là bất ngờ

    • Không phải mặc định, nhưng vẫn có thể thiết lập như vậy
      Nếu export COPYFILE_DISABLE=true thì tar sẽ bỏ qua các tệp .DS_Store
    • Phần lớn tiện ích Unix trên Mac không phải do Apple chỉnh sửa đặc biệt mà gần như được mang sang nguyên trạng từ FreeBSD
  • Đáng để nhắc tới cách tắt mặc định việc tạo tệp .DS_Store khi duyệt network volume. Nếu không, chỉ cần xem qua bằng Finder thôi cũng làm thay đổi thời gian sửa đổi của thư mục, và điều đó thực sự tệ nhất
    https://old.reddit.com/r/MacOS/comments/lvju40/comment/gpc8i...

    • macOS dạo này khá khó chịu. Khi tôi dùng Finder để xem network volume có .DS_Store hay không thì trông như không có, nhưng vào terminal thì hóa ra nó vẫn ở đó
      Giờ không thể tin tính năng hiện tệp ẩn của Finder nữa. Thay vì hiển thị mọi tệp ẩn, nó chỉ hiện những tệp ẩn mà Finder cho rằng người dùng cần phải quan tâm
      Share mạng của tôi là Synology cục bộ nên không thành vấn đề lớn, nhưng ở chỗ làm thì những tệp này từng tạo ra một mớ khá lộn xộn
    • Cá nhân tôi thường bắt người dùng Mac bật cài đặt này trước khi được cấp quyền ghi vào network share. Tôi xem đó là phép lịch sự khi dùng chung ở mức cơ bản
    • Nếu bạn vận hành Samba thì cũng có thể cấu hình Samba để đơn giản bỏ qua các yêu cầu tạo kiểu này
  • Còn có cả các tệp chấm gạch dưới (._). Có cách nào để vô hiệu hóa việc tạo các tệp này trên network share không?
    [0] https://superuser.com/questions/212896/is-there-any-way-to-p...

  • May là nếu dùng Dired của Emacs làm trình quản lý tệp thì có thể dễ dàng giả vờ như những tệp nhỏ phiền toái này, cùng các tệp do quá trình chạy LaTeX tạo ra, không hề tồn tại
    (setq dired-omit-mode t
    dired-omit-files "^.+\\.\\(DS_Store\\|aux\\|bak\\|bbl\\|bcf\\|blg\\|dvi\\|ent\\|idx\\|ilg\\|ind\\|log\\|orig\\|out\\|pdf-view-restore\\|pdf#\\|reg\\|run.xml\\|synctex.gz\\|toc\\)$")