Допустим, у вас есть >100'000 изображений, которые надо рассортировать и удобно выложить в веб для массового просмотра. Это может быть что угодно — галерея всего созданного человечеством искусства (в задаче которую я делал), или исторический фотоархив города Москвы, или кадры из кинофильмов, или общий архив фотографий с отдыха от крупного турагентства, или веб-сайт стоковых иллюстраций и фотографий, или архив изображений при крупном СМИ за много лет — в котором надо навести порядок, организовать навигацию и доступ сотрудников из внутренней сети.
Я расскажу, как это целесообразно запрограммировать.
Современный подход, используемый всеми фотобанками и галереями — снабжение иллюстраций набором тегов (ключевых слов). Я развил этот подход в двух направлениях: (1) теги могут иметь наследование (пользователь искал ягоды — нашел картину с тегом «черешня»), и (2) теги могут крепиться на уровне не одиночных иллюстраций, а каталогов.
Недостаток такого подхода с тегами — вы осуществляете поиск на основе ключевых слов, игнорируя сюжет картины. Дракон, убитый девушкой, и дракон, убивший девушку — это два разных сюжета, но один и тот же для список слов: Дракон, Девушка, Смерть, и Победитель (если имела место битва). Подход на основе ключевых слов не позволит получить выборку по запросу «Мёртвый дракон», в которую не входило бы изображение дракона — победителя над убитым врагом.
Основные теги — те, что видны пользователю в алфавитном справочнике. Дополнительные теги — те, что доступны пользователю только по вводу им вручную названий этих тегов в тексте поисковой строки. Оптимальным считаю количество тэгов: основных = 1/75, дополнительных = 1/195, от количества изображений.
Множественное число (всадники, горы и т.д.) тегов обозначайте в именах файлов как <имя тега>! (т.е. восклицательный знак). Вам потребуется словарь, как теги могут называться — множественное число, женский/мужской род, слова-синонимы, неверные написания.
Словарь тегов держите в 4х файлах: Marks.csv — основные теги, Other.csv — дополнительные теги, Wrong.csv — неверные написания, синонимы, названия тегов во множественном числе, Artists.csv — авторы. В файлах Marks.csv и Other.csv после идентификатора тегов и основного названия на русском языке, следует перечисление родительских тегов (т.е. наследование).
Marks.csv
Здесь написано, что Арвен — персона, девушка, эльф, персонаж «Властелин колец»; Торин Дубощит — персона, мужчина, носит бороду, персонаж «Властелин колец». Соответственно, при поиске пользователем по запросу «Властелин колец», все изображения Арвен и Торина будут найдены. При поиске «борода» — в числе прочего, будет Торин. При поиске «Торин» — он тоже будет найден, так как это сокращённое написание есть во Wrong.csv.
Если на 100 000 изображений наложить выборку «показать девушек» или «показать солнце», то количество результатов будет чрезмерно велико. Но такого не произойдёт, если изображения будут разбиты на папки. Например, в корневой директории есть папка Драконы, внутри неё папка Жёлтые, внутри неё папка Девушки (т.е. изображения, на которых есть девушки), и внутри неё (по всем подпапкам) 200 изображений. В этом случае, в результаты поиска выйдет не эти 200 изображений, а папка, их содержащая. Это лучше и пользователю.
Здесь, правда, существует проблема близкородственных связей. Практически всегда короли на изображениях имеют короны, но не во всех случаях. Допустим, есть папка Короли, и в ней 3000 изображений, из них 2500 — в коронах. Здесь, в отношении короны — простой подход показать папку не работает.
Оптимальным считаю количество папок = 1/28 от количества изображений
Как вы понимаете, если файл уже лежит в папке Драконы/Желтые/Девушки, то именно эти теги в имя файла добавлять не надо, в имя файла добавляйте только те идентификаторы тегов, которые не следуют из места его хранения.
Внутри каждой папки создан файл _.jpg размером 200 (ширина) * 280 (высота) — это иконка папки при её просмотре (текст выводится поверх неё), как при находжении пользователя в вышестоящей папке, так и при просморте пользователем результатов поиска (если найдена эта папка). Такое же разрешение и у иконок ключевых слов.
Также, во многих папках создан файл _.txt, состоящий из таких строк:
Artefact\_.txt (фрагмент)
Здесь мы видим виды записей:
Сейчас 111'000 изображений занимают на диске 65GB. И это при том, что во многих случаях из них приходится делать более тяжёлый png формат:
index.php — запущенный без параметров, выводит корневую папку галереи, алфавит и поисковую строку. По клику на подпапку в корневой папке — переходит на неё. По клику на букве алфавита — переходит на основные теги, начинающиеся на эту букву. При вводе в поисковую строку текста, переходит на тег, опознанный по этому тексту.
i.php — инструмент просмотра одного выбранного изображения. Позволяет перейти к тегам из списка, которым это изображение соответствует.
img — корневая папка веб-галереи
m — папка со сгенерированными миниатюрами всех изображений. Миниатюры имеют высоту 200, ширина в соответствии с пропорциями изображения. Структура папки m повторяет структуру папки img. Папка m создаётся программно перед выкладыванием каждой версии галереи.
Tags — для каждого ключевого слова, содержит файл с результатом его поиска в каталогах.
Marks — виды файлов:
Специально написанная (используя Delphi и библиотеку Graphics32) программа делает следующее:
Затем, и папка галереи, и эти материалы выкладываются на сервер.
Движок веб-галереи не использует СУБД.
Хостинг я использую Avahost, 100GB на диске стоят 500 рублей в месяц. Как несложно заметить, при размере коллекции 65GB, + миниатюры и прочее, и размере хостинга 100GB, обновление не бывает бесшовным. Не достаточно места чтобы сначала полностью новую версию выгрузить и на неё затем перейти бесшовно, возникает неизбежный интервал неработоспособности сайта длиной в несколько часов. Обновления я сейчас делаю раз в месяц.
Файлы отправляются на хостинг в виде архивов. Использующаяся сейчас на всех хостингах система cPanel умеет распаковывать только архивы zip. Желательно использовать файлы длиной до 2.5GB, иначе после завершения выгрузки файла в папку через веб-интерфейс cPanel, полоска прогресса выгрузки (изначальный цвет — синий) может стать не зелёной, а красной. В чём разница я не понял (файл вроде бы даже в этом случае выгружается нормально), но я в этом случае перевыкладываю. Для некоторых папок это приводит к тому, что папки приходится делить на несколько отдельных архивов zip.
Ранее я пытался создать хостинг дома, купил на авито б/у нетбук за 2000 рублей. Настроил, всё работает. Проходит пара суток — не работает. Перезагружаю — без толку. Потом, опять заработало, потом опять нет. Сменил нетбук (купил другой, более мощный, тоже на Авито, за 3000 рублей) и стал использовать другой софт — то же самое. Сменил трёх провайдеров (Севен скай > Акадо > МГТС) — то же самое. Короче, оборудование стоящее у провайдеров обрубает видимо домашний хостинг, причём сами провайдеры об этом и не знают. Или какие другие причины. Идите к хостерам, не делайте дома хостинга. Инди хостинг отстой. Даже примитивный маршрутизатор для взаимодействия сетевых игр лучше сваять на php и положить на хостинг чем держать дома или в офисе, и ждать что сломается без разумных причин.
Кроме техно-характеристик (из которых действительно нужно только одна — количество гигабайт, всё остальное — числа у всех по своей шкале, я пришёл к тому что характеристики лучше у авахост), есть такой параметр — абуз-устойчивость. «abuse» — жалоба. Причём причина для жалобы может возникнуть на ровном месте, например у студии Артемия Лебедева. Поэтому нормальный хостинг имеет параметр абузоустойчивость, устойчивость к жалобам. (Не путать со специальными хостингами, где можно размещать вообще что угодно, хоть фишинг страницу сбербанка с приглашением войти в личный кабинет — это отдельные конторы, я них не разбираюсь).
Допустим, что вы — крупное СМИ, и решили значительную часть имеющих у вас (накопленных за десятки лет) фотографий сделать публичными. Например, используя описанную выше технологию. Как можно с этого зарабатывать (кроме брендирования наложением вотемарков на фотографии, а также их продажи)? Ну, если вы СМИ то вы знаете, расскажу для остальных.
Большинство схем монетизации даёт вам по 10 копеек со среднего посетителя сайта в день (включая как посетивших сайт один раз, так и посетивших несколько раз в день). Аналогично даёт автору сайта и РСЯ (рекламная сеть Яндекса). Чтобы зарабатывать больше, нужно вовлекать людей в религиозные секты или продавать чудо-талисманы, я такого не делаю. Агрегаторы подобных реклам легко найти в сети, они платят за достижение результатов (человек купил пылесос Кирби или стал членом секты). Причём, что обидно: я этого не делаю, зато Яндекс то и дело гонит через мой сайт подобное. В итоге людям всё равно подчас продают туфту задорого (через Яндекс), только я с этого получаю в 6 — 10 раз меньше.
У многих моих знакомых людей по умолчанию стоит адблок или что-то подобное и реклама Яндекса не видна. Причём сами они этого не ставили. Почему так — не знаю.
Яндекс позволяет вывести сумму по достижении 3000 рублей.
Также, владелец сайта может зарегистрироваться в miralinks.ru и размещать статьи. Адрес статьи и ссылки на неё надо размещать вечно, т.е. предусмотрите заранее чтобы их размещение не было слишком токсично. Допустимо, чтобы новые статьи вытесняли прежние в следующие страницы истории.
Можно продавать размещение баннеров, и иное сообразно смыслу ресурса.
Я делаю сайт corchaosis.ru — некий аналог вики для графики.
Почему пока не получилось его раскрутить (как я думаю):
— Людям нужно только средство совершения достижений.
Если даже люди идут в картинную галерею смотреть картины, им всё равно важно материальное достижение. Я посетил Третьяковскую галерею. Я посмотрел «Лебединое озеро».
Если веб-ресурс не приближает человека к материальным достижениям, то на него не заходят.
Сами люди могут думать другое, что им нравятся картины. Это не важно. Если мы что-то делаем в отношении людей, мы должны быть «сложнее» людей. Понимать и осознавать больше. Если лиса ест кур и мышей, то лиса должна быть и совершеннее, чем курицы. Из уровня представлений курицы, нельзя достичь результатов лисы.
— Людям нужно интерактивное.
ВЕБ 1.0 мертв.
Если вы не можете предложить интерактивности, то вы никому не нужны.
Вас не смотрят. Это снова о достижении результатов. Кобвой не идёт в джунгли ради туризма, он идёт в джунгли, чтобы основать собственное ранчо. Пока у сайта нет инструментов чтобы создать своё ранчо (портфолио и т.д.), джунгли ковбоям неинтересны.
В принципе я описал всё необходимое, чтобы его сделать. Можно написать мне.
Локальный exe файл написан на Delphi+Graphics32, серверная часть это два файла .php.
Я расскажу, как это целесообразно запрограммировать.
Ключевые слова и их наследование
Современный подход, используемый всеми фотобанками и галереями — снабжение иллюстраций набором тегов (ключевых слов). Я развил этот подход в двух направлениях: (1) теги могут иметь наследование (пользователь искал ягоды — нашел картину с тегом «черешня»), и (2) теги могут крепиться на уровне не одиночных иллюстраций, а каталогов.
Недостаток такого подхода с тегами — вы осуществляете поиск на основе ключевых слов, игнорируя сюжет картины. Дракон, убитый девушкой, и дракон, убивший девушку — это два разных сюжета, но один и тот же для список слов: Дракон, Девушка, Смерть, и Победитель (если имела место битва). Подход на основе ключевых слов не позволит получить выборку по запросу «Мёртвый дракон», в которую не входило бы изображение дракона — победителя над убитым врагом.
Основные теги — те, что видны пользователю в алфавитном справочнике. Дополнительные теги — те, что доступны пользователю только по вводу им вручную названий этих тегов в тексте поисковой строки. Оптимальным считаю количество тэгов: основных = 1/75, дополнительных = 1/195, от количества изображений.
Множественное число (всадники, горы и т.д.) тегов обозначайте в именах файлов как <имя тега>! (т.е. восклицательный знак). Вам потребуется словарь, как теги могут называться — множественное число, женский/мужской род, слова-синонимы, неверные написания.
Словарь тегов держите в 4х файлах: Marks.csv — основные теги, Other.csv — дополнительные теги, Wrong.csv — неверные написания, синонимы, названия тегов во множественном числе, Artists.csv — авторы. В файлах Marks.csv и Other.csv после идентификатора тегов и основного названия на русском языке, следует перечисление родительских тегов (т.е. наследование).
Marks.csv
Arwen;Арвен (Властелин Колец);Person,Girl,Elf,LordOfTheRings
ThorinOakenshield;Торин Дубощит;Person,Male,Beard,LordOfTheRings
Здесь написано, что Арвен — персона, девушка, эльф, персонаж «Властелин колец»; Торин Дубощит — персона, мужчина, носит бороду, персонаж «Властелин колец». Соответственно, при поиске пользователем по запросу «Властелин колец», все изображения Арвен и Торина будут найдены. При поиске «борода» — в числе прочего, будет Торин. При поиске «Торин» — он тоже будет найден, так как это сокращённое написание есть во Wrong.csv.
Структура папок
Если на 100 000 изображений наложить выборку «показать девушек» или «показать солнце», то количество результатов будет чрезмерно велико. Но такого не произойдёт, если изображения будут разбиты на папки. Например, в корневой директории есть папка Драконы, внутри неё папка Жёлтые, внутри неё папка Девушки (т.е. изображения, на которых есть девушки), и внутри неё (по всем подпапкам) 200 изображений. В этом случае, в результаты поиска выйдет не эти 200 изображений, а папка, их содержащая. Это лучше и пользователю.
Здесь, правда, существует проблема близкородственных связей. Практически всегда короли на изображениях имеют короны, но не во всех случаях. Допустим, есть папка Короли, и в ней 3000 изображений, из них 2500 — в коронах. Здесь, в отношении короны — простой подход показать папку не работает.
Оптимальным считаю количество папок = 1/28 от количества изображений
Как вы понимаете, если файл уже лежит в папке Драконы/Желтые/Девушки, то именно эти теги в имя файла добавлять не надо, в имя файла добавляйте только те идентификаторы тегов, которые не следуют из места его хранения.
Мультиязычность, иконки, тексты, виртуальные подпапки
Внутри каждой папки создан файл _.jpg размером 200 (ширина) * 280 (высота) — это иконка папки при её просмотре (текст выводится поверх неё), как при находжении пользователя в вышестоящей папке, так и при просморте пользователем результатов поиска (если найдена эта папка). Такое же разрешение и у иконок ключевых слов.
Также, во многих папках создан файл _.txt, состоящий из таких строк:
Artefact\_.txt (фрагмент)
Миелофон=Mielofon
Мьёльнир=Mjolnir
Палантир=Palantir
Перчатка Таноса=ThanosGlove
Склянки=Glass-Potion
by-DavisonCarvalho=*
TheWitcher/Wolf-Head-Logo|Амулет Ведьмака
DisneyPrincess/Moana/HeartOfTeFiti|Сердце Те Фити
SuperHeroes/Hellraiser/HellraiserBox|Шкатулка Лемаршана
-m|Artefact
Здесь мы видим виды записей:
- Склянки=Glass-Potion — псевдонимы для подпапок. На иллюстрации, приведённой выше, видим что для папки Japan псевдоним не был записан, и при просмотре папки она без перевода на русский. Два тега — Glass и Potion (Стекло и Зелье) — переведены одним словом.
- by-DavisonCarvalho=* — псевдоним не требуется
- SuperHeroes/Hellraiser/HellraiserBox|Шкатулка Лемаршана — виртуальная подпапка. Находящаяся в другом каталоге подпапка, также, будет отображаться здесь, под заданным именем.
- -m|Artefact — папка олицетворяет тег «Артефакт». Если к этому тегу привязан текст, он будет написан под иллюстрациями.
Размер на диске
Сейчас 111'000 изображений занимают на диске 65GB. И это при том, что во многих случаях из них приходится делать более тяжёлый png формат:
- Если изображение с полями (и никакой штрих или предмет изображения не заходит на них), поля надо убрать в paint-е.
- Если изображение с чужими вотермарками фотогалерей а-ля пикабу, вотермарки убираются в фотошопе.
- Если оно в формате .webp, приходится просто пересохранять в .png, иначе моя программа не сможет сделать миниатюры (да, я знаю, можно было дописать код).
- Если формат не .png, .jpg, .gif. Я против излишнего разнообразия форматов.
Структура сайта — файлы и папки
index.php — запущенный без параметров, выводит корневую папку галереи, алфавит и поисковую строку. По клику на подпапку в корневой папке — переходит на неё. По клику на букве алфавита — переходит на основные теги, начинающиеся на эту букву. При вводе в поисковую строку текста, переходит на тег, опознанный по этому тексту.
i.php — инструмент просмотра одного выбранного изображения. Позволяет перейти к тегам из списка, которым это изображение соответствует.
img — корневая папка веб-галереи
m — папка со сгенерированными миниатюрами всех изображений. Миниатюры имеют высоту 200, ширина в соответствии с пропорциями изображения. Структура папки m повторяет структуру папки img. Папка m создаётся программно перед выкладыванием каждой версии галереи.
Tags — для каждого ключевого слова, содержит файл с результатом его поиска в каталогах.
Marks — виды файлов:
- Для каждого ключевого слова, содержит файл его миниатюры
- Для большинства ключевых слов, содержит файл с их текстовым описанием или тематическую историю, анекдот
- Для некоторых ключевых слов, содержит один или несколько html-текстовых тематических рассказов
- Также, в этой папке хранятся файлы типа <код буквы>.txt — упорядоченные по алфавиту списки ключевых слов по каждой букве русского алфавита
Порядок выгрузки новой версии галереи на сайт
Специально написанная (используя Delphi и библиотеку Graphics32) программа делает следующее:
- Проверка папки галереи — проверяется отсутствие лишних символов, правильность и отсутствие избыточности в тегах файлов (в т.ч. с учётом их иерархии), отсутствие среди имён файлов синонимов и ошибочных написаний ключевых слов (используя Wrong.csv), корректность файлов _.txt, наличие миниатюр для папок, отсутствие файлов с неверными именами.
- Пересоздание миниатюр для всех изображений. На этом этапе часто выясняется, что некоторые файлы имеют неверное расширение: .jpg вместо .png и т.д.
- Генерация результатов поиска по каждому ключевому слову. Проверка наличия миниатюр для основных ключевых слов. Особый порядок для ключевых слов — исключений, по которым надо выдавать специально прописанную подборку.
- Генерация списков ключевых слов для букв русского алфавита.
Затем, и папка галереи, и эти материалы выкладываются на сервер.
Движок веб-галереи не использует СУБД.
Хостинг
Хостинг я использую Avahost, 100GB на диске стоят 500 рублей в месяц. Как несложно заметить, при размере коллекции 65GB, + миниатюры и прочее, и размере хостинга 100GB, обновление не бывает бесшовным. Не достаточно места чтобы сначала полностью новую версию выгрузить и на неё затем перейти бесшовно, возникает неизбежный интервал неработоспособности сайта длиной в несколько часов. Обновления я сейчас делаю раз в месяц.
Файлы отправляются на хостинг в виде архивов. Использующаяся сейчас на всех хостингах система cPanel умеет распаковывать только архивы zip. Желательно использовать файлы длиной до 2.5GB, иначе после завершения выгрузки файла в папку через веб-интерфейс cPanel, полоска прогресса выгрузки (изначальный цвет — синий) может стать не зелёной, а красной. В чём разница я не понял (файл вроде бы даже в этом случае выгружается нормально), но я в этом случае перевыкладываю. Для некоторых папок это приводит к тому, что папки приходится делить на несколько отдельных архивов zip.
Ранее я пытался создать хостинг дома, купил на авито б/у нетбук за 2000 рублей. Настроил, всё работает. Проходит пара суток — не работает. Перезагружаю — без толку. Потом, опять заработало, потом опять нет. Сменил нетбук (купил другой, более мощный, тоже на Авито, за 3000 рублей) и стал использовать другой софт — то же самое. Сменил трёх провайдеров (Севен скай > Акадо > МГТС) — то же самое. Короче, оборудование стоящее у провайдеров обрубает видимо домашний хостинг, причём сами провайдеры об этом и не знают. Или какие другие причины. Идите к хостерам, не делайте дома хостинга. Инди хостинг отстой. Даже примитивный маршрутизатор для взаимодействия сетевых игр лучше сваять на php и положить на хостинг чем держать дома или в офисе, и ждать что сломается без разумных причин.
Хозяйке на заметку (про хостинг)
Кроме техно-характеристик (из которых действительно нужно только одна — количество гигабайт, всё остальное — числа у всех по своей шкале, я пришёл к тому что характеристики лучше у авахост), есть такой параметр — абуз-устойчивость. «abuse» — жалоба. Причём причина для жалобы может возникнуть на ровном месте, например у студии Артемия Лебедева. Поэтому нормальный хостинг имеет параметр абузоустойчивость, устойчивость к жалобам. (Не путать со специальными хостингами, где можно размещать вообще что угодно, хоть фишинг страницу сбербанка с приглашением войти в личный кабинет — это отдельные конторы, я них не разбираюсь).
Монетизация
Допустим, что вы — крупное СМИ, и решили значительную часть имеющих у вас (накопленных за десятки лет) фотографий сделать публичными. Например, используя описанную выше технологию. Как можно с этого зарабатывать (кроме брендирования наложением вотемарков на фотографии, а также их продажи)? Ну, если вы СМИ то вы знаете, расскажу для остальных.
Большинство схем монетизации даёт вам по 10 копеек со среднего посетителя сайта в день (включая как посетивших сайт один раз, так и посетивших несколько раз в день). Аналогично даёт автору сайта и РСЯ (рекламная сеть Яндекса). Чтобы зарабатывать больше, нужно вовлекать людей в религиозные секты или продавать чудо-талисманы, я такого не делаю. Агрегаторы подобных реклам легко найти в сети, они платят за достижение результатов (человек купил пылесос Кирби или стал членом секты). Причём, что обидно: я этого не делаю, зато Яндекс то и дело гонит через мой сайт подобное. В итоге людям всё равно подчас продают туфту задорого (через Яндекс), только я с этого получаю в 6 — 10 раз меньше.
У многих моих знакомых людей по умолчанию стоит адблок или что-то подобное и реклама Яндекса не видна. Причём сами они этого не ставили. Почему так — не знаю.
Яндекс позволяет вывести сумму по достижении 3000 рублей.
Также, владелец сайта может зарегистрироваться в miralinks.ru и размещать статьи. Адрес статьи и ссылки на неё надо размещать вечно, т.е. предусмотрите заранее чтобы их размещение не было слишком токсично. Допустимо, чтобы новые статьи вытесняли прежние в следующие страницы истории.
Можно продавать размещение баннеров, и иное сообразно смыслу ресурса.
Где можно увидеть данную технологию в действии (какой проект я делаю)?
Я делаю сайт corchaosis.ru — некий аналог вики для графики.
Почему пока не получилось его раскрутить (как я думаю):
— Людям нужно только средство совершения достижений.
Если даже люди идут в картинную галерею смотреть картины, им всё равно важно материальное достижение. Я посетил Третьяковскую галерею. Я посмотрел «Лебединое озеро».
Если веб-ресурс не приближает человека к материальным достижениям, то на него не заходят.
Сами люди могут думать другое, что им нравятся картины. Это не важно. Если мы что-то делаем в отношении людей, мы должны быть «сложнее» людей. Понимать и осознавать больше. Если лиса ест кур и мышей, то лиса должна быть и совершеннее, чем курицы. Из уровня представлений курицы, нельзя достичь результатов лисы.
— Людям нужно интерактивное.
ВЕБ 1.0 мертв.
Если вы не можете предложить интерактивности, то вы никому не нужны.
Вас не смотрят. Это снова о достижении результатов. Кобвой не идёт в джунгли ради туризма, он идёт в джунгли, чтобы основать собственное ранчо. Пока у сайта нет инструментов чтобы создать своё ранчо (портфолио и т.д.), джунгли ковбоям неинтересны.
Где взять готовый движок
В принципе я описал всё необходимое, чтобы его сделать. Можно написать мне.
Локальный exe файл написан на Delphi+Graphics32, серверная часть это два файла .php.