Подписка на блог

РСС — лучше всего

Ещё есть автоматические трансляции в Тумблере и Же-же. Если что-то не работает, напишите мне: ilyabirman@ilyabirman.ru.

Эгея

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

Описания версий

2.3 · 2.4 · 2.5 · 2.6

Некоторые заметки

Эгея v3118

Вышла новая сборка Эгеи, v3118.

Недавно я задавал вопрос про фоновую работу ПХП на ХТТПС. По вашим советам перешёл на curl и всё стало прекрасно работать. Если у вас ХТТПС, вам стоит обновиться, иначе у вас может плохо работать поиск и не работать бекап и подтягивание обложек видосов.

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

Обновляться как обычно — заменить папки /system/, /themes/plain/ и файл .htaccess в корне.

5 июня   Эгея

Вопрос про фоновую работу ПХП

Эгея написана на ПХП как обычное веб-приложение, отвечающее на запросы браузера к серверу. Браузер просит страницу — Эгея её генерирует и отдаёт.

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

Это потому что в Эгее реализован механизм фоновой работы через запрос к себе. Когда нужно сделать что-то долгое, Эгея устанавливает ХТТП-соединение сама с собой, как бы делая вид, что она браузер, отправляет запрос по специальному урлу, который означает «сделай бекап» или «поиндексируй поиск», и тут же обрывает соединение. В результате выполнение скрипта заканчивается быстро, а вся долгая работа делается незаметно, как раз в ответ на этот запрос к себе. О таком методе я узнал лет двенадцать назад от Романа Иванова, и с тех пор пользуюсь.

Асинхронное выполнение на ПХП

К сожалению, с этим методом возникла проблема, когда я стал поддерживать ХТТПС. Если просто отправлять запрос и сразу закрывать соединение, как я всегда делал, не происходит вообще ничего — с точки зрения сервера всё выглядит так, как будто к нему и не обращались. Если же попробовать прочитать ответ, то приходит 400 Bad Request, потому что я как бы пытаюсь говорить с ХТТПС-сервером на простом ХТТП. К сожалению, мне почему-то так и не удалось отправить самому себе запрос по ХТТПС с помощью функции fsockopen () и её родственников, хотя я вроде бы исчитал документацию со всех сторон.

Вместо запроса к себе можно использовать register_shutdown_function (). Но я когда-то пользовался ей, и у меня осталось ощущение ненадёжности — кажется, она выполнялась не всегда, и там были какие-то особенности внутри странные, например, что все пути к файлам должны быть указаны абсолютно. Короче, чтобы ей воспользоваться, нужно переструктурировать код. Женя Степанищев ещё рассказал про fastcgi_finish_request () — похожий вариант.

Эти схемы мне не нравятся непрозрачностью: часть скрипта будет выполняться в каком-то мире, который не виден никому. В варианте с запросом к себе мне ничто не мешает зайти браузером по моему служебному урлу и посмотреть, что происходит. А тут придётся что-то специальное изобретать для отладки. Кроме того, запрос к себе, разумеется, запускает новую копию ПХП, в которой заново начинается отсчёт времени. Выполняя такой запрос, я могу теоретически захотеть сделать что-то ещё так же, и инициировать запрос третьго уровня. И все эти запросы — одинаковой природы, просто заход по урлу. Мне нравится эта однородность.

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

Ну и пока умники в твиттере не начали писать «расскажите кто-нибудь Бирману про крон», объясню, что моя задача — сделать максимально автономное решение, не требующее от пользователя никакой специальной настройки сервера. Закачал на сервер папку — всё работает. Если вы матёрый программист в свитере, вам такое не понять.

Короче, в идеале я бы хотел заставить работать свою исходную конфигурацию. Для этого мне нужно научиться делать запрос к себе по ХТТПС. Причём мне нужно просто «потрогать» нужный урл и отвалиться — мне не нужно по нему передавать никаких данных, не нужно читать ответ. Как это сделать?

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

24 мая   веб-разработка   вопрос   ПХП   Эгея

Эгея v3109

Вышла новая сборка Эгеи, v3109.

В ней исправлен баг, который был случайно введён в сборке v3107 на днях. Из-за него редактор мог повесить браузер. С v3107 надо обновиться обязательно, с v3101 — если вас беспокоит баг с незагружаемостью картинок.

