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

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


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

t.me/4x_pro

Лог жизни

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


Заметка в Instagram от July 23, 2023 at 09:20PM

4X_Pro
Лето в самом разгаре. И я стараюсь его не упустить: второй день подряд выбираюсь вечером на короткие прогулки по окрестностям.
#лето2023 #цветы #облака #вечерняяпрогулка #летнийвечер

Смотреть все фото

Жизнь налаживается

4X_Pro
После ужасного позавчерашнего дня жизнь начала налаживаться. Съездил на продолжительную велопрогулку (Google Fit начислил 80 баллов), побывал возле Старого и Нового Карпятников. И даже Интернет перестал тормозить, хотя всё ещё далёк от идеального. Снова задумываюсь, не купить ли внешнюю антенну.
Вчера вечером и сегодня занимаюсь испытанием панелей управления сервером. Пока что на виртуальной машине. Заодно и оценил преимущества использования snapshots: гораздо удобнее сделать snapshot чистой системы, и откатываться к нему, чем каждый раз заново клонировать виртуальную машину. Скоро создам по результатам этого отдельную тему на форуме.

Портальный эффект

4X_Pro
Приехал на дачу, и опять сработал портальный эффект: всё, чем занимался до этого, вдруг стало казаться далёким и не особо важным. Зато хоть немного начал налаживаться режим дня. Ложусь около трёх часов, а в субботу даже раньше. Вчера хотел было вернуться к тому, чтобы сделать из страницы на Start.Me каталог сайтов, но так и не сложилось. К моему удивлению, я там (на Start.Me) всё же прижился, и, видимо, краткосрочные списки дел буду вести там. Удобно: при запуске броузера они сразу оказываются перед глазами. Плюс можно заходить и с мобильных устройств и добавлять/вычёркивать дела из списков, не садясь за компьютер. А в Obsidian переносить только долгосрочные планы и список идей из категории «вроде интересная тема, может быть, когда-нибудь займусь».
Ещё внезапно нашлись другие интересы. Решил выяснить, что было раньше на месте нашего дачного посёлка. Отправился в Интернет искать старые карты и таки нашёл. Но ничего примечательного не обнаружилось, видимо, был просто лес. Зато узнал другое: я всегда считал, что старая Владимирская дорога более-менее совпадала с нынешним шоссе Энтузиастов, но оказалось, что это не так. В частности, за Ногинском она уходила к югу и пересекала Клязьму возле нынешнего устья Плотни, видимо, чтобы не делать переправу через целых три реки. И только на карте 1860 года появляется современный вариант, а старая дорога показана как второстепенная. А я и не знал, что столько раз бывал на таком историческом месте!

Перестановка на даче

4X_Pro
С удивлением обнаружил, что уже середина лета! Странное дело: в апреле и мае время тянулось достаточно медленно, а потом понеслось очень и очень быстро. Куда делся июнь, я почти не заметил, а июль, казалось, начался совсем недавно.
Сегодня снова приехал на дачу. Дорога была очень долгой и тяжёлой, поэтому за день ничего не успел сделать. Только реализовал идею, которая пришла мне пару дней назад — развернуть письменный стол в первой комнате. А то ещё в прошлый заезд обнаружил, что за спиной много свободного пространства (вся комната и дверь в коридор), и, возможно, раздражение от долгой жизни на даче вызвано именно этим. Решил поставить стол так, что теперь буду сидеть лицом к стене, а не окну. И ноутбук поставил слева от внешнего монитора, а не справа, как было раньше. Теперь привыкаю к новой расстановке… Вроде чувствую себя спокойнее, но зато лишился возможности делать перерывы, просто глядя в окно.
Хорошо, что я вовремя это отследил! Теперь учту при планировании кабинета на новой квартире. У меня там ещё с весны была мысль купить стол с выступом справа, который как бы визуально отделял компьютерный угол от остальной части комнаты, но тогда она казалась странной. Но теперь, с учётом этого, да ещё после некоторых изменений в планировке (диван в итоге будет стоять не там, где я предполагал изначально), понимаю, что мысль была правильной, и именно такой стол мне и нужен!

Ещё на тему «куда девается время»

