Подписаться на блог
В Твиттере

Реплики и ссылки на заметки

В Фейсбуке

Ссылки на заметки

Вконтакте

Ссылки на заметки

В Телеграме

Ссылки на заметки

В Тумблере

Заметки целиком

В Же-же

Заметки целиком

По РСС

Заметки целиком

Если что-то из этого не работает, напишите мне: ilyabirman@ilyabirman.ru.

Эгея

Эгея — движок блога, на котором работает этот сайт.

Избранные заметки про движок:

Простая установка Эгеи на ДО, Линод и всё такое

Это гостевая заметка. Иван Немытченко написал, как по-простому установить Эгею на собственный виртуальный сервер. Слово Ивану:

«

Многие программисты интересуются дизайном. Я из таких. Лет 10 назад я каждый день читал Лебедева и вообще следил за тем что происходит в дизайне. Я даже купил себе ваком и пару лебедевских розеткусов. Плавно увлечение сошло на нет, но любовь к дизайнерским штукам осталась.

Каждый раз когда Эгея попадалась мне на глаза, я её скачивал, а потом вспоминал что её нужно же как-то куда-то установить, и откладывал в долгий ящик. Если ты программируешь не на ПХП, все эти „залить на хостинг за одну минуту“ становятся от тебя бесконечно далеки.

Выбрать хостера, разбираться как туда чего заливать, осаждать техподдержку когда всё ляжет — бррр! При этом ты знаешь что за те же деньги можешь арендовать мелкий виртуальный сервер, и иметь полный контроль над тем что там происходит. А программисты любят контроль.

Недавно я в очередной раз скачал Эгею и поймал себя на том что у меня на диске уже пять копий её дистрибутива. К счастью, у меня была пара свободных дней, и я решил закрыть этот гештальт с Эгеей, наконец. Конечно же, программистским способом.

Программистский способ

Программистский способ — это:

  • арендовать виртуальный сервер с линуксом (Digital Ocean, Linode, Scaleway);
  • поставить туда нужные версии Апача, ПХП и MySQL;
  • все правильно сконфигурировать;
  • и залить туда Эгею.

С этим способом есть проблема: если один раз ты это руками всё проделаешь, это не гарантирует тебе того, что когда тебе понадобится это делать во второй раз, ты чего-нибудь не забудешь.

Можно конечно написать себе инструкцию на будущее. Можно баш-cкрипт. Но есть способ получше: записать инструкции в Ansible playbook.

Кстати, если у вас Эгея уже установлена на обычном хостинге, и вам это нигде не жмет, то вам скорее всего этот способ ни к чему.

Ансибл

Главная фишка Ансибла — отсутствие ручных действий при установке и повторяемость результата. Плейбук — это список инструкций, записанных с помощью специального синтаксиса.

Чтобы составить плейбук, приходится пройти один раз весь путь вручную. Зато после того как инструкции готовы, всё действительно устанавливается за минуту.

Отличие от баш-скриптов в том, что Ансибл до определенной степени гарантирует идемпотентность — т. е. при повторном прогоне скрипта он, например, не будет пытаться создавать папку, если она уже создана, или устанавливать установленный пакет.

Ансибл написан на Питоне, поэтому запускается на любых операционных системах. Я запускал плейбук Эгеи со своего макбука. Все команды Ансибл будет запускать на удалённом сервере по SSH, так что здоровьем своего компьютера вы не рискуете.

Установка Эгеи с помощью Ансибла

Для начала установите Ансибл. На Маке так это делается в две команды:
sudo easy_install pip
sudo pip install ansible

Команда easy_install в Макосе идет в комплекте с предустановленным Питоном, так что пугаться её не стоит. Инструкции для других операционок подсматривайте на сайте Ансибла.

Дальше:

  1. Скачайте плейбук с репозитория.
  2. Поменяйте значения переменных в секции vars в setup.yml или хотя бы посмотреть на самые важные из них — они понадобятся при первом запуске Эгеи:
    db_name: e2
    db_user: e2
    db_password: secret
  3. Запустите плейбук, указав после ключа „-i“ адрес сервера с запятой на конце:
    ansible-playbook -i ’yourdomain.com,’ setup.yml

