эгея
Начинаю выздоравливать
Начинаю выздоравливать — с каждым днём потихоньку чувствую себя чуть лучше. Сегодня первый день, когда под вечер не свалился от усталости. Не скажу, разумеется, что идеально себя чувствую, но достаточно пришёл в себя, чтобы заменить у себя движок сайта с «Эгеи» на «Регистр», так теперь называется мой движок, написанный поверх
Давно руки чешутся попробовать то, что получается в реальной жизни. Я вижу вещи, которые получились не очень, но сложно сделать лучше, не тестируя разные варианты. Буду тестировать сам на себе, мне кажется, это лучший способ.
Сложности проверки версий
Случайно обратил внимание
Дело в том, что в движке, который я использую для своего дневника, для проигрывания аудио используется библиотека «Жуэль», а её текущая версия, в свою очередь использует старую версию библиотеки «howler.js», в которой есть вот такой код:
self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;
var checkOpera = self._navigator && self._navigator.userAgent.match(/OPR\/([0-6].)/g);
var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);Проблема в регулярном выражении OPR\/([0-6].) и в версии «Оперы». Недавно версия перевалила за 100 и эта регулярка, вместо корректного номера, стала возвращать «10».
Заменил у себя на сайте howler.js на актуальную версию и всё заработало. Заодно предложил патч в «Жуэль», надеюсь примут оперативно.
Моя тема для «Эгеи»
Вчера выложил свою тему оформления для движка «Эгеи». Меня давно просили, а вчера был очередной комментарий на эту тему, ну я и сделал это наконец. Тему надо положить в папку user/themes/bolk, выбрать её в настройках блога и сбросить кеши.
Определение ширины и высоты файла JPEG
В «Эгее» есть
Пока рабочая теория такая, что функция ПХП getimagesize (она возвращает тип изображения и его высоту с шириной) иногда выдаёт неправильные значения.
Опровергнуть или подтвердить эту теорию
Вот Илья и попросил написать меня такой код на чистом ПХП. Надеюсь это позволит продвинуться в изучении проблемы — код вошёл в одиннадцатую версию «Эгеи».
Выложу его у себя тоже, чтобы не потерялся, ну и может
function readJPEGWxH(string $filename): array
{
$file = new SplFileObject($filename);
if (!$file->flock(LOCK_SH)) {
throw new RuntimeException('Cannot lock the file');
}
if ($file->fread(2) !== "\xFF\xD8") {
throw new RuntimeException('Unknown format');
}
for (;;) {
$decoded = @unpack('H4segment/nlen', $file->fread(4));
if ($decoded === false) {
throw new RuntimeException('Unknown format');
}
['segment' => $segment, 'len' => $len] = $decoded;
// SOFn (Start Of Frame)?
if (preg_match('/^ffc[0-3]/', $segment)) {
$segdata = @unpack('Cbits/nheight/nwidth', $file->fread(5));
if ($segdata === false) {
throw new RuntimeException('Unknown format');
}
return [$segdata['width'], $segdata['height']];
}
// len = full lenght of segment except segment magic code
if ($file->fseek($len - 2, SEEK_CUR) !== 0) {
throw new RuntimeException('Cannot find start of frame');
}
}
}AVIF в «Эгее»!
Как говорится, если нельзя, но очень хочется, то можно. «Эгея», как я писал не понимает формат AVIF, но мне его удалось
Изображение ниже я взял из своей заметки про Красную площадь в коронавирусный период. В оригинале оно весит 1,1 мегабайт в формате JPEG, в этой заметке используется сконвертированное изображение размером в 179 килобайт. Почувствуйте разницу.
Добавлено позднее: в небе, кстати, я отчётливо вижу артефакты сжатия, надо играть с параметром качества, прежде чем использовать. Но в остальном картинка как будто бы не попортилась.
Конечно, если ваш браузер не поддерживает AVIF, это будет не та разница, на которую я надеялся. Напишите мне, кстати, если картинка у вас не отображается — я хотел бы узнать что у вас за браузер и насколько он современный.
Итак, «Эгея» не поддерживает AVIF, но я её в «Эгею» вставил. Как же мне это удалось?
Дело в том, что «Эгея» поддерживает формат SVG, а SVG поддерживает внутри себя растровую графику, в том числе вставленную через протокол «data». Протокол «data» — это картинка, закодированная в текстовую строку, вида data:mime/type;encoding,encoded_data.
Вообще, SVG поддерживает и внешние ресурсы (то есть в теории способен подгрузить картинку снаружи), но при вставке через тег img (как в «Эгее») в нём это запрещено по соображениям безопасности.
Поэтому мысль такая — переводим графику в AVIF, кодируем в base64 («data» так умеет, а иначе бинарные данные не вставить),
Для конвертации я написал вот такой небольшой bash-скрипт (для работы требуется пакет ImageMagick):
#!/bin/bash
if [ -z "$1" ]; then
echo "Usage: $0 <picturename>"
exit 1
fi
NAME="$1"
NEWNAME="${NAME%.*}.svg"
WH=( $(identify -ping -format '%w %h' "$NAME") )
if [[ "$NAME" == *@2x* ]]; then
WH=( $(( ${WH[0]} / 2 )) $(( ${WH[1]} / 2 )) )
fi
cat<<XML > "$NEWNAME"
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 ${WH[*]}" width="${WH[0]}" height="${WH[1]}">
<image width="${WH[0]}" height="${WH[1]}"
href="data:image/avif;base64,$(convert "$NAME" "avif:-" | base64)"/>
</svg>
XML
echo "$NAME" to "$NEWNAME" was converted.Последовательность теперь у меня такая — готовлю графику в более привычном формате, запускаю скрипт, получаю файл SVG, вставляю его
Дополнение: уже сообщают, что
Формат AVIF и «Эгея»
Есть такой современный формат графики — AVIF, который родился из видеоформата AV1. Интересен он тем, что даёт иногда существенную выгоду от использования — в моём непоказательном эксперименте на первой попавшейся картинке он уделал формат JPEG на порядок).
Вместе с тем он неплохо поддерживается современными браузерами — 79% по данным сайта CanIUse. Это ещё без учёта полифилов.
Мне очень хочется его использовать и я ищу способ это сделать в движке «Эгея», который я использую у себя в блоге. Можно было бы просто вставлять эту картинку как HTML, но это
У меня возникла хорошая, на первый взгляд, идея чуть упростить себе жизнь через модуль mod_rewrite
<IfModule mod_rewrite.c>
AddType image/avif .avif
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/avif
RewriteCond %{REQUEST_FILENAME} \.jpg$
RewriteCond "%{REQUEST_FILENAME}.avif" -s
RewriteRule ^.*$ $0.avif [END,T=image/avif]
</IfModule>Что тут написано? Если браузер поддерживает формат AVIF (смотрим в заголовке), и запрашивает JPEG (определяется по расширению), и существует файл ненулевой длины с расширением .avif (то есть image.jpg.avif, например), то отдаём ему AVIF.
Хорошо работает, пока в папке с картинками лежит только image.jpg.avif, как только кладёшь ещё и image.jpg — перестаёт, отдаётся только она. Вчера час наверное думал что не так, пока наконец не понял — поверх «Апача» на хостинге стоит nginx, а ему мои правила по барабану.
Если картинки по урлу нет, то nginx отдаёт запрос дальше в «Апач», срабатывает правило, отдаётся AVIF, как только кладёшь JPEG, nginx его видит, отдаёт по урлу, не спрашивая «Апач» ни о чём.
Что с этим делать пока — не знаю, вероятно ничего, nginx никто отключить не даст (у меня обычный дешёвый хостинг без затей), буду думать над другими способами.
Как оставить комментарий
Давно знаю, что многим неочевидно как оставить комментарий у меня в блоге. Время от времени мне
Пишу для всех сразу: чтобы оставить комментарий под любой из заметок, надо написать текст, а потом нажать, например, на конвертик под текстовым полем (на него указывает зелёная рука на скриншоте). Там надо будет ввести имя, которым вы хотите представиться, и адрес электронной почты. Если почты нет, напишите
Более продвинутый способ — нажать на кнопку логина через социальные сети. К сожалению, мой ответ (или комментарии других пользователей) вы никуда не получите, зато комментарий будет с вашим юзерпиком.
Тёмный режим
В качестве эксперимента включил в блоге тёмный режим для тех, кто предпочитает тёмную схему в операционной системе.
Посмотрите, кому важно — хорошо или не стоит. Цвета ещё пока не тюнил, если
Дополнено: подкорректировал цвета, плюс сегодня вышла новая «Эгея», переехал на неё.
Cookie в PHP 7.4
Обнаружилась очень странная проблема у меня на сайте — некоторые комментаторы стали подписываться с плюсом между именем и фамилией. В первый раз я решил, что у человека это вышло случайно или, может, это
Выяснилось, что плюс появился сам собой, люди его и не думали ставить. Так я понял, что столкнулся
В чём примерно дело, понятно стало почти сразу — в вебе пробел иногда кодируется как «+», видимо ошибка
Проблема воспроизводится у тех комментаторов, которые оставили свой первый комментарий до того, как мой сайт перешёл на ПХП 7.4. В этой версии сменился способ кодирования пробела в «куках» (см. на скриншоте) — был +, стало %20.
В принципе, можно вернуть
if (strpos($_SERVER['HTTP_COOKIE'], '+') !== false) {
parse_str(strtr($_SERVER['HTTP_COOKIE'], ['; ' => '&']), $_COOKIE);
}Но хорошо бы внедрить в движок блога код, который будет перекодировать такие куки у пользователей.
Перепись «Эгей»
Кратко: найдено 1160 блогов, из непустых изготовлен файл OPML с 929 адресами.
Как и обещал, публикую результаты своих попыток найти максимальное количество блогов на движке «Эгея». По сравнению с прошлым разом я внёс следующие корректировки:
- в список теперь входят и те блоги, которые установлены не в корень сайта, ранее я их для простоты обработки отбрасывал;
- в прошлый раз я совсем забыл, что бывают и англоязычные «Эгеи», теперь я их ищу по фразе Powered by Aegea, нашлось много нового;
- странно, но свою лепту внесли и украинские/белорусские поисковики — добавили несколько новых ссылок, я ожидал, что «Гугл» в этом деле их всех превзойдёт, но нет, чтобы
что-то найти во всей полноте, надо искать сразу везде; - попросил список блогов с сайта, куда отсылаются анонсы постов, сделанных в «Эгеях» 2.7 и выше;
- добавил в список и живые блоги из проекта коммерческого хостинга блогов на базе «Эгеи».
В итоге получился список из 1160 ссылок. Из этого списка я убрал пустые и дубликаты одного блога на разных хостах и из оставшихся 929 адресов сделал OPML-файл.
Вряд ли я
А ещё у сообщества «Эгеи» появился свой чат в «Телеграме», присоединяйтесь!
В принципе, чтобы сделать то, что многие просили в личке и комментариях — обновляемый список всех «Эгей», надо уговорить основного автора движка, Илью Бирмана, загрузить себе мой список и дополнять его автоматически — по мере появления анонсов от новых блогов. Это был бы самый правильный путь.
Данные по «Эгеям»
В субботней заметке пытался найти блоги на движке «Эгея» среди всех сайтов в интернете — искал в различных поисковых системах слова, могущие указывать на то, что блог использует этот движок, после чего примитивными методами отфильтровывал ложноположительные срабатывания.
Реализация грешила неточностями (которые к сегодняшнему дню я уже поправил), кроме того читатели подсказали ещё один источник — все «Эгеи», начиная с версии 2.7, сообщают на специальный центральный сайт о появлении публичных заметок. Список с этого центрального сайта я запросил и так же включил в своё исследование.
В итоге было найдено чуть больше тысячи блогов, к которым я решил присмотреться повнимательнее — узнать что они используют и в каком они состоянии.
Первым делом посмотрел у каждого блога версию ПХП, некоторые сайты отмолчались, но бо́льшую часть удалось проинспектировать. Распределение близко в нормальному, за исключением версии 5.6, которая необъяснимым образом сохраняет свою популярность, несмотря на то, что уже давно снята с поддержки.
Любопытно, что нашёлся настоящий старичок — заброшенный блог на «Эгее» 2.1 с версией ПХП 4.3.7! Владелец не справился даже с его установкой — первой страницей открывается инсталлятор.
С версиями «Эгей» определённости больше — не удалось узнать версию только тех блогов, которые оказались недоступными на момент исследования. Самыми популярными версиями оказались 2.7 и 2.8, 2.9 появилась недавно, поэтому её распространённость пока невелика.
Есть несколько десятков блогов и совсем древних версий, я их не просматривал, но вангую, что они
Следующее, что я решил посмотреть — распределение «Эгей» по часовым поясам. Как видно из графика, большинство блогов живёт по московскому времени и наверняка находится в центральной части России, хотя третий пояс есть и во многих других странах. Замечу, что есть и экзотика — один блог в поясе «+05:30», это
Теперь самое интересное — какой процент блогов из тысячи живы. Для этого я посмотрел когда была сделана последняя запись в каждом блоге по годам, а для текущего года — ещё и помесячно. Как видно, в этом году посты появлялись только в трети блогов, из них в этом месяце — в половине. Активность ещё трети блогов замерла в прошлом году, возможно они ещё оживут, надежда есть.
Список блогов в формате OPML выложу позже, пока нет возможности его доделать — занят другими проектами.
Эге-ге-я
Для лиги ленивых: найдено 768 блогов, есть файл OPML.
Стало интересно прикинуть сколько существует блогов на движке «Эгея». Придумал два метода — один даёт стопроцентную точность, но низкий охват, у другого возможны ложноположительные срабатывания, но и охват выше.
Более надёжный способ не захватывает, например, мой блог. Статистика по этому способу видна на скриншоте — можно посмотреть относительную идексируемость блогов на «Эгее» различными поисковыми системами. Метод даёт список из 350 блогов и основан на поиске одной характерной строки на специальной странице, достижимой поисковыми системами.
Менее надёжный находит и мой блог тоже, и даёт 1068 ссылок. Если суммировать оба метода, то в совокупности получается 1288 записей, где бо́льшая часть — действительно блоги на «Эгее». Неидеальная точность проистекает из самого метода — я задаю строку поиска "Движок — Эгея" (стандартная строка, выводится стандартно на каждой странице), а это, очевидно, недостаточно уникальная строка.
Дальше список, полученный вторым методом, можно проредить скриптом — убрать все сайты, к которым не удаётся подсоединиться и те, которые не содержат стандартный «подвал» «Эгеи»:
while read url; do
wget -T1 -t1 -q -O- "$url" |
fgrep -q -m1 blogengine.ru &&
echo "$url"
done < aegea-candidates.logЕсли потом выкинуть варианты одного сайта через http и https, а так же с www и без, то останется 768 блогов.
Есть такое мнение, что блоги на «Эгее» ведут люди, в основном, неординарные, которых стоит читать. Для тех, кто в это верит, я собрал весь список в файл OPML, добавьте в свою любимую
Юзерпики в «Эгее»
Во второй раз занимаюсь разовой конвертацией блогов в формат «Эгеи», надо бы записать
В основном обращаться приходится к трём таблицам, имеющим довольно говорящие названия: Notes — сами заметки, Comments — комментарии к ним (там же хранятся и авторы комментариев, единого профиля у них нет) и Aliases — адреса, по которым доступны страницы (в моей схеме в этой таблице нет поля Alias, куда и записывается сам адрес).
Назначения полей, в основном, понятны из названий, кроме разве что поля Stamp — это временная метка создания чего либо в секундах (timestamp) и поля с префиксом GIP, об этом чуть ниже.
Если вам интересны метки (теги), то понадобятся ещё две таблицы: Keywords — где хранится русское название метки и её урл и NotesKeywords, таблица, связывающая метки и заметки.
Теперь про GIP. Если флаг IsGIPUsed в таблице Comments установлен в ноль, то это прежняя схема хранения автора комментарий — без юзерпика, чтобы юзерпик появился, надо выставить IsGIPUsed в единицу, в поле GIP записать сервис, через который была проведена аутентификация (facebook, vk или twitter), а в GIPAuthorID записать некий идентификатор пользователя во внешнем сервисе.
Юзерпик нужно положить в pictures/avatar/ с именем, составленным из полей GIP и GIPAuthorID, записанных через дефисоминус. Например: vk-1.jpg — это был бы юзерпик Дурова, создателя «Вконтакте», если бы он
Тут есть одна интересная деталь. Дело в том, что у меня в блоге, когда он ещё работал на самописном движке, уже были юзерпики, были они и у Олега Петровича, блог которого я переносил сегодня ночью. Причём и у меня, и у Олега авторизация была своя собственная, не обязательно через те сервисы, которые поддерживает «Эгея». Как же мне удалось перенести юзерпики?
«Эгея» в этом месте имеет простой механизм расширений — в принципе в неё несложно добавить любой внешний механизм аутентификации, что я и сделал. Подобрал в папке system/theme/images/, где движок ищет картинки внешних сервисов, подходящую картинку (email.svg) и написал фейковый плагин для сервиса email, который положил в файл system/gips/email.php:
<?php
class E2GIPEmail extends E2GIP {
protected $type = 'email';
private function _get_instance() {
return (object) [];
}
public function get_auth_url() {
return '';
}
public static function get_profile_url($id, $link) {
return false;
}
public function callback() {
return true;
}
}Файл плагина (и его тип) должны называться так же как и выбранная картинка — email и в базе его пользователи записываются с тем же значением поля GIP. В итоге, все свои старые комментарии я положил, как принадлежащие сервису email, а в качестве GIPAuthorID (это строка) взял
Добавлено позднее: невероятно, но факт, оказалось, что GIP-плагины можно класть ещё и в users/gips/, что гораздо удобнее, так как в этой папке он не перетрётся при обновлении «Эгеи».
«Глазелки» ★
У моего хорошего друга, Олега Петровича несколько лет назад был очень интересный блог о путешествиях и краеведении — «Глазелки». Олег забросил его
Всегда считал, что это серьёзная утрата для казанского городского интернета и мечтал сподвигнуть Олега продолжить заниматься блогом. Понимая, что потеря многолетнего труда — довольно сильный демотиватор, я очень хотел
К счастью повезло — блог целиком сохранился
Единственное, что пока не перенесено — комментарии. Сегодня, надеюсь, закончу и с этим, но их там немного, чтению блога это никак не мешает.
Рекомендую посетить обновлённые «Глазелки». Надеюсь Олег в скором времени напишет туда
Страничка статистики
Вдруг стало интересно какое количество букв я намолотил в блог за эти годы. Выгрузил эту информацию из базы в виде двух графиков. Если у вас тоже блог на движке «Эгеи», то вы можете сделать то же самое следующим запросом:
SELECT YEAR(FROM_UNIXTIME(Stamp)) AS Year, COUNT(*) Total, SUM(LENGTH(Text)) Size
FROM e2BlogNotes
GROUP BY 1 ORDER BY 1В статистике пока не участвуют «Дневники жизни» №№2, 5, 6 и 7, я ещё их сюда не перенёс (та ещё будет работка) и нет заметок, которые я писал в блоге на платформе ЖЖ. Кстати, можно будет попробовать их перенести автоматически, надо бы подумать над этим.
Из графиков можно сделать несколько выводов:
Надеюсь, темпы я не снижу, так как в голове есть огромный объём того, что хочется сюда вынести, правда формализовать это непросто, но я буду пытаться.
Как я чужие тексты своровал
Ночью не спалось и, чтобы
Тексты были
Тут нужна небольшая историческая справка. Мой блог — довольно разношёрстное собрание текстов, собранных сейчас в единую ленту, это бумажные дневники, ранний сайт, блог на движке «Регистр», блог на самописном движке, и наконец «Эгея», на которую я перешёл года полтора назад.
Чтобы понять откуда у меня чужие тексты, заглянул в резервную копию блога того времени, благо она у меня кочует с ноутбука на ноутбук в составе остального барахла. А ларчик просто открывался…
«Регистр» в своё время был ещё и РСС-читалкой других блогов на том же движке — у него была публичная страница, на которую они подключались. Тексты из других блогов валились в общую текстовую базу, отличаясь от общей массы лишь одним — наличием значения в поле «source». Я этой страницей почти не пользовался, но 34 чужие заметки успели туда попасть.
Годы спустя, когда я писал конвертор для преобразования блога в новый формат, это уже всё забылось, а поскольку, просматривая основную массу сохранённых заметок, этот тег я не увидел, то сконвертировал всё, что было в базе, вместе с чужими текстами.
Сегодня ночью эту несправедливость удалось исправить — написал
Обновился на бету «Эгеи» версии 2.9
Илья выпустил новую бету «Эгеи» — движка блога, на который я переехал в позапрошлом году. Весьма волнительно было переезжать бету, но дело того стоило. Тем более, что наконец удалось избавиться ото всех костылей, которые пришлось навинтить, чтобы сохранить аватары пользователей, которые у меня были, когда блог работал на моём собственном движке.
До этого в базе в имени пользователя я хранил сериализованное значение, содержащее расширенную информацию о пользователе, а в шаблоне делал десериализацию и расширенный вывод, аватары при этом хранились снаружи — в облаке «Яндекса». Код новой «Эгеи» позволил завести поддельный провайдер авторизации и переложить аватары локально, на диск.
Разумеется, раз это бета, то могут быть баги, например. Я уже заметил, что блок «Избранное» не работает, как только Илья выпустит патч, сразу же накачу исправление. Патч выпущен, накатил новую версию, «Избранное» работает.
Из того, что изменилось кардинально с точки зрения пользователя — теперь есть возможность авторизовываться через социальные сети (я переезжал с очень старой версии, где их не было), это круто! Насколько я знаю, решили и проблему
Другая заметная вещь — «глаз». Около него пишется количество прочитавших заметку. Не знаю в точности что это значит, но занятная штука, пусть будет (она отключается). У меня посещаемость после борьбы с аудиторией упала на два порядка и теперь составляет примерно 800 человек в прыжке, более обычная цифра — около 400—500 в день.
Отключение антиспама
После трёх недель работы без выходных, я сегодня наконец отдыхаю. Тюленил до обеда, а за едой поиграл со шрифтами в блоге, плюс попытался, наконец, полностью отключить антиспам «Эгеи» — это движок, на котором у меня блог работает. Надеюсь получилось, если нет, напишите мне, пожалуйста. Хочу закрыть этот вопрос.
Заодно мы с поддержкой «Мастерхоста»
«Ваш комментарий похож на спам»
Ребята, который комментируют мой блог (это не относится к тем, что читает через ЖЖ или Фейсбук), я знаю, что вы очень страдаете от так называемой «защиты от спама». К сожалению, у движка Эгеи, который я использую, нет никакой настройки на эту тему, но я обязательно придумаю как отключить эту защиту, потерпите немного.
Переезд на HTTPS
Это меня раздражает. Обычно это автоматизируют, но у «Мастерхоста», где я сейчас беру хостинг, такой автоматизации нет, а самому мне её костылить претит. Поэтому я просто заплатил «Комодо» через
При этом оказалось, что движок («Эгея») отрицательно относится к тому, чтобы сайт жил сразу по двум протоколам, поэтому я сегодня настроил редирект. Надеюсь у всех появился вверху зелёный замочек. Если у вас он