4X_Pro
Мда, я и взять и что-то просто сделать по инструкции, не попытавшись поэкспериментировать в духе «а что будет, если» — вещи несовместимые. А потом удивляюсь, куда девается время.
В частности, вчера продолжил проходить курс по «белому хакерству». Добрался до очередного практического задания, которое, как предполагал, сделаю минут за 10-15, так как ничего сложно там не было. Но сначала решил попробовать поместить файл на взламываемый сервер не тем путём, который предлагался создателями курса, а каким-нибудь другим. Минут 30 экспериментировал, но в итоге сдался, и сделал как в видео. (Впрочем, могло бы и получиться, не перепутай я флаги -o и -O у команды wget.)
Потом оказалось, что я поднял один из контейнеров не на той виртуальной машине. И долго не мог понять, почему файл, сгенерированный pupy (не путать с Puppy Linux и Putty), запускается и вроде корректно работает, но сессия удалённого управления не создаётся. Оказалось, что там адрес для reverse shell, если не указать его явно, определяется автоматически. А поскольку дело происходило внутри docker-контейнера, он брался равным 172.что-то там, тогда как мне нужно было коннектиться на другую виртуальную машину по адресу 192.168.что-то там. И я больше часа ломал голову, что не так, прежде чем додумался заново сгенерировать нагрузку и увидеть в выводе команды gen IP-адрес, куда она пытается коннектиться.
В общем, в итоге с простеньким заданием провозился больше двух часов. С одной стороны, больше опыта и глубже знания, с другой — опять чувство отставания от жизни, потому что на эти два часа были другие планы.
Впрочем, может быть и обратный случай. Сегодня, например, выполняя следующее задание, обнаружил, что в список sudo-команд внесён vim, которым сразу же открыл файл с флагом, который нужно было получить. В итоге получилось, что docker-контейнеры запускал дольше, чем выполнял это задание!
А ещё подумалось тут, что разрабатывай я сам подобный курс, я  сделал бы его куда жёстче: специально допускал бы мелкие ошибки, для устранения которых нужно хорошее понимание того, как всё работает, а не просто следование инструкции. Но увы, на свой курс у меня никогда не хватит ни времени, ни самоорганизованности…

Прошёл BookTraveler

4X_Pro
Мда, только закончил (вроде бы) с тем проектом, о котором писал в прошлом сообщении, как навалилась новая напасть. После очередного обновления системы перестал работать qemu, который мне нужен как для прохождения курса по информационной безопасности, так и для тестирования различных движков. В частности, собирался попробовать CalcKey — ещё один Fediverse-сервер.
В результате забил на всё и остаток дня потратил на то, что давно откладывал: сел играть в Book Traveler — один из тех квестов, которые когда-то скачал на torrent-трекере в Yggdrasil. И наконец-то прошёл эту игру! Кстати, думаю, она очень понравилась бы Kitsune, но увы, та сейчас играет только на мобильниках, а есть ли версия под Android — не знаю. И, надо сказать, правильно сделал: поиграв какое-то время, восстановил внутреннее равновесие и вернул спокойствие! Ну и просто удовольствие от того, что завершил хоть что-то.
UPD: а сейчас каким-то чудом всё-таки смог заставить работать и QEMU. Правда, так и не понял, что повлияло. Возможно, то, что, что у меня один из data pools лежит на сетевом диске, который должен монтироваться при первом обращении.

Проект, который никак не удаётся столкнуть