Должно произойти примерно такое:

После успешного выполнения скрипта можно заходить по прописанному адресу в браузер и пользоваться Эгеей.

Выводы

Это может выглядеть как оверкилл для внешнего наблюдателя, но в этом и есть суть программистского подхода: „лучше день потерять, потом за пять минут долететь“. И во все следующие разы, когда снова понадобится, снова долетать за пять минут.

Если вы, как и я забыли, как устанавливать софт на ПХП на обычный хостинг, то надеюсь что мой плейбук вам поможет, наконец, попробовать Эгею. Ну и если вам нужно будет что-то похожее автоматизировать, теперь вы знаете, куда копать.

P. S. Привет программистам в этом блоге ;-) Читайте мой свежеподнятый блог, в твиттере я @inem. Если интересно почитать ещё что-нибудь программистское, подписывайтесь на мой бесплатный курс для новичков.

»

25 марта   гостевая заметка   Эгея

Эгея v3082

С выхода беты Эгеи 2.6 исправили несколько багов в поиске и автосохранении. Автосохранение больше не должно случайно делать две копии новых заметок.

Ещё если у вас открылась локальная копия, отличная от серверной, а вы хотите отменить локальные изменения и смотреть на серверную версию, теперь можно нажать ⌘Z (анду).

Ссылка: e2_distr_v3082.zip.

17 марта   продукты   релиз   Эгея

Эгея 2.6 бета

Готова новая Эгея 2.6 бета (сборка v3074). Не обновляйтесь на живых сайтах, если только вы не суперпродвинутый технарь, обложившийся бекапами со всех сторон. Не забывайте, что бета — это очень страшно.

В конце заметки — ссылка на дистрибутив. А пока расскажу вам, что нового.

Локальное автосохранение заметок

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

Как вы помните, я долго думал, как сделать автосохранение в редакторе. Речь идёт о локальном автосохранении: чтобы правки в заметке не потерялись, если при сохранении на сервер вдруг пропал интернет или упал браузер. Теперь такая фича есть.

Если вы редактируете заметку, и ещё не сохранили правки на сервер, вы видите слева ⌘ S и красный кружок:

Эгея 2.6 бета

Это просто признак того, что есть несохранённые изменения. Если закрыть эту страницу, а потом открыть заново, то она откроется ровно в таком же состоянии: с тем же текстом, с той же красной точкой, означающей, что данные не сохранены, и с курсором, мигающим в том же месте.

Но если на сервере есть более новая версия этой заметки, значит вы уже редактировали заметку с другого компьютера после этого. Тогда откроется более новая версия с сервера — без красной точки.

У любой несохранённой на сервер заметки возле карандашика будет гореть такая же красная точка:

Эгея 2.6 бета

Кроме того, если в браузере есть несохранённые на сервер заметки, то красная точка загорится и возле иконки черновиков:

Эгея 2.6 бета

Если зайти в черновики, там отдельно будут ссылки на все несохранённые правки в заметках:

Эгея 2.6 бета

Если есть несохранённые правки в черновиках, то красные точки появятся около них.

Если вы нажали на плюс, начали писать заметку, и вообще ни разу не сохранили её на сервер, красная точка будет висеть около плюса:

Эгея 2.6 бета

По клику откроется форма новой заметки с тем, что вы успели написать и красной точкой около ⌘ S слева — как если бы вы её не закрывали.

Локальное автосохранение работает только для заметок и черновиков. Его нет у тегов и комментариев.

Эта функция требует тестирования. Если вы будете ставить бету, уделите ей внимание, пожалуйста, и расскажите обо всех проблемах.

Автосохранение запрограммировал Игорь Адаменко — он же ранее помогал мне с новой версией моего сайта. Игорь крутой.

Новый поиск

Я уже упоминал новый поиск в этом блоге. Конечно же, это новый поиск Эгеи.

Во-первых, он научился склонять слова. Во-вторых, выдача стала намного удобнее: вместо простыни заметок она показывает небольшие «сниппеты», содержащие найденный фрагмент текста и все картинки из заметки. Узнать нужную заметку по картинкам — самый кайф:

