Текстовый редактор, дающий вам третью руку

sublime

Sublime Text — удобный текстовый редактор для программистов. Честно, не понимаю как я раньше пользовался Notepad++ и редакторами в IDE.

Красивые шрифты, подсветка синтаксиса на куче языков, множество встроенных схем подсветки кода, автодополнение — всё это есть в нём из коробки.

Тег-ориентированная файловая система — вступление

Всё началось с того, что у меня накопились фотографии. Думаю, многим знакомо это чувство:

Ещё хуже, если «драйвер» фотоаппарата раскладывает все фотографии по датам. По-моему, так вообще невозможно ничего найти. Поэтому я попробовал хранить фотографии с тегами, и пускай это нельзя по-настоящему назвать файловой системой — свои функции она уже выполняет.

Тег-ориентированная файловая система — архитектура

Вступление

Окей, у нас вырисовывается архитектура системы:

  • Фотографии хранятся с именем GUID
  • Все фотографии имеют три версии — большое разрешение (начальное), среднее (для просмотра), и маленькое (для каталога) — с именами GUID_b.jpg, GUID_m.jpg и GUID_s.jpg.
  • Информация о фотографиях хранится в базе данных в 3 нормальной форме — в трёх таблицах:
  1. Список фотографий;
  2. Список всевозможных тегов;
  3. Список номеров тегов к каждой фотографии.

При добавлении новой фотографии складываем запись в таблицу фотографий с её идентификатором — GUID. При указании тега проверяем наличие его в таблице тегов, и если его нет — добавляем. После всего этого в таблицу «фотография–тег» добавляем n=n_тегов записей «ID записи — GUID — номер тега».

Выборка данных

Выборку данных будем делать SQL-запросом, объединяя все три таблицы.

Тег-ориентированная файловая система — интерфейс

[Вступление

Архитектура](/?p=230 “Тег-ориентированная файловая система — архитектура”)

API устроен следующим образом.

Запрос картинки

Вход: GUID картинки.

Процесс: из таблицы PhotoTags получаем перечень записей, относящихся к искомой фотографии — это номера тегов. Inner join`ом превращаем их в названия тегов.

Выход: дата фотографии, список номеров тегов с названиями тегов.

Запрос архива фотографий

Вход: номер тега, или null для получения полного архива.

Процесс: проходим по таблице PhotoTags, ищем все записи с искомым тегом (или вообще все записи если тег не указан). Группируем по GUID, т.е. получаем напротив каждого GUID список номеров тегов. Из таблицы тегов получаем их названия.

Выход: список GUID`ов, у каждого GUID — список номеров и названий тегов.

Запрос списка тегов

Вход:

Процесс: проходим по таблице PhotoTags, группируем записи по номерам тегов, считаем размер каждой группы и упорядочиваем список по убыванию.

Выход: список номеров, названий тегов и их популярности, упорядоченный по убыванию популярности.

Добавление фотографии

Вход:  временный адрес фотографии в папке загрузок

Процесс: генерируем GUID, копируем фотографию в нашу папку (с именем GUID), генерируем два размера картинок (с шириной 1620 пкс и 160 пкс), читаем EXIF-тег времени съёмки. В таблицу фотографий добавляем запись: GUID, время съёмки.

Выход: GUID.

Добавление тегов

Вход:  GUID, список тегов

Процесс: из таблицы тегов берём все их названия, ищем отрицание пересечения двух массивов. Новые теги, не существующие пока в таблице — добавляем в неё. Снова получаем массив тегов из таблицы, ищем в нём номера введённых тегов, и добавляем в базу PhotoTags записи: GUID, id_тега.

Выход:

Звуковой lossless-кодек

Для передачи звука по CAN нам необходимо уместить его в полосу 1 МБит/с. Но двухканальный 16-битный звук с частотой дискретизации 44.1 кГц требует 1.41 МБит/с. Плохое решение проблемы — передавать один канал, либо уменьшить дискретизацию, либо уменьшить разрядность. Хорошее решение — написать кодек, который без потерь качества сможет устранить избыточную информацию.