4X_Pro
Опять накатывало «уплотнение жизни», из-за которого долго не писал в блог. Всё началось с того, что взялся за очередную freelance-задачу — оптимизиацию скорости загрузки сайта. Сначала долго не мог заставить себя начать. Потом, когда всё же приступил, обнаружил, что всё плохо — на сервере стоит CentOS с древним-древним Apache, не поддерживающим HTTP/2. Нашёл возможность поставить более новую версию обходными путями, но оказалось, что для поддержки HTTP/2 нужно переключаться из preforked mode в какой-то другой. Почему-то я думал, что там PHP работает в режиме Apache module, который только в preforked и доступен, и не стал этого делать. Вместо этого решил было поставить nginx. Потом вспомнил, что у клиентов установлен ISPmanager, и если я поставлю nginx, то возможность управления сайтами через него может перестать работать.
В этот момент я совсем было расстроился, но потом пришло в голову, что видел, что через ISPManager можно управлять и сайтами на nginx, а значит, где-то в настройках должна быть возможность переключения. После недолгого поиска возможность нашлась. Причём оказалось, что ISPManager может и сам nginx поставить, и автоматически конфиги сконвертировать. Затем решил переключить версию PHP с 5.4 на 7.1, чтобы уменьшить время генерации страницы. Сайт просто вырубился без каких-либо сообщений об ошибках. Покопавшись, я обнаружил, что проблема в том, что в скрипте магазина используется работа через расширение mysql вместо mysqli. Хорошо, что я с этим уже сталкивался, и было готовое решение. Дальше осталось только настроить сжатие, кеширование, включить HTTP/2 и радоваться тому, как резко подросли показатели скорости сайта. Потом для полного счастья включил еще TLS 1.3.
Но увы, радость была недолгой. Оказалось, что горе-оптимизаторы, которые занимались сайтом до меня, применили жульнический приём: отключали часть скриптов, если User-agent содержит Lighthouse. Когда я это убрал, оценка упала чуть ли не до того же уровня, который был изначально. Было жутко обидно. Потом, правда, удалось решить часть проблем минификацией некоторых скриптов и асинхронной загрузкой вспомогательных CSS.
Потом ещё немного повозился с уменьшением CLS (то, насколько «ездит» изображение по экрану при загрузке), переводом картинок в WebP, прописыванием всяких alt, height, width, другими мелкими оптимизациями, и считал, что дело сделано. Вдобавок ещё переписал несколько SQL-запросов, ускорив их почти в два раза, чтобы уменьшить время выдачи HTML-страницы.
В итоге добился показателей порядка 90 даже для мобильной версии, и уже было считал задачу выполненной. Но решил проверить и другие страницы сайта. И там всё оказалось гораздо хуже, чем я ожидал: там показатель производительности просел примерно до 50. Отчасти из-за того, что опять же предыдущие оптимизаторы для главной сделали отдельный CSS без лишних правил, а на остальных грузился здоровенный общий, отчасти — из-за того, что в картинках товаров использовался формат JPEG с неоптимальным сжатием. Пришлось переводить картинки на WebP. На первый взгляд, задача простая, но проблема вылезла оттуда, откуда я её не ждал: с ключом, который использовался скриптом генерации картинок. Почему-то на мобильной версии использовался скрипт от главной страницы, а ключи там были разные, так как использовали inode от файла конфигурации. И я полдня возился, прежде чем нашёл это! Но в итоге всё же картинки на WebP перевёл и хоть как-то улучшил показатели и внутренних страниц сайта.
К этому моменту я уже вместо радости по поводу того, что удалось сделать пусть даже и отдалённый закоулок Интернета легче и быстрее, а значит, сделать шажок к своему идеалу «дружелюбный мир для бедных», стал испытывать злость по поводу того, что никак не могу закончить и вернуться к своим основным задачам: прохождению курса по информаицонной безопасности и разработке MLFW. Но увы, злоключения на этом не кончились. Оказалось, когда я переносил оптимизированный запрос с мобильной версии сайта на основную, я закомментировал оба: и старый, и новый. Но вместо того, чтобы просто вырубить сайт с какой-нибудь ошибкой или просто пустым экраном, это породило весьма неожиданный баг: в карточке товары показывались по одной цене, а в корзину попадали по другой. (В этом магазине в своё время сделали очень кривое решение: в базе хранят оптовую цену, а розничную считают в скрипте, причём код скопипастили в несколько разных мест, поэтому периодически такие проблемы всплывают.)
На исправление этого ушла минута. Но проблема в том, что оптимизацией я занимался ночью, утром ушёл спать, и сообщение об этой ошибке прочитал только вечером, когда сайт уже часов пять провисел в таком состоянии.
Ну и сегодня заказчики выявили ещё одну проблему: полезли ошибки во взаимодействии со СберМегаМаркетом. Причём, судя по логам, наблюдались они ещё 5 июля, до того, как я затеял все эти переделки. Но такой уж я человек, что мне проще сделать как надо, чем тратить силы на объяснение и доказывание неспециалистам того, что с моими действиями это никак не связано. Там тоже оказалось всё непросто: в МегаМаркете почему-то получение сведений об остатках переключили с feedа на ручное управление, где они благополучно обнулились, и переключить обратно не получалось. Пришлось писать в техподдержку, где тоже подтормаживали, и только через 20 минут проблема вроде бы решилась. По крайней мере, у товаров статус поменялся на «в продаже».
В общем, из-за всего этого только сегодня возвращаюсь к нормальной жизни, хотя изначально думал, что ещё в воскресенье смогу почувствовать себя свободным человеком. Опять жизнь в состоянии вечного опоздания…