Эгея 2.6 бета

Избранные заметки имеют больше веса при поиске.

Поиск работает на «Розе» — встраиваемом поисковом движке Романа Парпалака, о котором мы с ним ещё напишем отдельно.

Если у вас много заметок, Эгее понадобится несколько минут после обновления, чтобы сначала всё проиндексировать. Результаты поиска в это время будут показываться по старой технологии. Вам ничего не нужно делать, Эгея управляет индексацией сама.

Это ж вам не Вордпресс какой-нибудь дебильный, где даже чтобы кеш работал вменяемо надо отдельный плагин ставить. Платный! Я чуть не охренел когда узнал. Но я отвлёкся.

Картинки и обложки в редакторе

Эгея с прошлой версии отдаёт картинки в качестве «обложек» при отправке ссылок в соцсети. Но теперь она умеет отдавать так и стоп-кадры видеороликов с Ютюба и Вимео. Ну и заодно у заметок с видеороликами появился шаринг в Пинтерес.

Кстати, эти стоп-кадры попадают и в выдачу поиска наравне с другими картинками, что тоже упрощает нахождение глазами нужной заметки.

При загрузке файлов колечко теперь не просто крутится, а заполняется, показывая прогресс. Удобно, если вы загружаете кучу больших фоток или 15-мегабайтную песню.

Раньше Эгея считала, что картинка используется в заметке, только если её упоминание было в тексте заметки. А если удалить упоминание из текста, то картинка «терялась» и из превьюшек снизу. Теперь это независимые вещи: заметка помнит загруженные в неё картинки, даже если они не используются в тексте.

Это даёт несколько приятностей:

  1. Обложкой для соцсети может быть картинка, которая не используется в самой заметке. Просто загрузите картинку в заметку, но не вставляйте её название в текст. Для этого перетащите её на страницу заметки, но за пределы текстового поля (раньше можно было перетащить только в текстовое поле).
  2. Если вы перетаскивали картинку, но файл с таким именем уже был на сервере, Эгея переименовывала его, добавляя в конец число. В прошлой версии добавилось перетаскивание с зажатым Альтом — в этом случае старая картинка заменялась новой. Теперь работает чуть умнее: если на сервере файл есть, но это тот же самый файл, то она просто добавляет его в ту заметку, куда вы его перетаскиваете, не делая бессмысленную копию на сервере.
  3. Когда вы удаляете картинку из превьюшек в редакторе, раньше Эгея просто удаляла файл на сервере. Теперь так делать нельзя, ведь «официально» поддерживается использование одного файла в нескольких заметках. Эгея смотрит, не используется ли файл где-то ещё, и удаляет его только, если он больше нигде не нужен.
  4. Наконец, Эгея не «потеряет» картинку просто из-за того, что вы убрали её имя текста заметки.

Ещё теперь можно загружать картинки в СВГ.

Всё, что я написал про картинки, верно и для аудиофайлов. Но аудиофайл или СВГ не могут быть обложками для соцсетей.

С прошлой версии Эгея «растягивает» текстовые поля по высоте так, чтобы в них влезал весь текст. Это позволило избавиться от двойной прокрутки (когда текстовое поле прокручивается внутри прокручиваемой страницы). Но из-за этого стало не видно лейбл поля, рядом с которым как раз показан статус сохраненности. Поэтому теперь это всё залипает при прокрутке:

Эгея 2.6 бета

И на мобиле:

Эгея 2.6 бета

Кнопка удаления переехала из подвала формы редактирования заметки в правый верхний угол (видно на первом скриншоте выше).

Теперь стандартное форматирование Эгеи поддерживается внутри тегов div, table и blockquote. Если вы хотите поставить текст на плашку или разбить на колонки, можете это сделать, а внутри продолжать использовать привычный синтаксис.

Автомиграция при подключении к старой базе

Когда вы обновляли Эгею, она меняла структуру базы данных для совместимости с новой версией — так было всегда.

Но раньше движок конвертировал базу только при обновлении, а вообще исходил из того, что база в актуальном формате. Поэтому если вы просто подключали его к существующей базе, а она была в старом формате, возникали ошибки.

