Портрет 4X_Pro
Был в Сети 19 мар. 2024 г., 03:32
Мультиблог
4X_Pro
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Сейчас специализируюсь на ускорении загрузки сайтов и разработке ботов для Telegram. Linuxоид (использую Debian+LXDE). Сторонник IndieWeb.

Социальные сети


Новости сайта в Telegram

t.me/4x_pro

Лог жизни

Лог моей жизни, где я фиксирую наиболее эмоционально значимые для меня события и текущее настроение. Является продолжением блога, который я вел в ЖЖ с ноября 2004 по апрель 2018 года.


Ещё одно изменнеие планов

4X_Pro
И снова внезапное изменение планов. Вчера был весьма результативный день в плане работы над MLFW. Дописал модуль flash-уведомлений, кое-что переделал в классе шаблонов, сделал валидатор имён файлов. Понял, что потребуется ещё рефакторинг — всё-таки вынесу HTML-код полностью в отдельные файлы вместо классов-обёрток, как задумывал изначально. Кроме того, это даст единый подход при использовании любых шаблонов: хоть на чистом PHP, хоть с шаблонизаторами типа Twig или MtHAML.
Но, как уже давно известно, за днём больших результатов следует день спада. Поэтому решил не пытаться заставлять себя повторять вчерашний результат, а отправиться на прогулку на велосипеде. Сначала хотел съездить куда-нибудь к Карпятнику, но решил, что в выходные там будет слишком много народа. И вдруг пришла в голову совершенно неожиданная идея: поехать на новую квартиру, оставить велосипед там и погулять по окрестностям. Потом оказалось, что это была подсказка от высших сил. Подъехав к дому, я обнаружил, что 14-ого числа будет проверка газа и вентиляции, и нужно обеспечить присутствие кого-либо в квартире. В итоге планы пришлось корректировать: завтра вместо того, чтобы ехать днём в Москву, вечером поеду на квартиру, там переночую, и в Москву вернусь уже послезавтра.
А вот прогулка получилась просто отличной! Посмотрел стадион, местный ДК, в итоге только пешком находил 4300 шагов, и суммарно (с учётом поездки на велосипеде) набрал 70 баллов активности по данным Google Health. Но домой приехал сильно уставший, и остаток дня прошёл куда-то мимо.

День ЖЖ

4X_Pro
Сегодня у меня получился день ЖЖ какой-то. Началось всё с того, что в еженедельной рассылке обнаружил статью про неэкономных людей. Сама по себе статья достаточно банальна и особой ценности не представляет. Но вот в комментариях обнаружилось противостояние адекватных людей и любителей вскукарекнуть на тему «нужно больше зарабатывать, тогда вся эта хрень с попытками экономии улетучится». Естественно, пройти мимо такого я не мог! И тут же начал строчить ответы. К моему удивлению, из трёх человек, с которыми я вступил в спор, двое оказались вполне адекватными людьми. А вот с третьим нормально говорить не получилось — он выдавал сплошной поток либо необоснованных утверждений, либо просто общих рассуждений. А любые попытки что-либо конкретизировать уходили в никуда. Но увы, даже в таких условиях почувствовать себя победителем сложно, поскольку непонятно, слился человек окончательно или взял паузу и через пару-тройку дней сможет что-то ответить.
Впрочем, дело не конкретно в нём, а в том, что меня по-прежнему бесит, что есть люди, которые тот факт, что они тратят деньги на всякую фигню, считают обоснованием своего превосходства над теми, кто живёт экономя. Конечно, можно было бы потыкать им в нос статьёй «Богатство — это то, чего вы не видите», но, думаю, бесполезно. Причём, сколько я ни сталкивался с такими, складывается впечатление, что у них мышление как под копирку. Интересно, откуда это берётся. Это что, пережиток того, что феминистки называют МГС (мужской гендерной социализацией)?
Пока я писал эти комментарии, на глаза попалась ссылка, ведущая в блог scinquisitor.
(Кстати, вот она, польза ссылок на другие материалы, нужно у себя на сайте, пожалуй сделать хотя бы вывод ссылок на следующую/предыдущую записи или записи с теми же тегами.)
Просмотрев несколько последних материалов, я увидел статью про борьбу с мракобесием. Она вызвала у меня противоречивую реакцию, и я даже решил написать ответ у себя на сайте http://4xpro.ru/science/mrakobesie/.
Впрочем, несмотря на эти бурные дискуссии, за сегодня успел ещё и кое-что по MLFW сделать, и шашлык пожарить, и на короткую прогулку сходить, и даже попытаться начать обновление своего сервера, но неудачно.

Обновление VDS откладывается

