Uwaga ciekawostka
Na systemach plików z rodziny FAT, nie ma opcji uzyskać czasu pliku/katalogu (stworzenia/dostępu) z nieparzystą sekundą! Szok i niedowierzanie. Patrzcie sami:
(Naprawdę nie chciało mi się walczyć o jakość z ffmpegiem. IMO wygląda nawet fajnie)
A czemu?
Otóż dawno, dawno temu były czasy gdzie rozmiar miał znaczenie. Dyski były małe. Przeciętne node_modules
nie zmieściłoby się na wszystkich dyskach w USA razem wziętych.
Ludzie musieli kombinować i walczyć o każdy bajt pamięci. Czy to RAM czy trwałej.
Directory entry w systemach FAT zostało obmyślone tak, że zawierało czas stworzenia/dostępu pliku/katalogu. Oczywiście zrezygnowano z mili/mikro/nano części sekund. Co zostało?
Godzina: 0 - 23
Minuty: 0 - 59
Sekundy: 0 - 59
No dobra, wartości są małe, każda zmieści się na bajcie. Wystarczą trzy bajty. Problem rozwiązany, można dalej parzyć kawę w wersji skrypt.
Za dużo! To nie node_modules
! Każdy bajt się liczy.
Zobaczmy ile bitów trzeba na takie wartości:
ceil(log2(24)) -> 5 bitów
ceil(log2(60)) -> 6 bitów
Czyli trzeba 5 + 6 + 6 = 17
. Nieeeeee.. O bit za dużo. Zmieścilibyśmy się w dwóch bajtach. Ale ten bit. Gdyby tylko nie ten bit..
Pewnie już wiecie co się stało (:
Żeby zaoszczędzić jeden bit zapisujemy liczbę sekund podzieloną przez dwa.
Czyli jak tworzymy plik w sekundzie 40
, zapisana zostanie liczba 20
. Jak tworzymy w sekundzie 15
, zapisana zostanie liczba 7
, 59
-> 29
.
Tak oto twórcy FATów pozbawili nas raz na zawsze posiadania plików z nieparzystą sekundą..
Dużo info o grubasach jest na osdev wiki: https://wiki.osdev.org/FAT
Komendy, które pisałem na gifie:
mkdir dir
dd if=/dev/zero of=./img count=102400 bs=1024
ll
mkfs -t fat img
sudo mount img dir
tail -n1 /proc/mounts
cd dir
date && sudo touch foo && ls -la --time-style=full-iso
Coś mi blado świta z czasów BIOS / DOS, ze rzeczywiście były ograniczone ilosci bitów na podobne dane jak sekundy
Na początku sądziłem, że to feature, a dopiero po chwili zauważyłem podpis. :D