Теперь движок наоборот исходит из того, что данные в базе могут быть в любом формате, начиная с формата Эгеи 2.0. Если вы устанавливаете движок начисто, а не обновляетесь, но при этом говорите, что данные в базе уже есть, или просто подключаетесь к другой базе в настройке, движок сконвертирует базу в актуальный формат.

Остальное

Исправлена куча багов. Но этим никого не удивишь.

При редактировании описания тега теперь тоже можно загружать файлы. Короче, описание тега теперь может выглядеть как полноценная заметка, у него тоже работают всякие обложки. Редактор тега открывается по Alt+E на странице тега, как у заметки. А сохранение изменений в описании тега заработало в сто раз быстрее.

Для залогиненного автора быстрее открываются заметки с кучей комментариев.

Изменилась логика включения комментариев. Раньше был глобальный флаг «разрешить комментарии», но можно было выключить индивидуально у отдельных заметок. Теперь глобального флага нет, комментарии настраиваются у заметок по отдельности. А глобально настраивается, врубать ли комментарии заметкам во время публикации по умолчанию или нет.

Основной кегль текста в комплектной теме увеличен с 15 до 16 пунктов. Знаки валют прикрепляются к суммам неразрывным пробелом. Форма логина заадаптивилась (в 2.5 недоглядели).

На странице удаления заметки появилась кнопка «Вернуть в черновики». На страницах архива, где показывают заметки списком ссылок, избранные заметки помечаются звёздочками. Добавилась поддержка шаринга в Линкед-ин (потому что обновился Лайкли).

Для платных пользователей появились несколько мелочей, о которых я расскажу отдельно.

Технические детали

Движок лучше распознаёт, что работает по ХТТПС, и отдаёт по этому же протоколу всякие скрипты и картинки.

Добавилась поддержка Апача 2.4, у которого с какого-то бодуна изменился на полностью нечитаемый синтаксис некоторых опций конфигурации. Движок должен работать под ПХП 7.0 и 7.1 — я теперь тестирую локально под семёркой. А на моём сайте, наоборот, крутится ПХП 5.3 — это теперь низшая из поддерживаемых версий.

Все скрипты теперь минифицируются.

Файл, в котором хранятся параметры настройки теперь называется не settings.psa, а settings.json. Если вдруг захочется вручную что-то отредактировать, теперь это удобнее.

Как попробовать и что тестировать

Ещё раз скажу, что не рекомендую пока обновляться на живых сайтах. Как обновиться:

  1. Отредактировать и сохранить любую заметку (на всякий случай, это гарантирует, что сделается актуальный бекап базы).
  2. Забекапить всю папку на сервере, включая бекапы базы данных, которые лежат в /user/backups/.
  3. Заменить файл .htaccess в корне, папку /system/ и все подпапки в /themes/ (то есть убрать старые, положить новые, а не дозалить в старые новые файлы).

Если вы делали свою тему оформления, посмотрите, что изменилось в комплектной, и аккуратно повторите эти изменения у себя.

Что тестировать:

  • миграцию (если у вас есть старая база, попробуйте не обновляться, а поставить новый движок начисто, указав ему на неё);
  • автосохранение в разных комбинациях с несколькими устройствами (особенно интересно, если на каком-нибудь из них ещё часы неправильно идут);
  • загрузку и удаление файлов (загрузить одинаковые файлы в разные заметках; убедиться, что лишних копий не создаётся; удалить файл из какой-нибудь из заметок; убедиться, что он не удаляется с сервера, пока остались заметки, где он используется);
  • поиск;
  • работу под ПХП 7.

Ссылка: e2_distr_v3082.zip

Пишите, чё как.

3 марта   продукты   релиз   Эгея

О названии «Эгеи»

Вообще мой движок блога называется e2. Но однажды я решил называть версии кодовыми названиями. Версия 1.2 была «Орандой», 1.3 была «Селектой», а 2.0 стала «Эгеей». Версия 2.1 имела все шансы стать «Анандой», и из этой заметки вы узнаете о том, почему этого не случилось. Не переключайтесь.