4X_Pro
Мда, с великим обновлением сервера всё оказалось не так просто. Сегодня попытался было сделать dist-upgrade. Вроде всё начиналось нормально: пакеты скачались. Но при попытке обновить libc появилось сообщение, что нужна более новая версия ядра. А ядро я обновить не могу, потому что там тип виртуализации — Xen, и за ядро отвечает хостер. Так что обновление откладывается. Жаль только, что 60 руб на включение платных backupов на момент обновления потратил…
Стал искать альтернативные варианты. Пока смотрю в сторону тарифа «Прогрев» на FirstVDS, он всего 199 руб/мес. При этом оперативки даётся целый гигабайт, а не 512 Мб, как у меня сейчас (а можно взять с SSD вместо NVMe и будет ещё дешевле, при этом при моих нагрузках разница по скорости вряд ли будет существенной). Но с другой стороны, перетаскивать все сайты и переносить настройки DNS — это столько времени уйдёт… В общем, видимо, займусь этим либо когда в Москву вернусь, либо вовсе дождусь, когда у них Debian 12 появится. (Как выяснилось, он вышел прямо сегодня.)

Внезапное изменение планов

4X_Pro
Внезапно изменились все планы. Вчера отправился на длинную велопрогулку. Побывал в ближнем сосновом бору, оттуда выехал на Великий луг и добрался до Нового Капрятника, возле которого стал бывать очень редко после строительства новой дороги — слишком уж неудобно добираться. Посидел на его берегу, сфотографировал ставший уже классическим вид, и ушёл глубоко-глубоко в себя, почувствовав гармонию с миром. После всего этого расхотелось уезжать! Тем более выяснилось, что скорее всего, быстро приехать снова не получится. В итоге решил остаться на даче до вторника, а не ехать сегодня.
Второе изменение планов произошло вечером. Изначально я планировал вернуться к работе над MLFW и сделать класс для flash-уведомлений (уведомления о последних действиях, которые либо всплывают, либо выводятся на следующей после редиректа странице, при этом нужно сделать их запоминание на сервере). Но не тут то было!
Началось всё с того, что я обнаружил у себя письмо от FirstByte, где когда-то держал VDS для socionics.me, а потом там же размещал и SiteKnockerBot. Потом я тот VDS удалил, но пустой аккаунт остался. И вот FirstByte написал об акции, где бывшим клиентам дарится промокод на два месяца бесплатного VDS. Упускать халяву — это не моё, поэтому я решил использовать эту возможность, чтобы всё-таки попытаться поставить и потестировать движок сообщества Forem. Но оказалось, что это не так просто! Сначала хотел было ставить полностью вручную, но почитав мануал, понял, что это плохая идея: слишком много всего ставить и настраивать. Решил пойти более простым путём — установить через docker-compose, как уже пытался когда-то на виртуальной машине. На этот раз установка прошла чуть дальше, но всё равно без проблем не обошлось. Сначала долго писалось, что нет возможности подключиться к какому-то узлу. И в процессе начального заполнения базы посыпались ошибки. Потом это решилось, но из-за того, что база не заполнена, попытка зайти на сайт стала приводить к ошибке 500.
С docker-compose я дела особо не имел, и поэтому как перевыполнить нужную задачу, не знаю. Стал было пытаться разобраться, но тут снова случилось непредвиденное: в полночь пришло уведомление, что новый сервер превратился в тыкву отключили за неуплату! Вот тебе и обещанные два месяца халявы! Скорее всего, дело в криво настроенном биллинге, куда, видимо, забыли заложить информацию об этой акции, либо же в том, что у меня старый аккаунт с ежесуточной оплатой, а там предполагалась ежемесячная. Конечно, можно было бы написать в техподдержку и решить этот вопрос. Но я решил истолковать это как сигнал от высших сил, что нужно не распыляться, а продолжать заниматься MLFW (первый раз они давали такую подсказку через Таро), и завтра вернусь к нему.
А ещё я хотел сегодня выбраться на вечернюю прогулку, но из-за проблем с Forem упустил момент. Пришлось ограничиться созерцанием последних моментов заката через окно.

Как уложить сайт на полдня

4X_Pro
Вчера заглянул в настройки VDS и обратил внимание, что в качестве имени хоста там прописан не 4xpro.ru, который на данный момент является главным сайтом из всех расположенных там, а typologies.ru. Решил поменять это, а потом сразу же ушёл спать, будучи уверенным, что на работу сайтов это никак не повлияет. Но не тут-то было. Оказывается, если имя хоста на сервере совпадает с именем хоста в запросе, то Apache использует конфигурацию по умолчанию вместо той, где это имя хоста прописано явно. А у меня конфигурация по умолчанию вела на мои сайты на TextCMS, так как их у меня много, и прописывать ServerAlias для всех было лень. В итоге вместо моего личного сайта стал выдаваться один из них.
Это отследил мой SiteKnockerBot и начал заваливать меня уведомлениями, что с сайта пропали ключевые слова. Но тогда я ушёл спать и отключил Интернет на мобильных устройствах, а днём хотел успеть на прогулку в солнечное время, поэтому в Интернет не выходил. В итоге то, что сайт не работает, обнаружил только вечером. И ещё пришлось повозиться с настройками Apache, чтобы решить эту проблему с сохранением имени хоста.
В общем, порой даже такие мелкие изменения могут иметь серьёзные последствия!