После выхода новой версии всегда есть небольшая турбулентность, пардон.

11 мая   Эгея

Эгея v3107

Вышла новая сборка Эгеи, v3107.

Из заметного с момента релиза 2.6 — исправлен баг, из-за которого картинки могли не загружаться у тех, у кого в урлах используется ?go=. Пока все те, кто поймал этот баг, в итоге перешли на чистые урлы, чем и исправили баг, и получили чистые урлы. Так что от бага они только выиграли.

О том, как сделать чистые урлы, написано в документации («Движок использует в урлах конструкцию ?go=, а я хочу чистые урлы без неё»). Эгея автоматически использует чистые урлы, когда уверена, что они у вас заработают, но она не всегда может быть уверена, поэтому иногда нужны такие пляски с бубном.

Но баг всё же стоило исправить, потому что на чистые урлы могут перейти не все.

10 мая   Эгея

Эгея 2.6

Готова Эгея 2.6 (сборка v3101) с автосохранением, новым поиском и платными фичами. Эта заметка частично повторяет анонс беты и заметку о платных фичах, чтобы всё было в одном месте.

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

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

Эгея 2.6 бета

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

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

Эгея 2.6 бета

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

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

Новый поиск

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

Эгея 2.6 бета

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Фичи для платных пользователей

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

В настройке появились поля Яндекс-метрики и Гугль-аналитики:

Эгея 2.6 и платные фичи

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

При просмотре черновиков снизу появилась «Секретная ссылка»:

Эгея 2.6 и платные фичи

Это ссылка на черновик, которую можно дать кому-то, чтобы он увидел черновик. Я этим пользуюсь, когда публикую рекламу: присылаю рекламодателю, чтобы он утвердил заметку перед публикацией. Если черновик отредактировать, ссылка «сгорает», нужно взять новую.

С бесплатной версией можно — и всегда можно было — просто прислать скриншот.

Теперь вы можете легко прикрутить свою кнопку «Подписаться» (см. у меня под заметкой). Это реализовано через допблок subscribe-sheet. Вы пишете ХТМЛ того, что будет внутри окна подписки, а кнопка под заметками появляется сама. При этом там есть готовые куски, чтобы сделать логотипы фейсбуков и прочего.

Так выглядит комплектное, не настроенное окно подписки:

Эгея 2.6 и платные фичи

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

В бесплатной версии можно — и всегда можно было — сверстать это вручную.

И ещё одна фича — глобальные стили. Это немного облегчает прикручивание Эгеи в качестве одного из разделов большого сайта, где уже есть свои стили. Например, на моём сайте с ранних бет 2.6 Эгея использует ЦСС от основного сайта. Для этого надо в файле theme-info.php от вашей темы оформления прописать ключ global_styles. У меня этот файл выглядит так:

<?php return array (
  'display_name' => 'Минвайл',
  'max_image_width' => '1200',
  'global_styles' => '../css/main.css',
); ?>

В бесплатной версии можно — и всегда можно было — в своей теме оформления копировать стили от основного сайта. Я это раньше делал «Галпом», чтобы два раза не писать, а теперь вот не надо.

Если у вас уже есть платная лицензия, и вы хотите сборку беты 2.6 с этими фичами, напишите мне письмо.

Теперь снова о том, что доступно всем.

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

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

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

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

Остальное

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

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

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

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

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

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

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

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

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

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

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

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

Где скачать

Свежий дистрибутив — на сайте движка.

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

Как прикрутить поисковый движок «Роза»

Я уже рассказывал, что в новой Эгее 2.6 — новый поисковый движок «Роза» Романа Парпалака. На примере Эгеи расскажу немного о том, как вы можете использовать его в своих продуктах.

Что делает Роза

Роза — движок поиска по переданным ему данным.

У Розы нет «паука» для индексации. Это специально. В случае с движком блога, например, нет никакого смысла искать ссылки, ходить по страницам, разбирать их код. И ещё убеждаться, что не индексируешь одну и ту же заметку несколько раз, потому что она встретились на страницах разных тегов. Это лишняя работа: приложение-клиент знает, как устроены данные в нём, и может отдавать их поиску сразу «в чистом виде».

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

Таким образом, поиск — это взаимная работа клиента и Розы. Прикрутить её сложнее, чем использовать движок поиска общего назначения. Зато понимание структуры данных позволяет гибко форматировать результаты и учитывать их природу при ранжировании.

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