Оранда — это такая золотая рыбка, Селекта — некий синоним диджея, Эгея — регион у Эгейского моря, а Ананда — это «блаженство» на санскрите. С какого хрена эти никак не связанные друг с другом слова стали названиями версий движка?

Дело в пситрансе. Я придумал, что надо использовать названия клевых пситрансовых треков. Оранда и Селекта придумались легко:

Легко придумались сразу и ещё три названия, включая «Ананду» (остальные не скажу):

Но версию 2.0 я решил назвать в честь вот этого трека:

Как видите, красивая система сломалась уже на третьем релизе, ведь Эгея — не полное название этого трека. Но я думал, что в будущих релизах это исправлю, тем более, что к тому времени у меня уже дюжина таких названий были заготовлены наперёд.

Однако в отличие от предыдущих названий, название «Эгея» вдруг стали все использовать.

Тут стоит заметить, что e2 — изысканно тупое название. Оно означает engine 2, потому что это второй мой движок блога (не спрашивайте). Поэтому я не сильно сопротивлялся тому, что про e2 все забыли и стали называть движок вообще, а не его конкретную версию, «Эгеей». И когда вышла 2.1, я не стал менять название, решив отложить переименование до версии 3.0.

При этом с названием Эгея тоже есть проблемы. К шуткам про геев я равнодушен, но меня смущает, что люди склоняют слово с трудом и не понимают, как писать латиницей. И произнести слово aegea как «и́джиа» тоже большинству людей слабо. Но уже вышли версии до 2.5, и все они называются Эгеями. Так что сейчас вообще непонятно, что с этим делать, и куда мне засунуть мою дюжину других клёвых названий.

И тот факт, что сайт называется blogengine.ru, совсем не помогает преодолеть неразбериху.

Новый сайт Эгеи

Запустили с Ильёй Страйковым новый сайт Эгеи:

Предыдущий сайт был сделан сто лет назад, и даже по тогдашний меркам был ну так. А последние годы вообще было непонятно, что это за хрень там такая висела. Хотелось всё взорвать, но находились дела поважнее.

Теперь вот нормальный сайт, где нормально объяснено, что за Эгея, и почему она клёвая. Отдельное спасибо Максиму Ильяхову.

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

Сделать автосохранение в Эгее

Я хочу сделать во всех формах Эгеи автосохранение. Ниже — мои рассуждения на этот счёт. А в конце я позову вас на помощь.

Сейчас в редакторе заметок можно нажать ⌘S в любой момент, и изменения сохранятся на сервере без перезагрузки страницы. Это удобно, но иногда люди, особенно после Гугль-дока, забывают это сделать. Если что-нибудь сломается, текст пропадёт.

Нетрудно сделать автоматическое сохранение раз в несколько секунд. Но такое нельзя делать с опубликованными заметками, ведь изменения будут сразу видны всем, включая промежуточные состояния по ходу внесения правок. Можно, конечно, поддерживать это только в черновиках, но это криво и модально. Хочется, чтобы как-нибудь работало везде.

Для опубликованных заметок можно предусмотреть в базе на сервере поле «неопубликованная версия текста», чтобы все такие вот автосохранённые изменения писались туда, а не в настоящее поле, а публиковались только когда человек руками жмёт кнопку «Сохранить». Но, во-первых, тогда такие дублирующие поля придётся заводить на всё — заголовок, теги, урл. Неэлегантно. Во-вторых, это вызывает вопрос о том, какую версию заметки открывать в редакторе: настоящую или вот такую промежуточную. Если человек забыл о том, что начинал редактировать заметку, и открыл её спустя месяц, а в редакторе показывают не то, что опубликовано, это взорвёт мозг.

Конечно, можно напридумывать интерфейса, чтобы это разрулить: показывать где-то, что открыта несохранённая версия, дать возможность сравнить с сохранённой, откатить изменения... Но это всё какая-то жесть. Я не хочу ничего такого ни реализовывать, ни видеть как пользователь. Я хочу, чтобы просто ничего не терялось.