Готовлюсь к великому обновлению VDS

4X_Pro
Собирался устроить великое обновление своего основного VDSа. Всё-таки Ubuntu 16.04, которая там стоит, уже устарела. Кроме того, с появлением TLS 1.3, где соединение происходит за меньшее число обменов данными, я всё же решил сделать у себя поддержку https. Увы, но отсутствие https сильно влияет на SEO, и не в лучшую сторону. Но решил оставить возможность заходить и по http, поэтому принудительный редирект делать не буду.
Сначала хотел вообще арендовать новый, поставить там систему с нуля (причём даже рассматривал вариант ухода на Debian в целях унификации с домашними компьютерами), а потом перенести сайты. Но всё пошло не так, как ожидалось. Во-первых, сработало автопродление старого сервера, и с карты списалась сумма ещё на год. Во-вторых, оказалось, что сейчас самый дешёвый облачный VDS стоит 380 руб/мес (у меня сейчас с учётом годичной скидки — всего 245 руб/мес). А ещё на Reg.Ru DNS-записи почему-то привязываются не к аккаунту, а к конкретной услуге (что, на мой взгляд, очень неудобно), так что мне пришлось бы их все переносить.
Поэтому я решил пойти другим путём — буду делать обновление системы через dist-upgrade, а потом поставлю certbot. Ещё была мысль поставить nginx в качестве reverse proxy, но от неё, похоже, откажусь: и в настройках слишком много менять, и памяти может не хватить. Подключил временно платное резервное копирование, и хотел было приступить сегодня, но из-за слишком глючного дня решил отложить.

Очень глючные дни

4X_Pro
Вечер вчерашнего (вернее, позавчерашнего) дня и весь сегодняшний получились какими-то очень глючными. Навалилась жуткая раздражительность, не было ресурса на самые простые бытовые действия, а сегодня ещё и поспать получилось часа полтора, пришлось досыпать днём. И ещё понял, что жить на даче больше трёх недель всё же слишком много. Копится усталость и злость на всё вокруг от того, что из-за особенностей дома здесь повседневные рутинные действия типа мытья посуды или просто подготовки ко сну занимают вдвое больше времени, чем в городе. Из-за этого всё больше и больше съезжает режим. Но если в городе мне без разницы, во сколько встать, то тут день часто начинается с раздражения, что лучшая часть дня упущена, на прогулку ехать не смысла, и тому подобное. А мысли о том, что нужно ещё как-то доделывать то, что обещал GoRo и Л.Р. и вовсе угнетают. А тут ещё Melany Tale новую задачу хочет подкинуть.
Причём желание вернуться в Город я испытывал ещё в прошлые выходные. Но не понимал, чем оно вызвано, и очень ему удивлялся: вроде июнь — лучшая часть лета — только начинается. И только вчера пришло осознание, с чем это связано. Более того, то же самое наблюдалось и в предыдущие годы, начиная с 2019 (до этого я на даче редко жил так долго безвылазно).
Эх, решатся вопросы с обустройством новой квартиры, буду жить в таком режиме: на дачу ездить на короткое время без ноутбука только ради отдыха и информационной разгрузки дня на три-четыре максимум. Но пока до этого ещё далеко…
Впрочем, кое-что всё же успел. Вчера прошёл модуль Hellgate в Arcanum, причём технологом (хотя этот модуль больше для магов подходит). А сегодня подключил для MLFW статический анализатор (и обнаружил с помощью него пару мелких ошибок) и создал на GitHub project board со списком задач.

Насыщенный день

