201310061055


2. Файловые системы.

    And to the minimalists in the crowd, Perl seems like a pointless exercise in redundancy. But that's okay. The world needs a few reductionists (mainly as physicists). Reductionists like to take things apart. The rest of us are just trying to get it together.

    Programming Perl, 3E

Файловые системы и Свойства файла (Attributes)
----------------------------------------------

Записав некоторое количество данных выделим их (наши данные) среди прочей информации, дав им одно имя (или несколько). Можно обозначить время создания, длину, и указать список лиц и их прав на эту информацию (Read -- читать, Write -- писать). Если информация понятна компьютеру, он может иметь право ее исполнить -- eXecute. Свойства файла вполне уместно хранить в отдельном файле -- папке (folder, directory, catalogue). Условимся хранить наши файлы и папки в одном "суперфайле" -- файловой системе. Существует множество различных файловых систем, которые удобно сгруппировать по семействам. Вот несколько примеров. 

  FAT: FAT12, FAT16, FAT32, exFAT
  NTFS: NTFS3, NTFS4, NTFS5, NTFS6
  EXT*: ext, ext2, ext3, ext4
  HFS: HFS, HFS+ (MacOSX)
  Другие: ZFS, ReiserFS, JFS
  Специализированные: ISO (9660, Joliet, RockRidge), SquashFS, tar
  
*) Для файловых систем ext- типа главные атрибуты раскрыты в документе по операционной системе Unix.


Тело файла (file body)
----------------------

Можно показать, что любая информация может быть представлена в виде последовательности нулей и единиц. Например, 'A' 1000001, 'B' 1000010.

Чтобы записать слово АВВА условимся, что один символ всегда занимает 8 позиций (один байт). Если код символа короче, его следует дополнить слева нулями. Условимся читать символы слева направо (мы так привыкли читать текст), а код отдельного символа -- справа налево (немцы так привыкли читать цифры: "ein und zwanzig -- 21").

Итак, ABBA 01000001010000100100001001000001


Как хранить звук. Заголовок файла (Header)
------------------------------------------

Звуковая волна аппаратно преобразуется в плавно изменяющийся электрический сигнал (аналоговый), который измеряется через равные промежутки времени -- дискретизируется (например, с частотой дискретизации 44100 Гц -- CD, 48000 Гц DAT или кратными частотами 88200 - SACD, 96000, 192000 -- Audio DVD), каждая выборка записывается с некоторой точностью -- сэмплируется, и храниться как 16 (CD), 20 (HDCD), 24х (SaCD) битовое значение. Информация о структуре тела файла записывается в начало файла (заголовок). Длина заголовка определяется сигнатурой (уникальной комбинацией байтов) в начале файла (magic number)

  http://en.wikipedia.org/wiki/List_of_file_signatures
  
  
Как хранить рисунок
-------------------

В случае черно-белого рисунка, первое, что приходит в голову -- нарисовать рисунок на миллиметровку, каждый квадрат считать либо черным - 1, либо белым - 0. В заголовке файла указать количество клеточек по горизонтали и по вертикали. Для цветного изображения точка (pixel) представляется в виде комбинации цветов (RGB - red, green, blue; CMYK - cyan, magenta, yellow, key or blacK). Каждая точка может занимать несколько байт (1 - 4). Данные могут быть упакованы без потерь (как архиватором) или с потерями (после упаковки можно иметь только приближенное представление об оригинале). Отсюда множество форматов хранения картинки -- PPM, BMP, PNG, GIF, JPEG..


Как хранить видео
-----------------

Например, по кадрам (pushed JPEG). Для экономии места применяются различные виды сжатия (H.264, H.265). Картинка, звук, субтитры и так далее помещаются затем в файл-контейнер (MKV, AVI, MPG, FLV, WebM..). Часто тип контейнера виден в имени файла (расширении), например my.mkv


Запрет на хранение (передачу) двоичных данных
---------------------------------------------

Иногда - при хранении в текстовых документах или при передаче от одного компьютера к другому, некоторые байты (последовательности) зарезервированы а потому не могут быть использованы для хранения/передачи информации. Для таких случаев применяются популярные форматы:

1. Шестнадцатеричный дамп: 

  0000  0    0100  4    1000  8    1100  C
  0001  1    0101  5    1001  9    1101  D
  0010  2    0110  6    1010  A    1110  E
  0011  3    0111  7    1011  B    1111  F
  
Пример: 

  ABBA   0100 0001 0100 0010 0100 0010 0100 0001   41 42 42 41
  
2. Кодировка Base64 (каждые три байта кодируются четырьмя шестибитовыми символами согласно таблице. В конце дополняем нулями (padding)):

  000000  0   A     010000  10   Q     100000  20   g     110000  30   w
  000001  1   B     010001  11   R     100001  21   h     110001  31   x
  000010  2   C     010010  12   S     100010  22   i     110010  32   y
  000011  3   D     010011  13   T     100011  23   j     110011  33   z
  000100  4   E     010100  14   U     100100  24   k     110100  34   0
  000101  5   F     010101  15   V     100101  25   l     110101  35   1
  000110  6   G     010110  16   W     100110  26   m     110110  36   2
  000111  7   H     010111  17   X     100111  27   n     110111  37   3
  001000  8   I     011000  18   Y     101000  28   o     111000  38   4
  001001  9   J     011001  19   Z     101001  29   p     111001  39   5
  001010  A   K     011010  1A   a     101010  2A   q     111010  3A   6
  001011  B   L     011011  1B   b     101011  2B   r     111011  3B   7
  001100  C   M     011100  1C   c     101100  2C   s     111100  3C   8
  001101  D   N     011101  1D   d     101101  2D   t     111101  3D   9
  001110  E   O     011110  1E   e     101110  2E   u     111110  3E   +
  001111  F   P     011111  1F   f     101111  2F   v     111111  3F   /

               ------      ------      --padd
  ABBA   010000010100001001000010010000010000   QUJCQQ
         ------      ------      ------


Если в таблице кодировки нет места
----------------------------------

Существует два решения данной задачи.

1 - БНВД (Боливар не выдержит двоих): Расширяем таблицу так, что один символ займет 2 байта. Если символам нет места и в расширенной таблице (unicode, UTF-16) -- то им нет вовсе места на Земле.

2 - КНУТО (кто не успел тот опоздал): Символы байтовой таблицы, начинающиеся с 11 (их 64 с 11000000 по 11111111) заменяются червоточинами -- входами в расширенные таблицы, в которых в свою очередь могут иметься червоточины и т. д. (unicode, UTF-8). 

Алфавит создателя компьютера кодируется байтами, вторая волна (кирилица, хирогана, катахана, иврит, греческий алфавит) кодируется двухбайтовыми словами, далее следует трехбайтовые алфавиты (некоторые тибетские письмена), четырехбайтовые (жители планеты Небулу) и так далее без ограничений. Документ может иметь заголовок (сигнатуру, магическое число, BOM) EF BB BF.

Задания 1-5. На виртуальной машине mini-U поместить в папку владельца файл Nr. N (где N - номер бригады) архива из приложения Б. В случае необходимости раскодировать файл и установить какую-нибудь программу просмотра.

Задание 6. В домашней папке юзера virtu coздать текстовый файл virtu.txt содержащий текст "this is virtu's private file". В домашней папке юзера opilane coздать текстовый файл opilane.txt содержащий текст "this is opilane's private file". Продемонстрировать, что файлы видны только администратору и их владельцам.

Задание 7. Установить аргументы каталога incoming так, чтобы все желающие могли туда копировать свои файлы, но только юзер по имени spy видел их командой list (ls).