Дальше. Если уж всем этим заморачиваться вообще, то нужно сохранять не только на сервер, но и локально. Чтобы можно было надёжно редактировать заметки без интернета. То есть сложность вырастает ещё сильнее. Возникает аж три версии у каждой заметки: опубликованная на сервере, сохранённая неопубликованная на сервере и сохранённая локально. Это не считая того, что локально может быть разная на каждом клиенте.

В общем, я прихожу к выводу, что единственный способ сделать эту фичу действительно хорошо и без компромиссов — полноценно реализовать collaborative editing как в Гугль-доке. То есть для меня как пользователя не должно быть вообще никакой разницы между клиентом и сервером. Я должен видеть всё в самом свежем виде, на каком устройстве бы ни открыл редактор заметки. А если интернета нет, то после его появления всё должно смёрджиться максимально чисто.

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

Я не представляю, насколько трудно реализовать надёжное одновременное редактирование с нескольких устройств, но знаю словосочетание operational transformation, погуглив которое можно найти всяких статей на эту тему. Например, Collaborative Editing in JavaScript: An Intro to Operational Transformation (очень клёво объяснён сам принцип).

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

Ещё есть Фаерпад, но там только клиентская часть, и он, как я понял, работает только с собственным сервером. А мне нужно сделать сервер частью Эгеи, причём я бы предпочёл, чтобы сервер был как можно тупее, а вся умная логика была реализована в Джаваскрипте.

Внимание, вопрос: что вы посоветуете? Или, может, кто-то из вас захотел бы сделать такой продукт — библиотеку для одновременного редактирования — под моим внимательным взглядом со стороны? А может, вы вообще думаете, что в моих рассуждениях ошибка и надо всё делать иначе? Расскажите в комментариях, пожалуйста.

2016   веб-разработка   Эгея

Эгея v2970

Ещё один апдейт Эгеи 2.5 — v2970 (по ссылке же и инструкция по обновлению).

Что нового:

  • на экране настройки теперь словами написано, что чтобы поменять юзерпик его нужно просто перетащить (до этого многие не допирали и спрашивали меня по почте);
  • у счастливых обладателей ПХП 5.3 вместо инсталятора показывало кашу из тегов в полях, и я им почтой отвечал, что сделать, чтобы заработало — теперь работает и без почты;
  • в прошлый раз я писал, что заработало под ПХП 7, но заработало не у всех — попробуйте ещё раз;
  • в прошлый раз я починил баг «Field ‘Description’ doesn’t have a default value» путём прописывания дефолтного значения, но при некоторых конфигурациях БД вылез баг, что текстовые поля «can’t have a default value» — больше не должно быть всех этих проблем;
  • в заметках без картинок юзерпик отдаётся соцсетям в качестве картинки;
  • индикатор загрузки стал чуть аккуратнее (как в новом Эмёрдже).
2016   продукты   релиз   Эгея

Эгея v2964

Ещё один апдейт Эгеи 2.5 — v2964 (по ссылке же и инструкция по обновлению).

Что нового:

  • заработало под ПХП 7;
  • типографика в английском стала лучше работать, а главное исправлен тупейший баг, из-за которого Нисден не переключался автоматически на английскую типографику в блогах на английском языке — теперь всё должно работать само и хорошо;
  • вероятно, починил баг «Field ‘Description’ doesn’t have a default value»;
  • вероятно, починил скроллбары, вылезающие иногда на Винде в таблицах и подобном.
2016   продукты   релиз   Эгея

Эгея v2960

С момента выхода 2.5 (v2953) я потихоньку исправлял разные мелочи и заменял на сайте движка дистрибутив. Сейчас там уже лежит сборка v2960 (по ссылке же и инструкция по обновлению).

Вот что изменилось и исправилось:

  • Лайкли обновились до 2.1.3, где починили счётчик Фейсбука;
  • картинки-превьюшки, отображаемые в Черновиках и в редакторе под заметкой, стали ретиновыми (заодно дизайн черновиков немного улучшился: превьюшки теперь стоят под обрез);
  • в одном из файлов шаблонов по ошибке использовался короткий тег ПХП (short_open_tag), хотя я заявлял совместимость с отключенными короткими тегами;
  • заработали неработавшие иногда поле тегов, Энтер в названии заметки и подвисание карандашика в Хроме;
  • по ошибке у ответов на комментарии звёздочка ставилась в зависимости от важности комментария, а не ответа;
  • инсталятор выводил в заголовок окна диагностические сообщения;
  • максимальный размера загружаемого файла увеличился до 256 мегабайт.
