Vitaphoto — различия между версиями

Материал из YourcmcWiki
Перейти к: навигация, поиск
м (Хранение)
 
(не показаны 62 промежуточные версии этого же участника)
Строка 3: Строка 3:
 
На данной странице вы можете узнать об истории и преимуществах системы Vitaphoto над прочими аналогичными. Среди них — удобство использования, гибкость, безопасность и возможность управления множеством галерей на одном сервере.
 
На данной странице вы можете узнать об истории и преимуществах системы Vitaphoto над прочими аналогичными. Среди них — удобство использования, гибкость, безопасность и возможность управления множеством галерей на одном сервере.
  
Посмотреть на [[Vitaphoto]] '''V3''' в лице моей фотогалереи можно по следующей ссылке: [http://vmx.yourcmc.ru/vitaphoto http://vmx.yourcmc.ru/vitaphoto]. Гламурная… Ух!
+
Посмотреть на [[Vitaphoto]] '''V3 / 1.4''' в лице моей фотогалереи можно по следующей ссылке: [http://vmx.yourcmc.ru/vitaphotov3 http://vmx.yourcmc.ru/vitaphotov3]. Гламурная… Ух!
  
 
Старая версия (1.3 / V2) находится по адресу [http://vmx.yourcmc.ru/vitaphoto-legacy http://vmx.yourcmc.ru/vitaphoto-legacy].
 
Старая версия (1.3 / V2) находится по адресу [http://vmx.yourcmc.ru/vitaphoto-legacy http://vmx.yourcmc.ru/vitaphoto-legacy].
  
Посмотреть исходные коды [[Vitaphoto]] и выросшего из [[Vitaphoto]] фреймворка [[Sway Solstice]] можно здесь: [{{SVN|vitaphoto/branch/solstice/lib-vitaphoto}} (V3) lib-vitaphoto], [{{SVN|vitaphoto/branch/solstice/lib-sway}} (V3) lib-sway Solstice]. Исходники старой версии: [{{SVN|vitaphoto/head/lib}} (legacy) lib], [{{SVN|vitaphoto/head/lib-sway}} (legacy) lib-sway].
+
Посмотреть исходные коды [[Vitaphoto]] и выросшего из [[Vitaphoto]] фреймворка [[Sway Solstice]] можно здесь: [{{SVN|vitaphoto/solstice/lib-vitaphoto}} (V3) lib-vitaphoto], [{{SVN|vitaphoto/solstice/lib-sway}} (V3) lib-sway Solstice]. Исходники старой версии: [{{SVN|vitaphoto/head/lib}} (legacy) lib], [{{SVN|vitaphoto/head/lib-sway}} (legacy) lib-sway].
  
 
== История создания [[Vitaphoto]] ==
 
== История создания [[Vitaphoto]] ==
Строка 23: Строка 23:
 
* некоторые сервисы стараются даже запретить выкладывать фотографии в блог без вставки ссылки на сам сервис.
 
* некоторые сервисы стараются даже запретить выкладывать фотографии в блог без вставки ссылки на сам сервис.
  
И наоборот, на преимущества вроде кластеризатора фотографий (Flickr), или возможности «отправить ссылку на этот альбом» (Picasa), или возможности онлайн-заказа печати фото (ФотоФайл, НетПринт) мне откровенно наплевать. Иногда, возможно, и было бы интересно поиграться, но не более того.
+
И наоборот, на преимущества вроде кластеризатора фотографий (Flickr), или возможности «отправить ссылку на этот альбом» (Picasa), или возможности онлайн-заказа печати фото (ФотоФайл, НетПринт) мне откровенно наплевать. Иногда, возможно, и было бы интересно поиграться, но не более того. «Социальные сети… Облачность… Интеграция с тем… Интеграция с этим… Интеграция с интеграцией… Теперь другу можно отправить фотку одним кликом сидя в туалете, но нельзя выключить компьютер!» (лор).
  
 
Возможно, вы и сами уже прочувствовали на себе некоторые из этих недостатков. Обо мне и говорить нечего, меня они просто достали :-)
 
Возможно, вы и сами уже прочувствовали на себе некоторые из этих недостатков. Обо мне и говорить нечего, меня они просто достали :-)
Строка 29: Строка 29:
 
Потому я и создал [[Vitaphoto]]. Преимущества [[Vitaphoto]] с моей точки зрения:
 
Потому я и создал [[Vitaphoto]]. Преимущества [[Vitaphoto]] с моей точки зрения:
  
* добавление фотографий и альбомов представляет собой обычное копирование файлов, которое можно осуществлять по FTP и в любых объёмах, пока не закончится место на диске. Все скопированные фотографии добавляются в базу данных автоматически. Кстати, это будет легко и для непродвинутых пользователей, ибо даже виндовый Проводник может работать с FTP серверами;
+
* Добавление фотографий и видеороликов представляет собой обычное копирование файлов, которое можно осуществлять по FTP и в любых объёмах, пока не закончится место на диске. Все скопированные фотографии добавляются в базу данных автоматически. Кстати, это будет легко и для непродвинутых пользователей, ибо даже виндовый Проводник может работать с FTP серверами.
* все метаданные фотографии (название, теги) сохраняются в именах файлов, при этом, благодаря созданию символических ссылок на файлы, отсутствуют проблемы при запросе файлов с именами в русских кодировках;
+
* Название и теги фотографии сохраняются в именах файлов, время создания извлекается из EXIF-метаданных и метаданных видео.
* резервное копирование просто до безумия — достаточно зайти на сервер по FTP и слить к себе все файлы;
+
* Резервное копирование просто до безумия — достаточно зайти на сервер по FTP и слить к себе все файлы.
* точно так же просто дать доступ на скачивание всех фотографий кому-либо, заведя отдельную учётную запись FTP;
+
* Точно так же просто дать доступ на скачивание всех фотографий кому-либо, заведя отдельную учётную запись FTP.
* и точно так же просто дать доступ на добавление фотографий кому-либо, не ставя под угрозу собственную безопасность — необходимо завести отдельную учётную запись FTP для подкаталога домашней директории фотогалереи, и положить в него недоступный на запись через FTP файл «dirinfo» с заданием кодировки имён файлов и/или автоматически проставляемых на все фотографии подкаталога тегов;
+
* И точно так же просто дать доступ на добавление фотографий кому-либо, не ставя под угрозу собственную безопасность — необходимо завести отдельную учётную запись FTP для подкаталога домашней директории фотогалереи, а в название самой директории включить теги, которыми будет автоматически помечено всё содержимое, и (по желанию) название кодировки имён файлов;
* фотографии масштабируются по алгоритму Lanczos с использованием программы ImageMagick — это означает качество;
+
* Фотографии масштабируются по алгоритму Lanczos с использованием ImageMagick / GraphicsMagick — иными словами, «качественные миниатюры»!
* система рассчитана на любое количество галерей, управляемых одним приложением;
+
* Лично мне гораздо удобнее держать мою фотогалерею расположенной на своём сервере, а не на некотором стороннем фотохостинге.
* в описании альбома можно пользоваться простым wikiобразным синтаксисом для форматирования текста;
+
* Стабильное по датам разбиение всей фотогалереи на страницы, идентификация фотографий по именам, гламурненький дизайн, несколько размеров фото на выбор.
* мне гораздо удобнее держать мою фотогалерею расположенной на своём сервере, а не на некотором стороннем фотохостинге.
+
  
Система управления фотогалереями [[Vitaphoto]] написана на языке [[Perl]] 5 с использованием модуля Apache 2 [[mod_perl]] 2.0. Я старался создать простую и удобную систему со вменяемым исходным кодом. Вменяемым, кстати, исходный код стал не сразу, а только в версии 1.2, написанной в районе конца февраля — начале марта 2008 года. <s>И то не стал.</s> Кроме того, мне очень близки идеи Лэрри Уолла, в частности TMTOWTDI (There’s More Than One Way To Do It — «Это можно сделать по-разному»), а также «приятно быть важным, но куда важнее быть приятным». Возможно, они тоже наложили свой отпечаток на систему.
+
Система управления фотогалереями [[Vitaphoto]] написана на языке [[Perl]] 5 и может запускаться в разных конфигурациях — как простой отдельный HTTP-сервер, под CGI/FastCGI, под управлением запатченного модуля [http://nginx.ru/ nginx] ngx_http_perl_module и модулей Apache 2.x [http://perl.apache.org/ mod_perl 2.x] или Apache 1.x [http://perl.apache.org/docs/1.0/guide/index.html mod_perl 1.x]. Я старался создать простую и удобную систему со вменяемым исходным кодом. Вменяемым, кстати, исходный код стал не сразу, а только в версии 1.2, написанной в районе конца февраля — начале марта 2008 года. А может, только в 1.4 (2010 год). :-) Кроме того, мне очень близки идеи Лэрри Уолла, в частности TMTOWTDI (There’s More Than One Way To Do It — «Это можно сделать по-разному»), а также «приятно быть важным, но куда важнее быть приятным». Возможно, они тоже наложили свой отпечаток на систему.
 +
 
 +
Разработка системы ведётся, как всегда, эпизодически — по принципу «в попу стрельнуло», а в попу обычно стреляет сделать что-нибудь глобальное. Мелочи не привлекают.
 +
 
 +
== TODO для V3.1 / 1.5 ==
 +
 
 +
Активная в данный момент разрабатываемая версия. Фичи:
 +
 
 +
* Код снова подрос, его нужно привести в более MVP-состояние, разнести на модули / классы страниц.
 +
* {{ok}} Обработка изменений в именах директорий в процессе мониторинга, а не только при его начале
 +
** {{ok}} Также чтобы при удалении тега, который есть также в имени директории, он не удалялся с файла
 +
* Поле выбора тега с автокомплитом
 +
* Навигация в начало галереи (к самым старым фотографиям)
 +
* (?) Редиректы со старых имён на новые
 +
* (?) Режим файлменеджера
 +
* {{ok}} X-Accel-Redirect на файл по короткому URL с отдачей Content-Disposition, с целью генерации красивого УРЛа к файлу, при этом отдающего правильное UTF-8 имя файла вне зависимости от кодировки имён файлов на диске
 +
** {{warning}} Здесь есть проблема у nginx - он не понимает URL-кодированные адреса в X-Accel-Redirect. [{{SVN|vitalif/trunk/scripts/patch-nginx-x-accel-uri-parsing.diff|co}} Написал патч], его отревьюили, но пока не приняли.
 +
* {{ok}} Опция быстрого старта ScaleDaemon’а <tt><nowiki>--skip-initial</nowiki></tt> — отключение изначальной проверки всех файлов на изменения в галерее
 +
* (?) Статистика (неплохо бы рисовать простой графичек)
 +
* Для видео:
 +
** {{ok}} Автоматическое теггирование всех видеороликов тегом "video"
 +
** {{ok}} Поддержка нескольких разрешений — ручное добавление уменьшенных версий с тегом "downsampled"
 +
** {{ok}} Поддержка pseudostreaming'а, т.е. возможность перемотки при добавленных FLV-метаданных и включённом flv-стриминге в веб-сервере
 +
** {{ok}} Разбор FLV-метаданных
 +
** Maybe также возможность задавать дату съёмки в имени (ибо в MP4 и пока что WEBM с метаданными беда)
 +
* RSS/Atom подписка на новые фотографии!
 +
* {{ok}} Путь к шаблонам по умолчанию брать относительно каталога с кодом
 +
* <s>Отдельное пространство имён для видео?</s>
 +
* {{ok}} Показывать все теги ролика во всплывающей подсказке в списке
 +
** {{ok}} Исключая автотег "video"!
 +
* (?) Асинхронная подгрузка миниатюр вместо зависания запроса, когда надо много отмасштабировать. Тут нужно обратить внимание на то, чтобы они не ломились кучей (создаются-то всё равно последовательно).
 +
* Что-то придумать на тему тегирования фото БОЛЬШИМ количеством тегов, когда результирующее имя файла получается длиннее лимита ОС (255 символов)
 +
* Возможность скрыть фото с главной
 +
 
 +
Исправления багов:
 +
* {{ok}} Пропуск симлинков
 +
* {{ok}} Не обрабатывать левые файлы в каталоге с изображениями (типа *.php, например)
 +
* {{ok}} Ошибочное сообщение о пустом альбоме не показывалось
 +
* {{ok}} image.ISO Speed Used + image.ISO Speed Rating иногда показывались вместе, дублируя параметр ISO
 +
* {{ok}} Угадывание тегов не учитывало наличие фотографий с этими тегами из-за бага в селектбилдере
  
 
== Vitaphoto V3 / 1.4 ==
 
== Vitaphoto V3 / 1.4 ==
  
Разрабатываемая в данный момент версия. Качества:
+
Версия [[Vitaphoto]] V3 / 1.4 соответствует 5 июля 2010 года. [{{SVN|vitaphoto/release/1.4}} Исходные коды 1.4].
  
* Переписана на [[Sway Solstice]], причём, вместе со ScaleDaemon’ом. Кода меньше раза в 3, он понятнее и расширяемый, а работает лучше.
+
Качества:
* Огламуренный интерфейс, дизайн на флоатах и несколько размеров фото на выбор (viva большие мониторы!). Дошло аж до Drag’n’Drop’а.
+
 
 +
* '''«Скажи синтетическим ключам „нет“!»''' Фотографии и альбомы идентифицируются по именам, а не по ID’шникам.  
 
* Обычная страничная навигация заменена разбиением по датам.
 
* Обычная страничная навигация заменена разбиением по датам.
 +
* Огламуренный интерфейс, дизайн на флоатах и несколько размеров фото на выбор (viva большие мониторы!). Дошло аж до Drag’n’Drop’а.
 +
* '''Поддержка видео.'''
 
* Убран «язык запросов по тегам». Заменён выборкой по нескольким тегам.
 
* Убран «язык запросов по тегам». Заменён выборкой по нескольким тегам.
 
* Убраны «альбомы». Заменены выборкой по нескольким тегам.
 
* Убраны «альбомы». Заменены выборкой по нескольким тегам.
 
* Убрана собственная авторизация, добавлена «глобальная» через расширение MediaWiki ([{{SVN|vitalif/trunk/mediawiki/GlobalAuth}} вот оно]).
 
* Убрана собственная авторизация, добавлена «глобальная» через расширение MediaWiki ([{{SVN|vitalif/trunk/mediawiki/GlobalAuth}} вот оно]).
* Фотографии и альбомы идентифицируются по именам, а не по ID’шникам. «Нет синтетическим ключам!»
 
 
* Добавлено облако тегов.
 
* Добавлено облако тегов.
* Поддержка видео.
 
 
* Поддержка просмотра полной EXIF-информации.
 
* Поддержка просмотра полной EXIF-информации.
* Иногда живёт (а иногда умирает) по адресу [http://vmx.yourcmc.ru/vitaphotov3 http://vmx.yourcmc.ru/vitaphotov3].
+
* Переписана на [[Sway Solstice]], причём, вместе со ScaleDaemon’ом. Кода меньше раза в 3, он понятнее и расширяемый, а работает лучше. И апача больше тоже нет.
 +
* Живёт по адресу [http://vmx.yourcmc.ru/vitaphotov3 http://vmx.yourcmc.ru/vitaphotov3].
  
Почему после 1.3 идёт V3? Ответ кроется в версии схемы базы данных — это её третий вариант с момента зарождения. Первая база называлась просто «vitaphoto» (Vitaphoto 1.0, 1.1), вторая несовместимая с первой и заполняемая заново (Vitaphoto 1.2, 1.3) «vitaphotov2», третья и теперешняя «vitaphotov3». Название версии не окончательное, возможно, будет и не «V3».
+
Почему идущая после 1.3 версия 1.4 называется также V3? Ответ кроется в версии схемы базы данных — это её третий вариант с момента зарождения. Первая база называлась просто «vitaphoto» (Vitaphoto 1.0, 1.1), вторая несовместимая с первой и заполняемая заново (Vitaphoto 1.2, 1.3) «vitaphotov2», третья и теперешняя «vitaphotov3».
  
== Планы ==
+
=== Системные требования ===
  
Разработка ведётся эпизодически — по принципу «в попу стрельнуло». А в попу обычно стреляет сделать что-нибудь глобальное. Мелочи не привлекают.
+
Требуются следующие Perl-модули (установить командой cpan, она же <tt>perl -MCPAN -e shell</tt>):
 +
<pre>
 +
cpan Log::Log4perl Hash::Merge Net::Server PPI::Document Digest::SHA1 \
 +
    URI::Query URI::QueryParam URI::Escape HTTP::Body Image::EXIF \
 +
    Cache::FastMmap File::Path CGI::Cookie JSON HTTP::Server::Simple
 +
</pre>
  
Взгляд на V2: плюсы и минусы [[Vitaphoto]] 1.3 глазами меня (автора). По итогам этих плюсов с минусами, а точнее, минусов с идеями их устранения, и строится следующая версия (V3 / 1.4) [[Vitaphoto]]. <strike>Возможно, следующая версия будет также содержать собственное расширение для интеграции с MediaWiki.</strike> Поправка: Vitaphoto V3 содержит MediaWiki-расширение для глобальной авторизации.
+
Также требуется один из модулей Graphics::Magick (из комплекта [http://www.graphicsmagick.org/ graphicsmagick]), {{CPAN|Image::Magick}} или {{CPAN|GD}}.
  
=== Хранение ===
+
=== Анализ V2 ===
 +
 
 +
Ниже можно почитать о моём незамутнённом взгляде на V2 в формате «проблема-решение»: плюсы и минусы [[Vitaphoto]] 1.3 глазами меня (автора). По этим плюсам и минусам, а точнее, проблемам и решениям, и построена версия '''Vitaphoto V3 / 1.4'''. Vitaphoto V3 также содержит MediaWiki-расширение для глобальной авторизации.
 +
 
 +
Значок {{ok}} рядом с фичей / решением проблемы означает, что в релизе V3 / 1.4 эта фича уже реализована.
 +
 
 +
==== Хранение ====
  
 
<tab sep=tab class=simpletable head=top>
 
<tab sep=tab class=simpletable head=top>
Сейчас Удобно? А как удобно?
+
V2 Удобно? А как удобно?
 
Выкладывать фотки копированием и хранить свой фотоархив в одном месте, организуя его, как душа пожелает. {{handy}} {{ok}}
 
Выкладывать фотки копированием и хранить свой фотоархив в одном месте, организуя его, как душа пожелает. {{handy}} {{ok}}
 
Отдельный синтаксис у атрибутов файлов (скрытые и т. п.). {{handy|no}} {{ok}} Задавать их такими же тегами, как и всё остальное.
 
Отдельный синтаксис у атрибутов файлов (скрытые и т. п.). {{handy|no}} {{ok}} Задавать их такими же тегами, как и всё остальное.
Строка 77: Строка 128:
 
Создаваемые кучи симлинков усложняют код. {{handy|no}} {{ok}} Пошли они в жопу, эти симлинки! Делать всё кодом, брать из базы и отдавать перенаправление на нужный файл.
 
Создаваемые кучи симлинков усложняют код. {{handy|no}} {{ok}} Пошли они в жопу, эти симлинки! Делать всё кодом, брать из базы и отдавать перенаправление на нужный файл.
 
Все миниатюры хранятся в одном каталоге (direntry кончатся!) {{handy|no}} {{ok}} Хранить миниатюры во вложенных каталогах по '''n''' первым буквам хеша /scaled/WxH/a/a5/a54/a54xxxxx…xxx.jpg
 
Все миниатюры хранятся в одном каталоге (direntry кончатся!) {{handy|no}} {{ok}} Хранить миниатюры во вложенных каталогах по '''n''' первым буквам хеша /scaled/WxH/a/a5/a54/a54xxxxx…xxx.jpg
Возможность сменить кодировку имён файлов для подпапки. {{handy}} {{ok}}  
+
Возможность сменить кодировку имён файлов для подпапки. {{handy}} {{ok}}
Возможность автоматического теггирования файлов в подпапке. {{handy}} {{ok}}  
+
Возможность автоматического теггирования файлов в подпапке. {{handy}} {{ok}}
 
Необходимость задавать эти 2 свойства в файле <tt>dirinfo</tt>. {{handy|no}} {{ok}} Брать их из имени папки: «Имя_Папки (АвтоТеги, KOI8-R)».
 
Необходимость задавать эти 2 свойства в файле <tt>dirinfo</tt>. {{handy|no}} {{ok}} Брать их из имени папки: «Имя_Папки (АвтоТеги, KOI8-R)».
 
Невозможность жестоко ликвидировать файл из базы — при удалении только ставится флаг. {{handy|no}} {{ok}} Учитывая, что симлинки — в жопу, флаг «удалён» — тоже в жопу. Просто удалять и всё…
 
Невозможность жестоко ликвидировать файл из базы — при удалении только ставится флаг. {{handy|no}} {{ok}} Учитывая, что симлинки — в жопу, флаг «удалён» — тоже в жопу. Просто удалять и всё…
 
… Но тогда придётся заново масштабировать переименованные файлы. {{handy|no}} {{ok}} Ждать окончания очередной цепочки событий, и удалять только в её конце, так как при переименовании гарантированно придёт два события, а не одно.
 
… Но тогда придётся заново масштабировать переименованные файлы. {{handy|no}} {{ok}} Ждать окончания очередной цепочки событий, и удалять только в её конце, так как при переименовании гарантированно придёт два события, а не одно.
 +
Невозможность скачать сразу набор файлов {{handy|no}} Можно предоставить интерфейс для скачивания сразу тучи файлов, НО по паролю!
 
</tab>
 
</tab>
  
=== Веб-морда ===
+
==== Веб-морда ====
  
 
<tab sep=tab class=simpletable head=top>
 
<tab sep=tab class=simpletable head=top>
Сейчас Удобно? А как удобно?
+
V2 Удобно? А как удобно?
Независимые ссылки на фотографии по началу имени до первой точки. {{handy}} &nbsp;
+
Независимые ссылки на фотографии по началу имени до первой точки. {{handy}} {{ok}}
Ссылки на альбомы содержат синтетический ключ и «нечеловекопонятны». {{handy|no}} Убрать сущность «альбом» вообще к чёртовой матери. Оставить теги + наборы тегов. Как можно меньше синтетических ключей! '''[[Vitaphoto: Ссылки]]'''.
+
Ссылки на альбомы содержат синтетический ключ и «нечеловекопонятны». {{handy|no}} {{ok}} Убрать сущность «альбом» вообще к чёртовой матери. Оставить теги + наборы тегов. Скажи синтетическим ключам «нет»! '''[[Vitaphoto: Ссылки]]'''.
 
Есть комменты. {{handy}} &nbsp;
 
Есть комменты. {{handy}} &nbsp;
 
… В них есть разметка-"виласипет" (самодельная), можно сказать её нет. {{handy|no}} Использовать Wiki-разметку, опять-таки, из MediaWiki.
 
… В них есть разметка-"виласипет" (самодельная), можно сказать её нет. {{handy|no}} Использовать Wiki-разметку, опять-таки, из MediaWiki.
 
… Комменты хранятся отдельно, сбоку, в базе. {{handy|no}} Неплохо бы как-то приспособить к этому страницы обсуждения [[{{SITENAME}}]].
 
… Комменты хранятся отдельно, сбоку, в базе. {{handy|no}} Неплохо бы как-то приспособить к этому страницы обсуждения [[{{SITENAME}}]].
 
Текстовые части дизайна выглядят очень грустно, «нетипографично». {{handy|no}} Тексты форматировать через [[{{SITENAME}}]].
 
Текстовые части дизайна выглядят очень грустно, «нетипографично». {{handy|no}} Тексты форматировать через [[{{SITENAME}}]].
Голосование («+» и «-» отдельно). {{handy}} &nbsp;
+
Голосование («+» и «-» отдельно). {{handy}} {{ok}}
Лог голосования хранится в базе. {{handy}} &nbsp;
+
Лог голосования хранится в базе. {{handy}} {{ok}}
Отдельная база пользователей, и нет регистрации. {{handy|no}} Авторизоваться по базе [[{{SITENAME}}]]. Для прозрачной глобальной аутентификации также можно создать расширение MediaWiki.
+
Отдельная база пользователей, и нет регистрации. {{handy|no}} {{ok}} Авторизоваться по базе [[{{SITENAME}}]]. Для прозрачной глобальной аутентификации также можно создать расширение MediaWiki.
Нет сортировки по дате, извлекаемой из EXIF. {{handy|no}} Добавить её.
+
Нет сортировки по дате, извлекаемой из EXIF. {{handy|no}} {{ok}} Добавить её.
 
Нет RSS-лент. {{handy|no}} Добавить их — на все альбомы, желательно также на обсуждения фотографий.
 
Нет RSS-лент. {{handy|no}} Добавить их — на все альбомы, желательно также на обсуждения фотографий.
Нет выборки по дате. {{handy|no}} Добавить её. Как для отдельной фотографии, так и для множества.
+
Нет выборки по дате. {{handy|no}} {{ok}} Добавить её. Как для отдельной фотографии, так и для множества.
Нет ссылок на предыдущую/следующую страницу в альбоме. {{handy|no}} Добавить их, а текущие <nowiki>"<" и ">" переименовать в "<<" и ">>"</nowiki>.
+
Нет ссылок на предыдущую/следующую страницу в альбоме. {{handy|no}} {{ok}} Добавить их, а текущие <nowiki>"<" и ">" переименовать в "<<" и ">>"</nowiki>.
Есть «альбомы», нет «облаков тегов». {{handy|no}} Сделать удобную навигацию по тегам и вложенным тегам, про отдельные «альбомы» забыть: '''[[Vitaphoto: Облака тегов]]'''.
+
Есть «альбомы», нет «облаков тегов». {{handy|no}} {{ok}} Сделать удобную навигацию по тегам и вложенным тегам, про отдельные «альбомы» забыть: '''[[Vitaphoto: Облака тегов]]'''.
Навигация в альбомах по страницам; при обновлении меняются ВСЕ страницы, так как разбиение — по числу фотографий. {{handy|no}} Следуя общей идеологии («как можно меньше синтетических ключей») — лучше по дате. В модном виде — такой скроллер, типа. Важный момент: в ссылке на диапазон дат (если на страницу влезают несколько дат) должна присутствовать минимальная из этих дат, чтобы при возможном добавлении новых дат на ту же страницу ссылка не менялась. Ещё важный момент: на главной странице чуть другой механизм выбора фотографий (не от начала по датам, а от конца по датам).
+
Навигация в альбомах по страницам; при обновлении меняются ВСЕ страницы, так как разбиение — по числу фотографий. {{handy|no}} {{ok}} Следуя общей идеологии («скажи синтетическим ключам НЕТ») — лучше по дате. В модном виде — такой скроллер, типа. Важный момент: в ссылке на диапазон дат (если на страницу влезают несколько дат) должна присутствовать минимальная из этих дат, чтобы при возможном добавлении новых дат на ту же страницу ссылка не менялась. Ещё важный момент: на главной странице чуть другой механизм выбора фотографий (не от начала по датам, а от конца по датам).
 
Статистика просмотров собирается, но не отображается. {{handy|no}} Отображать (по фотографии, по тегу)!
 
Статистика просмотров собирается, но не отображается. {{handy|no}} Отображать (по фотографии, по тегу)!
Размер миниатюр в альбомах фиксирован. {{handy|no}} Сделать кнопочки +/- для переключения размеров — «маленький», «средний», «большой».
+
Размер миниатюр в альбомах фиксирован. {{handy|no}} {{ok}} Сделать кнопочки для переключения размеров — «маленький», «средний», «большой».
Некрасиво выглядят «вертикальные» фотографии в общем потоке… {{handy|no}} Просто располагать все фотографии в «плавающем» порядке с равными '''интервалами'''.
+
Некрасиво выглядят «вертикальные» фотографии в общем потоке… {{handy|no}} {{ok}} Просто располагать все фотографии в «плавающем» порядке с равными '''интервалами'''.
Описания альбомов находятся где-то сильно в жопе, внизу. {{handy|no}} Несколько переделать дизайн — пусть баннер будет тянуться на всю ширину, центральная белая часть — в процентах от ширины, слева '''только''' фотографии, справа описание альбома, потом список (список, а не облако!) тегов по убыванию популярности на странице.
+
Описания альбомов находятся где-то сильно в жопе, внизу. {{handy|no}} {{ok}} Переделать дизайн на флоаты, описания альбомов минимизировать, ибо нет от них толку.
 
Есть диафильмы. {{handy}} &nbsp;
 
Есть диафильмы. {{handy}} &nbsp;
 
… Но миниатюры в них крупноваты и всего 3 фото. {{handy|no}} Показывать диафильм мельче и справа, а не сверху.
 
… Но миниатюры в них крупноваты и всего 3 фото. {{handy|no}} Показывать диафильм мельче и справа, а не сверху.
 
… Кнопки влево-вправо двигают диафильм, а не переключают фото. {{handy|no}} Добавить мелкие полупрозрачные кнопки по краям диафильма — они пусть двигают диафильм. Большие влево-вправо оставить вверху фото и пусть они ведут на другие фото.
 
… Кнопки влево-вправо двигают диафильм, а не переключают фото. {{handy|no}} Добавить мелкие полупрозрачные кнопки по краям диафильма — они пусть двигают диафильм. Большие влево-вправо оставить вверху фото и пусть они ведут на другие фото.
 +
Невозможно «руками» выбрать дату и/или тег {{handy|no}} Сделать поля ввода для выбора. Для тегов — с автокомплитом, для дат — м.б. с календарём?
 
</tab>
 
</tab>
  
=== Архитектура кода ===
+
==== Архитектура кода ====
  
 
<tab sep=tab class=simpletable head=top>
 
<tab sep=tab class=simpletable head=top>
Сейчас Удобно? А как удобно?
+
V2 Удобно? А как удобно?
Код веб-приложения кривоват и содержит много дублирования. {{handy|no}} Перетащить на [[Sway Solstice]] + [[Платформы_для_запуска_Perl_веб-приложений#HTTP::Server::Simple|HTTP::Server::Simple]] вместо Апача.
+
Код веб-приложения кривоват и содержит много дублирования. {{handy|no}} {{ok}} Перетащить на [[Sway Solstice]] + [[:Платформы_для_запуска_Perl_веб-приложений#HTTP::Server::Simple|HTTP::Server::Simple]] вместо Апача.
Язык булевых запросов по тегам, реализованный в базе на PL/SQL + Sway::TagAlbum / Sway::TagEntry. {{handy|no}} Изврат кошмарный. Избавиться. Перетащить либо на софтовую реализацию, либо на join’ы и [[Funq]]. А вообще-то — просто убрать.
+
Язык булевых запросов по тегам, реализованный в базе на PL/SQL + Sway::TagAlbum / Sway::TagEntry. {{handy|no}} {{ok}} Изврат кошмарный. Избавиться. Перетащить либо на софтовую реализацию, либо на join’ы и [[Funq]]. А вообще-то — просто убрать.
Приложение не расширяемое. {{handy|no}} Добавить hook’ов на манер MediaWiki, так как MediaWiki доказывает, что подход работает. '''[[Vitaphoto: Hooks]]'''.
+
Приложение не расширяемое. {{handy|no}} {{ok}} Добавить hook’ов на манер MediaWiki, так как MediaWiki доказывает, что подход работает. '''[[Vitaphoto: Hooks]]'''.
Масса галерей в одной БД усложняет код. {{handy|no}} Для дополнительной галереи гораздо проще создавать дополнительную БД.
+
Масса галерей в одной БД усложняет код. {{handy|no}} {{ok}} Для дополнительной галереи гораздо проще создавать дополнительную БД.
 
</tab>
 
</tab>
  
Строка 127: Строка 180:
  
 
* Язык запросов по тегам, то есть, чтобы была позволена не только логическая операция «И», а также «ИЛИ» и «НЕ»; автоматическое вычисление вхождения альбома в альбом (используется приведение выражения к ДНФ);
 
* Язык запросов по тегам, то есть, чтобы была позволена не только логическая операция «И», а также «ИЛИ» и «НЕ»; автоматическое вычисление вхождения альбома в альбом (используется приведение выражения к ДНФ);
** То есть, можно задавать логические выражения (в стандартном базисе :-D) над тегами. Это могут делать все на [http://vmx.yourcmc.ru/s/vitaphoto/search.htm странице поиска]. Автоматическое вычисление вхождения подальбома в альбом (сравнение булевых функций, заданных формулами O_o);
+
** То есть, можно задавать логические выражения (в стандартном базисе :-D) над тегами. Это могут делать все на [http://vmx.yourcmc.ru/s/legacy-static/search.htm странице поиска]. Автоматическое вычисление вхождения подальбома в альбом (сравнение булевых функций, заданных формулами O_o);
 
* Голосование «за» и «против» фотографий, с возможностью привязки к комментариям;
 
* Голосование «за» и «против» фотографий, с возможностью привязки к комментариям;
 
* Онлайн-конфигурация своей фотогалереи (надо быть root’ом);
 
* Онлайн-конфигурация своей фотогалереи (надо быть root’ом);
Строка 165: Строка 218:
 
** Теперь код стал а) вменяемый и б) объектно-ориентированный (фотография — объект, фотоальбом — объект). Это я сделал, когда написал код обновления галереи в том же стиле, в каком был написан мною весь код летом, и понял, что дальше так жить нельзя. Код был укуренный, а теперь отпустило :) превеед, [http://m0r1k.livejournal.com m0r1k]! Ты меня почти воспитал;
 
** Теперь код стал а) вменяемый и б) объектно-ориентированный (фотография — объект, фотоальбом — объект). Это я сделал, когда написал код обновления галереи в том же стиле, в каком был написан мною весь код летом, и понял, что дальше так жить нельзя. Код был укуренный, а теперь отпустило :) превеед, [http://m0r1k.livejournal.com m0r1k]! Ты меня почти воспитал;
 
* Ведение простой статистики в БД.
 
* Ведение простой статистики в БД.
 +
 +
Архитектурные отличия старой версии 1.2 от более новых:
 +
* Была завязка на [http://perl.apache.org/ mod_perl] 2.0;
 +
* Благодаря созданию символических ссылок на файлы, отсутствуют проблемы при запросе файлов с именами в русских кодировках, но зато теряются полные имена файлов при скачивании;
 +
* Чтобы дать доступ на добавление фотографий кому-либо, не ставя под угрозу собственную безопасность — необходимо завести отдельную учётную запись FTP для подкаталога домашней директории фотогалереи, и положить в него недоступный на запись через FTP файл «dirinfo» с заданием кодировки имён файлов и/или автоматически проставляемых на все фотографии подкаталога тегов;
 +
* Система рассчитана на любое количество галерей, управляемых одним приложением;
 +
* В описании альбома можно пользоваться простым wikiобразным синтаксисом для форматирования текста.
  
 
== Реализовано в Vitaphoto 1.1 ==
 
== Реализовано в Vitaphoto 1.1 ==
Строка 184: Строка 244:
  
 
[[Категория:Sway]]
 
[[Категория:Sway]]
[[Категория:Разработка]]
+
[[Категория:Архив]]

Текущая версия на 15:42, 20 июня 2016

Vitaphoto — система управления фотогалереями, обладающая некоторыми уникальными отличительными особенностями, самая главная из которых — заливка фотографий в галерею не через веб-интерфейс, а обычным копированием файла в заданную директорию на сервере. То есть, ФС-ориентированность.

На данной странице вы можете узнать об истории и преимуществах системы Vitaphoto над прочими аналогичными. Среди них — удобство использования, гибкость, безопасность и возможность управления множеством галерей на одном сервере.

Посмотреть на Vitaphoto V3 / 1.4 в лице моей фотогалереи можно по следующей ссылке: http://vmx.yourcmc.ru/vitaphotov3. Гламурная… Ух!

Старая версия (1.3 / V2) находится по адресу http://vmx.yourcmc.ru/vitaphoto-legacy.

Посмотреть исходные коды Vitaphoto и выросшего из Vitaphoto фреймворка Sway Solstice можно здесь: (V3) lib-vitaphoto, (V3) lib-sway Solstice. Исходники старой версии: (legacy) lib, (legacy) lib-sway.

История создания Vitaphoto

Причиной создания Vitaphoto послужило то, что… мне просто захотелось выкладывать фотографии к себе на сайт. Фотохостинги я не люблю — вот лишь небольшой список их недостатков с моей точки зрения:

  • имена файлов после заливки, как правило, теряются;
  • нет возможности резервного копирования;
  • в моде AJAX и браузерные интерфейсы, кое-где (Picasa) из-за этого «Opera поддерживается не полностью», а Opera — мой любимый браузер, да и вообще не люблю я, когда всё пестрит;
  • многие сервисы изобилуют рекламой;
  • многие сервисы расположены на загруженных или отдалённых от России серверах, короче, банально «тормозят»;
  • многие сервисы используют откровенно некачественные алгоритмы масштабирования изображений (например, ФотоФайл);
  • добавление фото практически везде ведётся только через веб-интерфейс или через 'специально разработанную' программу-* клиент, а они, как правило, ещё и убого («плюшево») выглядят, или напичканы ненужными функциями;
  • как правило, нет возможности скачать альбом на диск полностью, а кое-где с этим даже ведут борьбу (всё тот же ФотоФайл);
  • некоторые сервисы стараются даже запретить выкладывать фотографии в блог без вставки ссылки на сам сервис.

И наоборот, на преимущества вроде кластеризатора фотографий (Flickr), или возможности «отправить ссылку на этот альбом» (Picasa), или возможности онлайн-заказа печати фото (ФотоФайл, НетПринт) мне откровенно наплевать. Иногда, возможно, и было бы интересно поиграться, но не более того. «Социальные сети… Облачность… Интеграция с тем… Интеграция с этим… Интеграция с интеграцией… Теперь другу можно отправить фотку одним кликом сидя в туалете, но нельзя выключить компьютер!» (лор).

Возможно, вы и сами уже прочувствовали на себе некоторые из этих недостатков. Обо мне и говорить нечего, меня они просто достали :-)

Потому я и создал Vitaphoto. Преимущества Vitaphoto с моей точки зрения:

  • Добавление фотографий и видеороликов представляет собой обычное копирование файлов, которое можно осуществлять по FTP и в любых объёмах, пока не закончится место на диске. Все скопированные фотографии добавляются в базу данных автоматически. Кстати, это будет легко и для непродвинутых пользователей, ибо даже виндовый Проводник может работать с FTP серверами.
  • Название и теги фотографии сохраняются в именах файлов, время создания извлекается из EXIF-метаданных и метаданных видео.
  • Резервное копирование просто до безумия — достаточно зайти на сервер по FTP и слить к себе все файлы.
  • Точно так же просто дать доступ на скачивание всех фотографий кому-либо, заведя отдельную учётную запись FTP.
  • И точно так же просто дать доступ на добавление фотографий кому-либо, не ставя под угрозу собственную безопасность — необходимо завести отдельную учётную запись FTP для подкаталога домашней директории фотогалереи, а в название самой директории включить теги, которыми будет автоматически помечено всё содержимое, и (по желанию) название кодировки имён файлов;
  • Фотографии масштабируются по алгоритму Lanczos с использованием ImageMagick / GraphicsMagick — иными словами, «качественные миниатюры»!
  • Лично мне гораздо удобнее держать мою фотогалерею расположенной на своём сервере, а не на некотором стороннем фотохостинге.
  • Стабильное по датам разбиение всей фотогалереи на страницы, идентификация фотографий по именам, гламурненький дизайн, несколько размеров фото на выбор.

Система управления фотогалереями Vitaphoto написана на языке Perl 5 и может запускаться в разных конфигурациях — как простой отдельный HTTP-сервер, под CGI/FastCGI, под управлением запатченного модуля nginx ngx_http_perl_module и модулей Apache 2.x mod_perl 2.x или Apache 1.x mod_perl 1.x. Я старался создать простую и удобную систему со вменяемым исходным кодом. Вменяемым, кстати, исходный код стал не сразу, а только в версии 1.2, написанной в районе конца февраля — начале марта 2008 года. А может, только в 1.4 (2010 год). :-) Кроме того, мне очень близки идеи Лэрри Уолла, в частности TMTOWTDI (There’s More Than One Way To Do It — «Это можно сделать по-разному»), а также «приятно быть важным, но куда важнее быть приятным». Возможно, они тоже наложили свой отпечаток на систему.

Разработка системы ведётся, как всегда, эпизодически — по принципу «в попу стрельнуло», а в попу обычно стреляет сделать что-нибудь глобальное. Мелочи не привлекают.

TODO для V3.1 / 1.5

Активная в данный момент разрабатываемая версия. Фичи:

  • Код снова подрос, его нужно привести в более MVP-состояние, разнести на модули / классы страниц.
  • Ok16.png Обработка изменений в именах директорий в процессе мониторинга, а не только при его начале
    • Ok16.png Также чтобы при удалении тега, который есть также в имени директории, он не удалялся с файла
  • Поле выбора тега с автокомплитом
  • Навигация в начало галереи (к самым старым фотографиям)
  • (?) Редиректы со старых имён на новые
  • (?) Режим файлменеджера
  • Ok16.png X-Accel-Redirect на файл по короткому URL с отдачей Content-Disposition, с целью генерации красивого УРЛа к файлу, при этом отдающего правильное UTF-8 имя файла вне зависимости от кодировки имён файлов на диске
    • Warning Warning: Здесь есть проблема у nginx - он не понимает URL-кодированные адреса в X-Accel-Redirect. Написал патч, его отревьюили, но пока не приняли.
  • Ok16.png Опция быстрого старта ScaleDaemon’а --skip-initial — отключение изначальной проверки всех файлов на изменения в галерее
  • (?) Статистика (неплохо бы рисовать простой графичек)
  • Для видео:
    • Ok16.png Автоматическое теггирование всех видеороликов тегом "video"
    • Ok16.png Поддержка нескольких разрешений — ручное добавление уменьшенных версий с тегом "downsampled"
    • Ok16.png Поддержка pseudostreaming'а, т.е. возможность перемотки при добавленных FLV-метаданных и включённом flv-стриминге в веб-сервере
    • Ok16.png Разбор FLV-метаданных
    • Maybe также возможность задавать дату съёмки в имени (ибо в MP4 и пока что WEBM с метаданными беда)
  • RSS/Atom подписка на новые фотографии!
  • Ok16.png Путь к шаблонам по умолчанию брать относительно каталога с кодом
  • Отдельное пространство имён для видео?
  • Ok16.png Показывать все теги ролика во всплывающей подсказке в списке
    • Ok16.png Исключая автотег "video"!
  • (?) Асинхронная подгрузка миниатюр вместо зависания запроса, когда надо много отмасштабировать. Тут нужно обратить внимание на то, чтобы они не ломились кучей (создаются-то всё равно последовательно).
  • Что-то придумать на тему тегирования фото БОЛЬШИМ количеством тегов, когда результирующее имя файла получается длиннее лимита ОС (255 символов)
  • Возможность скрыть фото с главной

Исправления багов:

  • Ok16.png Пропуск симлинков
  • Ok16.png Не обрабатывать левые файлы в каталоге с изображениями (типа *.php, например)
  • Ok16.png Ошибочное сообщение о пустом альбоме не показывалось
  • Ok16.png image.ISO Speed Used + image.ISO Speed Rating иногда показывались вместе, дублируя параметр ISO
  • Ok16.png Угадывание тегов не учитывало наличие фотографий с этими тегами из-за бага в селектбилдере

Vitaphoto V3 / 1.4

Версия Vitaphoto V3 / 1.4 соответствует 5 июля 2010 года. Исходные коды 1.4.

Качества:

  • «Скажи синтетическим ключам „нет“!» Фотографии и альбомы идентифицируются по именам, а не по ID’шникам.
  • Обычная страничная навигация заменена разбиением по датам.
  • Огламуренный интерфейс, дизайн на флоатах и несколько размеров фото на выбор (viva большие мониторы!). Дошло аж до Drag’n’Drop’а.
  • Поддержка видео.
  • Убран «язык запросов по тегам». Заменён выборкой по нескольким тегам.
  • Убраны «альбомы». Заменены выборкой по нескольким тегам.
  • Убрана собственная авторизация, добавлена «глобальная» через расширение MediaWiki (вот оно).
  • Добавлено облако тегов.
  • Поддержка просмотра полной EXIF-информации.
  • Переписана на Sway Solstice, причём, вместе со ScaleDaemon’ом. Кода меньше раза в 3, он понятнее и расширяемый, а работает лучше. И апача больше тоже нет.
  • Живёт по адресу http://vmx.yourcmc.ru/vitaphotov3.

Почему идущая после 1.3 версия 1.4 называется также V3? Ответ кроется в версии схемы базы данных — это её третий вариант с момента зарождения. Первая база называлась просто «vitaphoto» (Vitaphoto 1.0, 1.1), вторая несовместимая с первой и заполняемая заново (Vitaphoto 1.2, 1.3) «vitaphotov2», третья и теперешняя «vitaphotov3».

Системные требования

Требуются следующие Perl-модули (установить командой cpan, она же perl -MCPAN -e shell):

cpan Log::Log4perl Hash::Merge Net::Server PPI::Document Digest::SHA1 \
     URI::Query URI::QueryParam URI::Escape HTTP::Body Image::EXIF \
     Cache::FastMmap File::Path CGI::Cookie JSON HTTP::Server::Simple

Также требуется один из модулей Graphics::Magick (из комплекта graphicsmagick), Image::Magick или GD.

Анализ V2

Ниже можно почитать о моём незамутнённом взгляде на V2 в формате «проблема-решение»: плюсы и минусы Vitaphoto 1.3 глазами меня (автора). По этим плюсам и минусам, а точнее, проблемам и решениям, и построена версия Vitaphoto V3 / 1.4. Vitaphoto V3 также содержит MediaWiki-расширение для глобальной авторизации.

Значок Ok16.png рядом с фичей / решением проблемы означает, что в релизе V3 / 1.4 эта фича уже реализована.

Хранение

V2Удобно?А как удобно?
Выкладывать фотки копированием и хранить свой фотоархив в одном месте, организуя его, как душа пожелает.удобноOk16.png
Отдельный синтаксис у атрибутов файлов (скрытые и т. п.).неудобноOk16.png Задавать их такими же тегами, как и всё остальное.
Описания альбомов и выражения в файлах.неудобноБрать их из статей YourcmcWiki.
Статические страницы лежат отдельными HTML’ками.неудобноБрать их из статей YourcmcWiki.
… С другой стороны, это будет завязка на MediaWiki.неудобноХранить все «завязки» в файлах или базе. Из MediaWiki просто экспорт. Причём тут даже никакой демон не нужен — из медиавики экспорт по таким же ссылкам в отдельную папочку, а дальше подключение шаблонизатором.
При скачивании фото название теряется.неудобноOk16.png Не париться никакими симлинками и выводить ссылкой на сохранение полноразмерного изображения настоящее имя файла.
Создаваемые кучи симлинков усложняют код.неудобноOk16.png Пошли они в жопу, эти симлинки! Делать всё кодом, брать из базы и отдавать перенаправление на нужный файл.
Все миниатюры хранятся в одном каталоге (direntry кончатся!)неудобноOk16.png Хранить миниатюры во вложенных каталогах по n первым буквам хеша /scaled/WxH/a/a5/a54/a54xxxxx…xxx.jpg
Возможность сменить кодировку имён файлов для подпапки.удобноOk16.png
Возможность автоматического теггирования файлов в подпапке.удобноOk16.png
Необходимость задавать эти 2 свойства в файле dirinfo.неудобноOk16.png Брать их из имени папки: «Имя_Папки (АвтоТеги, KOI8-R)».
Невозможность жестоко ликвидировать файл из базы — при удалении только ставится флаг.неудобноOk16.png Учитывая, что симлинки — в жопу, флаг «удалён» — тоже в жопу. Просто удалять и всё…
… Но тогда придётся заново масштабировать переименованные файлы.неудобноOk16.png Ждать окончания очередной цепочки событий, и удалять только в её конце, так как при переименовании гарантированно придёт два события, а не одно.
Невозможность скачать сразу набор файловнеудобноМожно предоставить интерфейс для скачивания сразу тучи файлов, НО по паролю!

Веб-морда

V2Удобно?А как удобно?
Независимые ссылки на фотографии по началу имени до первой точки.удобноOk16.png
Ссылки на альбомы содержат синтетический ключ и «нечеловекопонятны».неудобноOk16.png Убрать сущность «альбом» вообще к чёртовой матери. Оставить теги + наборы тегов. Скажи синтетическим ключам «нет»! Vitaphoto: Ссылки.
Есть комменты.удобно 
… В них есть разметка-"виласипет" (самодельная), можно сказать её нет.неудобноИспользовать Wiki-разметку, опять-таки, из MediaWiki.
… Комменты хранятся отдельно, сбоку, в базе.неудобноНеплохо бы как-то приспособить к этому страницы обсуждения YourcmcWiki.
Текстовые части дизайна выглядят очень грустно, «нетипографично».неудобноТексты форматировать через YourcmcWiki.
Голосование («+» и «-» отдельно).удобноOk16.png
Лог голосования хранится в базе.удобноOk16.png
Отдельная база пользователей, и нет регистрации.неудобноOk16.png Авторизоваться по базе YourcmcWiki. Для прозрачной глобальной аутентификации также можно создать расширение MediaWiki.
Нет сортировки по дате, извлекаемой из EXIF.неудобноOk16.png Добавить её.
Нет RSS-лент.неудобноДобавить их — на все альбомы, желательно также на обсуждения фотографий.
Нет выборки по дате.неудобноOk16.png Добавить её. Как для отдельной фотографии, так и для множества.
Нет ссылок на предыдущую/следующую страницу в альбоме.неудобноOk16.png Добавить их, а текущие "<" и ">" переименовать в "<<" и ">>".
Есть «альбомы», нет «облаков тегов».неудобноOk16.png Сделать удобную навигацию по тегам и вложенным тегам, про отдельные «альбомы» забыть: Vitaphoto: Облака тегов.
Навигация в альбомах по страницам; при обновлении меняются ВСЕ страницы, так как разбиение — по числу фотографий.неудобноOk16.png Следуя общей идеологии («скажи синтетическим ключам НЕТ») — лучше по дате. В модном виде — такой скроллер, типа. Важный момент: в ссылке на диапазон дат (если на страницу влезают несколько дат) должна присутствовать минимальная из этих дат, чтобы при возможном добавлении новых дат на ту же страницу ссылка не менялась. Ещё важный момент: на главной странице чуть другой механизм выбора фотографий (не от начала по датам, а от конца по датам).
Статистика просмотров собирается, но не отображается.неудобноОтображать (по фотографии, по тегу)!
Размер миниатюр в альбомах фиксирован.неудобноOk16.png Сделать кнопочки для переключения размеров — «маленький», «средний», «большой».
Некрасиво выглядят «вертикальные» фотографии в общем потоке…неудобноOk16.png Просто располагать все фотографии в «плавающем» порядке с равными интервалами.
Описания альбомов находятся где-то сильно в жопе, внизу.неудобноOk16.png Переделать дизайн на флоаты, описания альбомов минимизировать, ибо нет от них толку.
Есть диафильмы.удобно 
… Но миниатюры в них крупноваты и всего 3 фото.неудобноПоказывать диафильм мельче и справа, а не сверху.
… Кнопки влево-вправо двигают диафильм, а не переключают фото.неудобноДобавить мелкие полупрозрачные кнопки по краям диафильма — они пусть двигают диафильм. Большие влево-вправо оставить вверху фото и пусть они ведут на другие фото.
Невозможно «руками» выбрать дату и/или тегнеудобноСделать поля ввода для выбора. Для тегов — с автокомплитом, для дат — м.б. с календарём?

Архитектура кода

V2Удобно?А как удобно?
Код веб-приложения кривоват и содержит много дублирования.неудобноOk16.png Перетащить на Sway Solstice + HTTP::Server::Simple вместо Апача.
Язык булевых запросов по тегам, реализованный в базе на PL/SQL + Sway::TagAlbum / Sway::TagEntry.неудобноOk16.png Изврат кошмарный. Избавиться. Перетащить либо на софтовую реализацию, либо на join’ы и Funq. А вообще-то — просто убрать.
Приложение не расширяемое.неудобноOk16.png Добавить hook’ов на манер MediaWiki, так как MediaWiki доказывает, что подход работает. Vitaphoto: Hooks.
Масса галерей в одной БД усложняет код.неудобноOk16.png Для дополнительной галереи гораздо проще создавать дополнительную БД.

Реализовано в Vitaphoto 1.3

Версия Vitaphoto 1.3 соответствует 6 сентября 2008 года. Исходные коды 1.3, исходные коды 1.31.

  • Язык запросов по тегам, то есть, чтобы была позволена не только логическая операция «И», а также «ИЛИ» и «НЕ»; автоматическое вычисление вхождения альбома в альбом (используется приведение выражения к ДНФ);
    • То есть, можно задавать логические выражения (в стандартном базисе :-D) над тегами. Это могут делать все на странице поиска. Автоматическое вычисление вхождения подальбома в альбом (сравнение булевых функций, заданных формулами O_o);
  • Голосование «за» и «против» фотографий, с возможностью привязки к комментариям;
  • Онлайн-конфигурация своей фотогалереи (надо быть root’ом);
  • Комментарии к фотографиям (иерархические, с возможностью ответа);
  • Возможность рассылки ответов на комментарии по электронной почте;
  • «Анонимный логин» (через ввод CAPTCHA) — чтобы быть анонимусом (c), нужно подтвердить, что вы не компьютер;
  • Вход по OpenID с автоматической регистрацией локального образа пользователя;
  • Возможность использования различных кодировок имён файлов в различных подкаталогах;
  • Возможность автоматически ставить некоторые теги на все файлы в заданных подкаталогах;
  • Дальнейшие усовершенствования архитектуры кода (в первую очередь Web-приложения).

Реализовано в Vitaphoto 1.2

Версия Vitaphoto 1.2 соответствует 8 марта 2008 года. Исходные коды.

  • Apache 2.x / mod_perl 2.x вместо Apache 1.x / mod_perl 1.x, логгирование через Log4perl;
  • Огромные усовершенствования структуры и архитектуры кода (он внезапно стал вменяемым);
  • Отдельный демон — обновлятор (ScaleDaemon). Обновление фотогалереи, основанное на мониторинге рабочих каталогов и обработке событий;
    • Теперь добавление/обновление/удаление фотографий из базы данных осуществляется отдельным демоном (scaledaemon.pl), и основано на мониторинге файловой системы через Sys::Gamin, ранее доработанный мною; это значит, что теперь система не занимается постоянными проверками в духе «а не изменились ли какие-нибудь файлы?», а точно в нужное время получает события от wikipedia:Gamin'а и действует на их основе;
  • Отказ от древовидной структуры галереи. На каждое фото ставятся теги, альбом — подмножество файлов, имеющих заданный набор тегов. Запрос всех файлов, имеющих заданный тег, по вводу URL вида http://vmx.yourcmc.ru/vitaphoto/tag/природа/;
    • Теперь для каждого файла можно (и нужно) задавать список меток (тегов), а альбом является срезом по заданному набору тегов, или просто содержит все файлы, как сейчас главная страница моей фотогалереи; также можно просматрировать списки файлов, имеющие задаваемый прямо в адресной строке тег (например, http://vmx.yourcmc.ru/vitaphoto/tag/art/);
  • Извлечение всех метаданных (тегов, имени, приоритета отображения, статуса скрыто/видимо) из имени файла;
    • Лично у меня теперь все фотографии имеют имена вроде «02-0935 (портрет, ВМК, Наташа Дышкант) +2 +H.jpg». 02-0935 — не обязательные числа, но для меня очень удобно их писать — это номер фотографии, присвоенный фотоаппаратом. В скобках перечислены метки. +2 — приоритет отображения, а +H означает, что фото скрыто;
  • Хитрая схема хранения фотографий. В двух словах её не опишешь… Если говорить о её преимуществах — то это:
    • отсутствие необходимости в постоянных перенаправлениях 302 Found браузера, обрабатываемых мод_перлом, так как автоматически создаются и поддерживаются символические ссылки на файл, миниатюру и изображение среднего размера по ID в базе;
    • по той же причине отсутствие проблем с запросом файлов с русскоязычными именами;
    • отсутствие необходимости удалять, а потом добавлять файл в базу при переименовании, по причине того, что заливаемые фотографии превращаются в символические ссылки на файл в специальной поддиректории «хранилище» (store);
    • эти символические ссылки относительные, поэтому нет проблем с копированием файлов по FTP (в случае абсолютных проблемы бы были, так как большинство FTP серверов делают chroot после авторизации пользователя);
  • Ссылки на фотографии по именам;
    • Добавлена возможность обращаться к фотографиям, масштабированным изображениям, альбомам по имени, а не только по ID — очень полезно для вставки ссылок на фотографии на внешние страницы. Так, например, я сделал во всех записях своего ЖЖ, в которых были выложены фотографии, дабы впредь больше ссылки менять не пришлось;
  • Каждый альбом также представлен отдельным файлом (текстовым), и также обновляется в базе данных ScaleDaemon-ом;
  • Возможность использования викиобразной (собственной разработки) разметки в описаниях альбомов;
    • Добавлена возможность относительно несложной викиобразной разметки описаний альбомов. Разметка — собственная разработка («велосипед», ага). Как несложно заметить, если в альбоме не будет фотографий, но будет описание — мы получим просто статическую страницу;
  • Страницы ошибок вместо чёрных надписей «401 Unathorized», «403 Forbidden» и т. п. на белом фоне;
    • Теперь вместо сообщений 401 Unauthorized, 403 Forbidden, 404 Not Found, 500 Internal Server Error вы увидите относительно дружелюбные страницы ошибок (например, 404 Not Found выглядит так).
  • Переписана куча кода;
    • Теперь код стал а) вменяемый и б) объектно-ориентированный (фотография — объект, фотоальбом — объект). Это я сделал, когда написал код обновления галереи в том же стиле, в каком был написан мною весь код летом, и понял, что дальше так жить нельзя. Код был укуренный, а теперь отпустило :) превеед, m0r1k! Ты меня почти воспитал;
  • Ведение простой статистики в БД.

Архитектурные отличия старой версии 1.2 от более новых:

  • Была завязка на mod_perl 2.0;
  • Благодаря созданию символических ссылок на файлы, отсутствуют проблемы при запросе файлов с именами в русских кодировках, но зато теряются полные имена файлов при скачивании;
  • Чтобы дать доступ на добавление фотографий кому-либо, не ставя под угрозу собственную безопасность — необходимо завести отдельную учётную запись FTP для подкаталога домашней директории фотогалереи, и положить в него недоступный на запись через FTP файл «dirinfo» с заданием кодировки имён файлов и/или автоматически проставляемых на все фотографии подкаталога тегов;
  • Система рассчитана на любое количество галерей, управляемых одним приложением;
  • В описании альбома можно пользоваться простым wikiобразным синтаксисом для форматирования текста.

Реализовано в Vitaphoto 1.1

Версия Vitaphoto 1.1 соответствует 17 августа 2007 года. Исходные коды.

  • Авторизация (по сути бессмысленная, так как ничего не давала);
  • Чтение EXIF информации из фотографий.

Реализовано в Vitaphoto 1.0

Версия Vitaphoto 1.0 соответствует 19 июля 2007. Исходные коды.

  • Первая версия фотогалереи;
  • Множественные конфигурации (несколько галерей под управлением одного приложения);
  • Автообновление всей галереи каждые N минут при HTTP-запросе;
  • Иерархическая структура галереи (каталог — альбом, файл — фотография);
  • Задание приоритетов, названий фото и каталогов в специальных файлах «Dirinfo».