4X_Pro
Соревнование на CodinGame закончилось. Я так и остался в серебряной лиге, но это даже к лучшему. Там какая-то странная система подсчёта очков: результат зависит только от места в своей лиге, а не от результата в общем зачёте. И, например, за последние места в золотой лиге начислили меньше десяти очков, тогда как даже за моё 231-ое в серебряной дали целых 23.02. Что сразу же основательно повысило мои позиции в глобальном рейтинге: с примерно 5200 до 4414. (Хотя в лучше времена я вообще в TOP-2000 входил, когда активно участвовал в Clash of Code, но постоянно удерживать высокие места — это слишком большие психологические затраты и источник стресса.)
Как всегда, после того, как заканчивается период жизни, где требуется сконцентрировать на чём-то свои силы, испытываю растерянность. Вроде надо идти дальше, возвращаться к другим делам, но на это нет ресурса. Впрочем, несколько месяцев я случайно обнаружил, что самый эффективный способ справиться с этим — устроить себе пару дней разгрузки. Так вчера и сделал!
В итоге получился очень насыщенный день. Сначала сходил на прогулку к одному из местных водоёмов. Забрался в самые глухие места, где бывают только рыбаки. Нашёл место, где очень много цветов земляники. А ещё спугнул утку с большим выводком утят (кажется, штук восемь)! Утята резво понеслись на центр водоёма, тогда как утка стала летать вдоль берега, громко и противно крякая. А ночью ждало ещё одно приключение: Tella вытащила меня в поездку в заведение под названием «Чудо-печка» в Буньково. Оно расположено в той части Буньково, которая именуется Новостройкой и оставляет далеко не самое приятное впечатление. (Сначала хотели в такое же заведение в Ногинске ехать, но решили, что слишком уж далеко.) Но всё закончилось хорошо!
Ночью ещё поиграл в Arcanum. Точнее, в один из фанатских модулей, найденных мной в прошлом году в Сети, под названием Hellgate. По стилю игры он сильно напоминает Diablo: блуждание по подземельям без сторонних квестов и собирание различных артефактов.
А сегодня день просто прошёл куда-то мимо. Уже почти 19 часов, а я вообще не могу вспомнить, что сделал за день, кроме того, что написал это сообщение и решил один мелкий вопрос с SiteKnockerBot.

Закончил с CodinGame

4X_Pro
Видимо, пришла пора признать, что на CodinGame я сделал всё, что мог, и пора возвращаться к работе над MLFW. Тем более, что сегодня познакомился с человеком, который заинтересовался моей идеей делать движок сообщества.
По соревнованию задача-минимум выполнена: в серебряную лигу я прошёл совершенно без проблем. До "золота", видимо, уже не дойду: сейчас болтаюсь в районе 130 места в серебряной лиге (и где-то 430 в общем зачёте), и нет никаких новых идей в плане улучшения уже имеющегося алгоритма или новых стратегий. Правда, там как-то странно работает подсчёт: если долго не отправлять новые версии алгоритма, то позиция постепенно может немного вырасти. Но вряд ли этого хватит для прохождения в «золото».
Так что по сути, самое главное качественное улучшение — это я стал писать код для игр быстрее. Тот алгоритм, который дал мне этот результат, сделал за три дня, а не сидел все десять, как раньше. Потом только экспериментировал с другими стратегиями, оказавшимися менее удачными, и незначительно доработал его вчера, улучшив игру с несколькими базами.
Но в любом случае, самое главное я получил: удовольствие от решения интересной задачи!

Проблемы на CodinGame

4X_Pro
Сегодня на CodinGame придумал и реализовал уже пятую по счёту стратегию игры. Она получилась эффективнее, чем две предыдущих, (и при этом сам алгоритм очень прост и красив). Но когда я провёл испытания в противостоянии с боссом серебряной лиги, оказалось, что она проигрывает ему гораздо чаще, чем вторая: 3:9 против 6:6. Но если сыграть против своего же кода разными стратегиями, то, наоборот, пятая чаще выигрывает с минимальным перевесом.
Конечно, главным показателем должна стать эффективность против всех игроков вообще. Но проблема в том, что её сложно померить: разбросы огромные. Вчера, например, днём поднялся до примерно 360 места, а вечером тот же код оставался на 700—800 позициях. Я тогда решил, что откатился из-за того, что за день другие игроки так сильно улучшили код. Но утром следующего дня тот же самый алгоритм оказался на 296 месте! Как говорится, и как тут оценить эффективность… Ещё есть подозрение, что иногда глючит сам CodinGame, так как периодически начинает выдавать сообщение, что моя программа не дала результат за отведённое время. Хотя если страницу обновить и перезапустить игру в том же режиме, всё срабатывает как надо. Возможно, просто не хватает памяти для запуска интерпретатора Python. Эх, сесть что ли и переписать самую удачную стратегию на PHP? Заодно и результат в пределах конкретного языка улучшу (на PHP выше меня в рейтинге около десятка человек), это тоже влияет на итоговые очки.
Ещё есть мысль сделать гибридный алгоритм. Я заметил, что пятая стратегия хорошо играет на очень маленьких картах. Соответственно на них использовать её, на более больших — модифицированный вариант второго. Но всё опять упирается в проверку эффективности…

Задать вопрос

Здесь можно задать мне вопрос или спросить совета по любой теме, затронутой в блогах или на форуме. После того, как я отвечу, вопрос и ответ появятся в соответствующем разделе. Но не забываем, что я — сторонник slow life, поэтому каких-либо сроков ответов не обещаю. Самые интересные вопросы станут основой для новых тем на форуме или записей в блоге.
Сразу предупреждаю: глупости, провокации, троллинг и тому подобное летит прямо в /dev/null.