2016   продукты   релиз   Эгея

Как работает мой сайт

Мой сайт работает на моём самописном движке на ПХП (единственное исключение — раздел «Блог», о нём в конце).

Файлы страниц сайта лежат в папках, соответствующих урлам разделов, например страница про Ангстрем лежит на сервере под именем .../www/projects/angstrom/angstrom.php. Задача этого файла — сгенерить ХТМЛ смысловой части этой страницы.

Метаданные

Рядом с файлом имя-папки.php должен лежать файл метаданных _имя-папки.php. Для Ангстрема он выглядит примерно так (выкинул часть полей для простоты):

<?php return array (

  'logo' => 'angstrom',
  'value' => '20140201',
  'title' => 'Ангстрем', 

  'x-showcase-title' => 'Ангстрем, конвертер всего',
  'x-copyright-years' => '2014...',

  'languages' => array (
    'english' => array (
      'title' => 'Ångström',
      'x-showcase-title' => 'Ångström, the converter',
    ),
  ),

) ?>

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

Там умная и гибкая система, которая позволяет делать отличия между сайтами на разных языках (ilyabirman.ru и ilyabirman.net) только там, где они нужны: домен, текст, правила типографики, твиттер-акаунт для шаринга; но всё остальное хранить в одном месте один раз.

Самое главное в файле метаданных — это поле logo. Это постоянный идентификатор страницы, который не поменяется, если я вдруг решу перенести её в другую папку. На нём завязаны многочисленные макросы. Например, на главной у меня есть этажик, где я показываю разные проекты в горизонтальной прокручиваемой полосе — «витрине».

Вот примерный код, который её рисует (подсветка синтаксиса глючит):

<?php $showcase_elements = array (
  'angstrom',
  'moscow-metro-multiplication',
  'therules-2-for-ios',
  'chelyabinsk-trams-2015',
  'emcee',
  'train-thirteen',
  'wireless-dj',
  'snooker-results-display',
  'moscow-metro-poster-vdnh',
  'forebruary',
  'moscow-metro-nanomap',
); ?>

<?php foreach ($showcase_elements as $showcase_element) { ?>
  <div class="b-showcase-element" style="width: 160px">
    <div class="b-showcase-element-image-wrapper">
      <div>
        <a href="<?= HREF ($showcase_element) ?>" class="nu">
          <img
            src="<?= FOLDER ($showcase_element) ?>i/icon-160@2x.png"
            alt="<?= strip_tags (TITLE ($showcase_element)) ?>"
            width="160" height="160"
          />
        </a>
      </div>
    </div>
    <div class="b-showcase-element-title">
      <a href="<?= HREF ($showcase_element) ?>">
        <?= EX ('showcase-title', $showcase_element)?>
      </a>
    </div>
  </div>
<?php } ?>

Макросы

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

  • HREF ($logo) возвращает полный урл страницы по её идентификатору;
  • FOLDER ($logo) возвращает путь к папке, в которой лежит страница;
  • TITLE ($logo) возвращает название страницы;
  • EX ($what, $logo) возвращает значение поля x-something из файла метаданных.

Я, как видите, использую EX и поле x-showcase-title для того, чтобы показывать особые заголовки в «витрине». Если я вдруг решу переименовать один из проектов и перенести в другую папку, и ещё сделать про него страницу на французском, чтобы она была доступна по адресу ilyabirman.net/french/обычный-путь-к-проекту — это займёт пару минут, не считая времени написания французского текста. При этому создавать папку /french/ на сервере и копировать туда все файлы не придётся — языковые элементы урла обрабатываются отдельно и на структуру папок на сервере не влияют.