Как прикрутить поисковый движок «Роза»

Теперь к делу.

Хранилище

Хранилище — это объект, через который Роза взаимодействует с базой данных. Клиенту нужно передавать его Розе и для индексации, и для поиска. Поэтому удобно иметь функцию, которая его отдаёт, когда нужно:

function e2_rose_storage () {
  static $pdostorage = null;

  if ($pdostorage === null) {
    $pdo = new \PDO (
      'mysql:'.
      'host='. $_db_server .';'.
      'dbname='. $_db_name. ';'.
      'charset=utf8',
      $_db_user,
      $_db_password,
    );
    $pdo -> setAttribute (\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    $pdostorage = new PdoStorage ($pdo);
  }

  return $pdostorage;
}

Для простоты я убрал некоторые специфичные для Эгеи вещи. Я тут проверяю, нет ли уже и так созданного хранилища; если нет, то создаю; и в любом случае его возвращаю. На место переменных, начинающихся с подчёркивания, надо поставить настоящие реквизиты базы данных.

Индексация

Задача клиента — «рассказать» Розе о данных, чтобы она построила свой индекс. Для этого нужно добавить каждую сущность (в Эгее — заметку) в индекс:

$stemmer = new PorterStemmerRussian ();
$indexer = new Indexer (e2_rose_storage (), $stemmer);
$indexable = new Indexable (
  $_note_id,
  $_note_title,
  $_note_text
);
$indexer -> index ($indexable);

Когда пользователь публикует или изменяет заметку, я вызываю этот код. По идентификатору Роза понимает, нужно ли добавить в индекс новую запись или переиндексировать старую.

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

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

Можно отдавать и адрес страницы при индексациии, но для Розы это просто текстовое поле, она не пойдёт по этому адресу низачем, просто вернёт его потом вместе с результатами поиска. Я этим не пользуюсь, потому что мне сподручнее получить адрес заметки из неё идентификатора, а не от Розы.

Индексация одной заметки — быстрая операция, поэтому поддержание индекса в актуальном состоянии не составляет проблемы.

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

Когда пользователь удаляет или отзывает заметку, я делаю примерно так:

$stemmer = new PorterStemmerRussian ();
$indexer = new Indexer (e2_rose_storage (), $stemmer);
return $indexer -> removeById ($_note_id);

Поиск

Чтобы искать, нам понадобится файндер (а ему понадобится стеммер):

$stemmer = new PorterStemmerRussian ();
$finder = new Finder (e2_rose_storage (), $stemmer);
$finder -> setHighlightTemplate (
  '<span class="'.CSS_CLASS_HIGHLIGHT.'">%s</span>'
);

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

Теперь можно сделать запрос и достать результаты поиска:

$rose_query = new Query ($query);
$rose_query -> setLimit (SEARCH_LIMIT); 
$resultSet = $finder -> find ($rose_query);

Тут я не могу продолжать как ни в чём не бывало и не сделать ремарку. Объекто-ориентированное программирование делает мне больно. Просто так написать нельзя:

$results = rose_find ($db_link, $query, SEARCH_LIMIT);

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

Итак, после того, как мы получили $resultSet, мы уже можем выводить результаты. Но это тот момент, когда можно попросить Розу подкрутить релевантность, что я и делаю:

foreach ($resultSet -> getFoundExternalIds () as $external_id) {
  $note_id = e2_note_id_from_rose_id ($external_id);
  $note_rec = e2_note_by_id ($note_id);
  if ($note_rec['IsFavourite']) {
    $resultSet->setRelevanceRatio ($external_id, 2);
  }
}

Так я поднимаю избранные заметки повыше.

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

$snippetBuilder = new SnippetBuilder ($stemmer);
$snippetBuilder -> setSnippetLineSeparator(' · ');
$snippetBuilder -> attachSnippets ($resultSet, function (array $external_ids) {
  $result = array ();
  foreach ($external_ids as $external_id) {
    $note_id = e2_note_id_from_rose_id ($external_id);
    $note_rec = e2_note_by_id ($note_id);
    $note_pack = e2_package_note ($note_rec);
    $result[$external_id] = $note_pack['text'];
  }
  return $result;
});

Чтобы собрать сниппеты, Розе нужны полные тексты заметок — сама она их не хранит, а о структуре моей базы данных ничего не знает. Поэтому в метод attachSnippets мы тут передаём колбек, который Роза вызывает, чтобы их получить. Он, как видите, вытаскивает заметки из базы.

После этого можно собрать результаты:

foreach ($resultSet -> getItems () as $external_id => $item) {
  $note_id = e2_note_id_from_rose_id ($external_id);
  $note_rec = e2_note_by_id ($note_id);
  $note_pack = e2_package_note ($note_rec);
  $note_pack['title' ] = $item -> getHighlightedTitle ($stemmer);
  $note_pack['text' ] = '<p>'. $item -> getSnippet () .'</p>';
  $note_packs_found[] = $note_packs;
}

Я подсвечиваю найденные слова в заголовке и показываю сниппет вместо текста заметки.

Код выдачи результатов поиска неэлегантен — хотя бы потому, что я трижды прохожусь циклом по этим результатам, многократно вызываю одни и те же функции с одними и теми же параметрами. Никаких измеримых проблем эта неэлегантность не создаёт, а её исправление потребовало бы изменения АПИ Розы. Поэтому пока пусть будет так.

В этой заметке я упускаю часть слишком специфичных для Эгеи решений, фрагменты кода местами несколько упрощены. Из примеров полностью выпилен весь код, отвечающий за «смешение» результатов поиска Розы и стандартными средствами БД (я это делаю, потому что у Розы более высокие системные требования, чем у Эгеи, и на некоторых хостингах она может просто не завестись).

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

Эгея v3094

У меня новая сборка беты Эгеи 2.6.

Исправлен баг, из-за которого заметки иногда не индексировались при публикации и, соответственно, плохо искались первое время. При обновлении индекс поиска будет сброшен и перестроен, поэтому сначала результаты поиска будут плохими и придут в чувство в течение нескольких минут.

Ну и ещё исправлено всякое по мелочи (в том числе в работе по ХТТПСу).

Ссылка: e2_distr_v3094.zip Релиз.

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

Эгея 2.6 и платные фичи

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

Поля для Яндекс-метрики и Гугль-аналитики

В настройке появились поля:

Эгея 2.6 и платные фичи

Вставляете код, и всё считается.

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

Секретные ссылки на черновики

При просмотре черновиков снизу появилась «Секретная ссылка»:

Эгея 2.6 и платные фичи

Это ссылка на черновик, которую можно дать кому-то, чтобы он увидел черновик. Я этим пользуюсь, когда публикую рекламу: присылаю рекламодателю, чтобы он утвердил заметку перед публикацией. Если черновик отредактировать, ссылка «сгорает», нужно взять новую.

С бесплатной версией можно — и всегда можно было — просто прислать скриншот.

Кнопка «Подписаться» под заметками

Теперь вы можете легко прикрутить свою кнопку «Подписаться» (см. у меня под заметкой). Это реализовано через допблок subscribe-sheet. Вы пишете ХТМЛ того, что будет внутри окна подписки, а кнопка под заметками появляется сама. При этом там есть готовые куски, чтобы сделать логотипы фейсбуков и прочего.

Так выглядит комплектное, не настроенное окно подписки:

Эгея 2.6 и платные фичи

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

В бесплатной версии можно — и всегда можно было — сверстать это вручную.

Глобальные стили

Эта фича немного облегчает прикручивание Эгеи в качестве одного из разделов большого сайта, где уже есть свои стили. Например, на моём сайте с ранних бет 2.6 Эгея использует ЦСС от основного сайта. Для этого надо в файле theme-info.php от вашей темы оформления прописать ключ global_styles. У меня этот файл выглядит так:

<?php return array (
  'display_name' => 'Минвайл',
  'max_image_width' => '1200',
  'global_styles' => '../css/main.css',
); ?>

В бесплатной версии можно — и всегда можно было — в своей теме оформления копировать стили от основного сайта. Я это раньше делал «Галпом», чтобы два раза не писать, а теперь вот не надо.

Если у вас платная лицензия, и вы хотите сборку беты 2.6 с этими фичами, напишите мне письмо.

4 апреля   Эгея

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

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

«

Многие программисты интересуются дизайном. Я из таких. Лет 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 Релиз.

2017   продукты   релиз   Эгея
Ранее Ctrl + ↓