Большая прогулка в Кузьминки

4X_Pro
Опять не успеваю писать в блог обо всём. Слишком уж быстро несётся поток жизни…
В четверг выполнил давнее желание (возникшее ещё в апреле) — выбрался на прогулку в лесопарк Кузьминки. Кузьминки и Сокольники — это два «заколдованных» места, которые, на первый взгляд, совсем рядом, но каким бы способом я ни выбрал добираться до них, получается долго и неудобно. И даже строительство БКЛ ничего не изменило (хотя, возможно, когда откроют подземную пересадку на Авиамоторной, станет проще).
Какой же это парк огромный! А система прудов вообще кажется бесконечной! В итоге прогулка получилась вполне в духе Истинных времён — почти на полдня.
В парк зашёл на это раз не со стороны Кузьминок, а со стороны Волжской. Выполнил своё давнее желание — пройти вдоль реки Пономарки aka Чурилихи в её нижнем течении до Шибаевского пруда. Пономарка чуть более полноводная, чем Серебрянка, а вода в ней более рыжего цвета. Причём ближе к пруду река течёт в низине с достаточно крутыми склонами, а берега — весьма болотистые, пройти бывает сложно.
Сам Шибаевский пруд — самое шумное и многолюдное место в парке. Поэтому возле него я долго задерживаться не стал, а поскорее пошагал к Щучьему пруду. Вот там реально спокойно и хорошо! А ещё пруд необычно соединён со всеми остальными: хотя он находится рядом с нижней оконечностью Нижнего Кузьминского пруда, к нему идёт канал от самой верхней части этого пруда. Причём возле впадения в Щучий канал разделяется на две части, образуя островок, попасть на который можно по двум деревянным мостам. Впрочем, большое количество таких деревянных мостов — это ещё одна особенность данного парка.
От Щучьего пруда я прошёл вдоль этого канала к Верхнему Кузьминскому пруду. В какой-то момент даже хотел обойти его целиком. Потом прошёл немного дальше, увидел, что пруд гораздо больше, чем кажется от плотины, и понял, что такая прогулка будет слишком уж большой. Хотя в 2015 году я его таки обходил! Вместо этого ограничился тем, что дошёл до здания Конного двора (наверное, самый узнаваемый объект во всём парке) и каменного моста чуть подальше за ним. Мост сильно напоминает те, что есть в Царицыно, но выглядит гораздо более старым.
Потом свернул в лес, какое-то время поблуждал там в надежде найти что-нибудь интересное, и просто лучше изучить эту часть парка, в которой прежде был только один раз, и то зимой. Но ничего особо примечательного на глаза не попалось, зато понял, что нужно уже возвращаться. Сделав небольшую петлю, вышел обратно к плотине между Верхним и Нижним Кузьминскими прудами, а оттуда — к главной усадьбе. Кстати, прежде я как-то всегда проходил мимо, и даже не знал, где именно она находится. А от усадьбы уже отправился домой. Надо будет как-нибудь выбраться ещё раз осенью, если, конечно, получится после переезда.
По дороге обратил внимание на то, что несмотря на все стереотипы от Юго-Восточном округе, часть района Кузьминки возле лесопарка производит впечатление весьма уютного и приятного для жизни места.
Во время прогулки я снял столько фото, что стало ясно, что в лимит из 10 снимков в Instagram я никак не умещусь, поэтому выложил их ВКонтакте:

Заметка в Instagram от July 03, 2023 at 11:28PM

4X_Pro
Продолжаю прогулки по Москве. Вчера выбрался на Чистые пруды. С этим местом у меня связано очень много воспоминаний в период с 2007 по 2019 годы. А вот потом как-то перестал бывать, только в прошлом году проехал на самокате по Бульварному кольцу.
До места добрался только вечером, когда уже стемнело. Но в целом так получилось даже лучше: не так многолюдно, и больше ощущается атмосфера этого удивительного места. Прошёл вокруг пруда, потом подумал, не сходить ли пешком до Китай-города или Таганской, но всё же не решился на такое, и вернулся обратно к одноименной станции метро.
Во время прогулки ушёл в размышления о том, что бардак в моей жизни вызван тем, что никак не могу свести воедино четыре разных представления о своём идеальном Я. Описать их можно так:
1️⃣«Школьник на вечных каникулах», который легко и беззаботно катится по жизни, чтобы получать от неё удовольствие.
2️⃣«Городской монах» — тот, кто избавился от статусных потребностей и умеет довольствоваться малым в материальном плане, и личным примером показывает окружающим, что можно жить, не гонясь за «успехом».
3️⃣«Строитель информационного коммунизма», который создаёт те или иные виды контента, чтобы выложить его во всеобщее пользование под свободной лицензией назло баблорубам, стремящимся коммерциализировать всё и вся.
4️⃣«Изобретатель и человек многих знаний», человек, умеющий решать совершенно разные проблемы, что-то вроде инженера Сайруса Смита из «Таинственного острова».
Но проблема в том, что без внутренних противоречий между собой совмещаются только максимум два каких-либо образа из четырёх описанных. Но и выбрать два каких-то и отказаться от остальных — тоже не получается, хотя пробовал не раз.
#москва #чистыепруды #москвавечером #вечерняяпрогулка #размышления #размышленияожизни #размышленияосебе

Смотреть все фото

Ещё одно разочарование: Epycion

4X_Pro
Нашёл вчера ещё один Fediverse-клиент под названием Epicyon. Сначала понравился: он позиционируется как легковесный (насколько это слово вообще применимо к Python), быстрый движок для небольших сообществ, работающий без JS и даже в консольных броузерах. В общем, как раз то, каким и должен быть софт. В какой-то момент даже подумал, а не запустить ли на нём предварительную версию сообщества идеалистов (да ещё и с готовой интеграцией в Fediverse), пока не напишу свой движок.
Но когда попытался запустить, наступило разочарование. Во-первых, как выяснилось, заставить его работать на нестандартном порту без SSL — задача весьма непростая. Но гораздо хуже другое: незалогиненному пользователю на главной вообще ничего не показывается, кроме краткого описания сообщества. И самое плохое — автор, похоже, был каким-то privacy-озабоченным (чего стоит только фраза «The administrator of this instance does not agree to participate in human subjects research, or research to study website policies and practices, carried out by academic institutions or their executors without prior written consent.» в описании сообщества по умолчанию) и сознательно по умолчанию заблокировал индексацию сообщества поисковыми системами. И если бы я не наткнулся в одном из readme-файлов на упоминание об этом, то мог бы долго недоумевать на тему «а чего это меня не индексируют».
Была мысль поднять виртуальную машину и сделать всё как надо, даже сертификат от Let's encrypt получить. Но тут понял, что для виртуализации в целях потестировать то или иное ПО лучше подходит всё же VIrtualBox, чем QEMU. Во-первых, там есть динамически растущие диски, а во-вторых, при клонировании виртуальной машины можно сделать связанный диск, то есть на диске новой машины будут записываться только изменения по сравнению с основной. Это даёт возможность держать машину с почти чистым дистрибутивом, а перед каждым экспериментом делать такой связанный диск. А QEMU диск клонируется целиком. Причём если делать маленький (я для Alpine сделал 4 Гб изначально), его может просто не хватить (как вчера было с Foremом). Ну и плюс от частого копирования целых гигабайт износ SSD получается слишком большой.

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

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