Есть и другие макросы. CHILDREN вернёт массив всех дочерних для данной страниц. Например, в разделе проектов их список автоматически дополнится новым, если я создам подпапку со страницей нового проекта в ней.

А ещё у меня на страницах бывают переключалки между связанными страницами, вот, например, такой переключалкой провязаны несколько рассказов про Лондон. Это работает, потому что эти страницы связаны в одну группу через поле group в файле метаданных. Они при этом могут лежать вообще по любым урлам, их просто вернёт GROUPLINGS. Если одна из страниц группы окажется недоступна на одном из языков — не беда, значит не попадёт в список. Движок не станет генерить мёртвые ссылки.

Или вот есть ещё WITHIN, определяется так:

function WITHIN ($what, $id = false) {
  return AT ($what) or INSIDE ($what, $id);
}

Удобно использовать в меню, например, в котором плашку у текущего раздела надо поставить если мы в нём или любых его подразделах.

Есть макрос LANG, который возвращает текущий язык. Его удобно использовать, если страницы на разных языках отличаются двумя-тремя строками текста. Но чтобы не писать сто раз if (LANG == ’russian’) { ... }, можно просто положить в папке два файла — angstrom-english.php и angstrom-russian.php, тогда движок сразу возьмёт нужный из них.

Ещё есть TAIL, OFFSET, SIBLINGS, NEIGHBOURS и всякие другие, которые позволяют компактно и внятно выражаться в коде.

Я это называю макросами, а не функциями, потому что это точнее передаёт смысл, и ещё их можно вызывать без параметра $logo и без скобок (если других параметров нет), и тогда они сработают для текущей собираемой страницы:

<h1><?= TITLE ?></h1>

Шаблоны

У любой страницы в файле метаданных может быть поле apply-template — оно говорит движку, что надо пропустить страницу через определённый шаблон перед тем, как заворачивать в обёртку из меню и подвала.

Например, в подвале любого рассказа о поездке я даю ссылки на соседние. Их сколько нужно возвращает макрос SIBLINGS. Но я не копирую этот этаж из рассказа в рассказ — для этого у меня есть шаблон world-story, который применяется ко всем рассказам из поездок.

Шаблон может не просто завернуть страницу во что-то, но и как угодно её обработать перед использованием.

Вот начало файла .../www/world/london-2011-may/london-2011-may-russian.php:

Лондон — лучший город, где мне доводилось бывать.
IMG_0333.jpg Парламент и Биг-бен в Лондоне

Достопримечательностям здесь совершенно необязательно быть в поле зрения, чтобы было понятно, где ты находишься. Каждая деталь напоминает об этом:
IMG_0238.jpg Телефонная будка, почтовая машина и автобус в Лондоне

Похоже на текст из редактора Эгеи, правда? Потому что я тут использую Нисден — форматтер Эгеи. Шаблон world-story автоматически пропускает текст через него. Поэтому тут автоматически работает всякая резиновость картинок, фоторамы и всё остальное, и в результате сам собой получается рассказ про Лондон.

Блог

Теперь про блог. Блог работает на Эгее и живёт своей жизнью, несмотря на внешнее сходство с остальным сайтом. Эгея, в отличие от остального сайта, используют базу данных для хранения заметок, комментариев и прочего. Сайту никак не мешает, что в папке /meanwhile/ у него живёт что-то «неродное». Он не находит там файла _meanwhile.php и поэтому считает, что эта папка для него не представляет ценности.

Мне надо, чтобы в блоге у меня использовался ЦСС с основного сайта, но всё же в нём есть несколько своих особенностей, поэтому напрямую я не могу залинковать тот же самый файл. Чтобы не носить общие для сайта изменения из одного файла в другой, я использую Галп, который автоматически собирает нужную версии ЦСС-файла для блога.

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

Это недокументированная функция, но по секрету скажу что там, где у вас в Эгее лежит папка /user/, у меня лежит папка /users/ с двумя подпапками. Да, Эгея умеет быть многопользовательской уже много лет! Только никому не говорите. Если серьёзно, это работает на костылях. Заранее говорю, что не буду отвечать на письма с вопросом «как мне сделать так же».

Ctrl + ↓ Ранее