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

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


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

t.me/4x_pro

Лог жизни

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


О суператорике и типологиях вообще

4X_Pro
Вчера (вернее, уже позавчера) пересёкся с Д.А., соавтором Ал.Л. книги по типологиям, в которую вошла и моя глава по информионике. Получил от него бумажный экземпляр книги. Глянув на внушительный список типологий на базисе 3+1, про которые рассказывается в книге, сначала отнёсся скептически: «надо же, сколько типологий наштамповали», так как привык, что большинство таких типологий — это бесполезные поделки типа кинесомии или скепсии.
Cегодня интереса ради открыл на произвольном месте и попал на суператорику. Начал читать, и оказалось, что типология очень годная! Она работает на стыке 3—4 логических уровней и описывает стратегии, как человек справляется с разрушением того, что я называю опорами личности. В частности, у меня по ней тип получается Жрец-Воин-Маг-Плут. И ещё описание этой типологии дало понимание, что мои призывы к отказу от трат на то, чтобы произвести впечатление на окружающих могут быть восприняты только теми, у кого сходный расклад типов: 1Ж по суператорике, 4Ф по психософии (её мы и приносим в жертву) и внеценностная ЧС по соционике (опять же, потому что траты на статус — это ЧСное). Ну и из-за Мага в третьей позиции больше всего я боюсь необходимости пересматривать картину мира, менять убеждения. А также именно сюда относится страх признавать окончательность чего-либо, фиксировать будущее (прежде я это списывал на 3Б в темпористике).
Ещё понравилось, что в книге применительно к психософии употребляется термин «тетрады», а не «квадры». А также обнаружил, что в главе про информионику дана ссылка на основной сайт — typologies.ru, хотя информация о ней есть только на форуме. Нужно исправлять — выложить туда статью о ней, но вот с мотивацией на это плохо. Впрочем, к вечеру четверга после нескольких дней эмоционального подъёма я сильно выгорел, и сейчас сил нет вообще ни на что…
А ещё подумалось, как по-разному можно относиться к своим идеям. У меня идей много, и поэтому я мало ценю каждую из них, поэтому так легко и бросаю. Вот я сделал одну типологию (информионику), описал ключевые её идеи и выложил, не доведя до конца даже описание расстановки аспектов по функциям. Сейчас возникла ещё одной, про 6 стратегий мышления, на основе моей идеи о различиях инженера и бизнесмена. Но в лучшем случае доведу её до краткого описания каждой стратегии. А будь на моём месте какой-нибудь американец с 1В и процессионной Логикой по психософии, он вцепился бы в соответствующую идею, «размотал» бы её до внушительной книжки, добавил бы кучу жизненных примеров и побежал бы оббивать пороги издательств.

Итоги интеграции

4X_Pro
Вчера занялся настройкой трансляции из Instagram в свой блог с помощью сервиса IFTTT. Дело шло плохо. Для начала я сделал специальный скрипт для того, чтобы посмотреть, что и в каком формате вообще можно получить из IFTTT. Когда стал запускать, обнаружилось, что в $_SERVER не передаётся заголовок Authorization, хотя в основном IntB я мог его получить. Оказалось, что Apache не передаёт заголовок Authorization напрямую из соображений якобы безопасности, и только при использовании mod_rewrite его получается вытащить. Но этого я не знал, и сначала предполагал, что проблема в самом IFTTT.
Выяснилось, что информации приходит не так уж много: только текст записи, URL первой картинки, HTML-код для вставки и ссылка на URL записи в самом Instagram. Остальные картинки, увы, не получить. Пришлось вручную собирать сообщение такого вида: текст записи, потом картинка, потом ссылка «смотреть все фото в Instagram». Потом было долгое и мучительное тестирование. Во-первых, приходилось каждый раз выкладывать новую тестовую запись в Instagram, а потом её удалять, во-вторых, глючил сам IFTTT, то и дело начиная выдавать ошибку 403. В третьих, долго ломал голову над вопросом, убирать ли фото под cut или же картинки по 200 Кб в наше время не такая уж и проблема. Даже опрос в своём чате устроить пытался. Но в итоге решил, что лишнее действие на то, чтобы развернуть cut — это всё же хуже. И вот, наконец, около полуночи после очередного запуска тестовое сообщение появилось в блоге в том виде, в котором мне и было нужно!
В общем, Великую Интеграцию можно считать завершённой, по крайней мере, первый её этап. Получилось весьма громоздко и костыльно: задействованы целых четыре сторонних сервиса и нет единообразия: с каждой соцсетью взаимодействие строится по-своему. Да и в самом IntB тоже пришлось применить весьма спорное решение: ввести новый request_type, в котором вся выдача, в том числе и заголовков, обрабатывается внутри конкретного action (аналога контроллера в MVC), а не в основной части скрипта, как при обычном режиме работы. «Костылём» это назвать нельзя, поскольку в логику работы IntB в целом это вписывается. Но вот что я заметил: решения, которые слишком сильно отличаются от общепринятых, даже мной самим через какое-то время начинают восприниматься как что-то странное. В большинстве frameworkов в контроллер передаётся объект для HTTP-ответа, который используется для вывода результатов, кода HTTP-ответа, Content-Type и других заголовков. (Собственно, даже в MLCE я сделал так, только там один объект отвечает за работу и с запросом, и ответом). А в IntB сделано иначе: есть несколько предопределённых request_type: обычный запрос с выводом результата в полном шаблоне, AJAX-запрос с выводом куска HTML-кода, RSS и теперь добавил вывод без обработки. И то, какой из request_type применить, определяется отдельным методом get_request_type, который можно переопределить для каждого модуля и в нём сделать проверки на нужный action.
А ещё не хватает гибкости. Например, обычно публикации в Instagram транслируются только в «Лог жизни» и ЖЖ, но не ВК и Twitter. Но иногда бывают и такие, которые хорошо бы отправить и в Twitter, и в Lor.Sh. Например, сейчас хочу нарисовать схему взаимодействия всех сервисов, чтобы наглядно показать результаты интеграции. Но увы, ВК и в Lor придётся копировать её вручную.
Зато пришло в голову ещё одно решение: как реализовать те типы сообщений, которых в IntB не предполагается в принципе, например, геолокации, check-inа, репоста. Оно оказалось очень простым — ввести соответствующие BoardCode. А для reply-to и repost — ещё и сделать асинхронную задачу, которая будет вытаскивать и кешировать информацию о странице из OpenGraph или h-entry. И потом показывать такие ссылки оформленными примерно так же, как оформлен предпросмотр ссылок ВК или Telegram.
Ещё решил немного поменять формат канала в Telegram: не транслировать туда разделы «Мировоззренческое» и «Идеи» (для первого потом отдельный канал сделаю, если буду писать активно), а вместо этого транслировать новости и «Интересные материалы». Так он будет более единообразным по формату. Когда стал это настраивать, обнаружилось, что нужно не только добавить RSS-ленты и бота на канал, но и включить канал в настройках самого бота. И только после этого трансляция будет работать. А ещё возникла мысль, что когда выложу MLCE, выложить в левой колонке подборку ссылок на GitHub-репозитории с моими основными проектами. Правда, для этого нужно туда ещё и TextCMS отправить, и Intellect Board, но для последнего тогда нужно выстроить правильный workflow с branchами, на что пока нет внутреннего ресурса.

Заметка в Instagram от October 28, 2021 at 01:26AM

4X_Pro
На прошлой неделе была какая-то усталость от всего, из-за которой решил замедлить жизнь и посидеть дома безвылазно. Но во вторник увидел за окном солнечный день и решил, что упускать его нельзя, да и солнечный свет поднимет настроение. Решил выбраться на электросамокате в Измайловский парк: с одной стороны, полноценная прогулка, с другой — займёт гораздо меньше времени, чем пешая.
И, надо сказать, не зря! Добрался до Серебрянки, потом сходил на то место, где Красный ручей впадает в третий Декоративный (aka Совхозный) пруд, а потом посидел на берегу Красного пруда. Проникся тихим спокойствием осеннего леса! Домой вернулся очень довольный.
P.S. А ещё я сегодня настроил трансляцию сообщений из Instagram в свой блог. И это будет первая запись, которая уйдёт туда автоматически. Так что постепенно ухожу от цифровой фрагментации!
#измайловскийпарк #серебрянка #самокат #электросамокат #красныйпруд #декоративныйпруд #осень2021 #осеннеенастроение

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

Есть поддержка MicroPub

4X_Pro
Весь день сегодня занимался тем, что реализовывал поддержку протокола MicroPub на своём сайте. И таки сделал: это будет первое сообщение, которое я отправлю из Indigenous!
Вообще, чем меня радуют протоколы, используемые в Indieweb, так это наличием сайтов типа webmention.rocks или micropub.rocks, где есть набор готовых тестов для проверки корректности своей реализации. Благодаря им выявил ряд проблем с совместимостью, о которых иначе бы даже не догадался (эх, не быть мне хорошим тестировщиком).

День хороших новостей

4X_Pro
В последние дни жизнь казалась бесперспективной и было чувство усталости от всего. Но со вчерашнего вечера вдруг посыпались позитивные новости. Началось всё с того, что я всё-таки опубликовал заметку про мышление инженера и бизнесмена. Почему-то опасался, что её раскритикуют, но в итоге она набрала уже больше десятка лайков ВК и несколько репостов (что крайне редко бывает с моими материалами). А непосредственно на моём сайте её прокомментировал пользователь с Сетевым именем nekr0z, который также является сторонником IndieWeb. Также он обнаружил, что у меня не работает отображение WebMentions. Сначала я подумал, что это баг в IntB — где-то напутал с роутингом запросов. Но когда подключился к своему VDS и попытался сделать тестовый запрос через curl, получил ошибку TLS. Оказалось, дело в корневых сертификатах. Сделал обновление системы, перезапустил Apache, и всё заработало! А ещё очень приятно было узнать, что есть всё же в Рунете люди, которые не только знают про IndieWeb, но и используют его на своём сайте!
Вторую новость я узнал днём. Мне снова написал Ал.Л. и сообщил, что книга по типологиям, которую он готовил, вышла, и что в неё включена и глава про информионику, которую я посылал ему в начале года. Так что наконец-то что-то из того, что я делал, оказалось увековечено в печатном слове! Я очень обрадовался и объявил об этом и в сообществе ЕТП ВКонтакте, и у себя в Instagram, и в личных новостях. Причем в Instagram появилась возможность отправлять сообщения с компьютера, которой мне ну очень не хватало — третья хорошая новость.
Ещё вчера я нашёл способ реализовать трансляцию в свой блог из Instagram. Оказывается, в IFTTT и Zapier всё же есть возможность делать произвольные POST-сообщения. Просто искать нужно было по ключевому слову Webhooks, что крайне неочевидно. (В Zapier они платные, поэтому придётся использовать IFTTT, таким образом для всей цепочки репостов будет задействовано три разных сервиса). Так что теперь осталось доделать поддержку протокола WebPub в Intellect Board, чтобы делать из IFTTT запрос для репоста из Instagram в раздел «Лог жизни», и на этом Великая Интеграция будет завершена. Можно, конечно, сделать проще — обычный POST-запрос, такой же как при отправке из формы на сайте, но это как-то идеологически неправильно. Плюс WebPub даст возможность писать и из приложения Indigenous, хотя вряд ли я буду этим пользоваться.
А в том же IFTTT я узнал о существовании сервиса Webflow — визуального конструктора сайтов, где обещают возможность генерировать чистый и качественный код. Начал смотреть — первые впечатления довольно положительные. Только экспорт на бесплатном тарифе сделать так просто нельзя (но если постараться, можно вытащить код обходными путями).

Про стоиков, эпикурейцев и чувство принадлежности

4X_Pro
Пару дней назад на глаза попалась заметка про различия в этике стоиков и эпикурейцев. Прочитав её, я сделал для себя весьма неприятное открытие. Я всю жизнь считал стоиков одним из образцов для подражания, но на самом деле на уровне реальных, а не декларируемых ценностей мне этика эпикурейцев ближе. По сути, вся моя жизнь — это уход от боли и стремление к тем наслаждениям, которые не вызывают последующих сожалений и не требуют предварительного долгого насилия над собой, неважно, в виде каких-либо нудных тренировок или в виде зарабатывания денег для оплаты этих наслаждений или ещё чего-нибудь подобного. А ещё у меня сильно́ желание доказать всем, что можно обойтись без жёсткой самодисциплины и силы воли («долой соционическую ЧС!»), творить исключительно на вдохновении. (И таки да, можно, но при условии, что проекты небольшие, и успеваешь сделать задуманное за 2—3 дня, как тот же SiteKnockerBot или расширение VKpph.)
Когда я это осознал, первой мыслью было поискать какое-нибудь сообщество современных эпикурейцев, к которому я мог бы присоединиться. Но быстро подумал, что даже если вступлю, там мне станет скучно. Точно так же, как недавно было с Яндекс.Кью. Вообще, одна из моих главных проблем, на которую ещё в далеком 2009 году указывали сэр Мик и один из участников форума TypTest — я никакую идею или учение не могу воспринимать целостно и становиться её безусловным привержненцем. Вместо этого разбираю её «на запчасти», выбираю из них то, что мне внутренне близко, и вписываю это в своё мировоззрение, возможно, с некоторыми переделками и доработками. С одной стороны, это позволяет мне оставаться собой, сохранять личностную целостность, не позволять миру себя изменить. С другой — лишает чувства принадлежности к чему-то большему, чему-то, что выходит за рамки своего «Я». И мне, как обладателю 2-ого уровня ТУАИ, для которого важно деление «свой/чужой», это весьма некомфортно.
Выходом из этого я видел создание своего круга единомышленников — тех самых идеалистов Интернета, строящих иньскую slow life с отказом от конкуренции и сверхусилий ради достижений. Но увы, создать таковой не хватает то ли личной силы, то ли коммуникативных навыков, то ли чего-то ещё. Кроме того, люди, равные мне по уровню развития, скорее всего, будут поступать так же, как я сам: не принимать чужие идеи целостно, а выбирать из них только то, что близко внутренне. Люди же более низкого уровня обычно ищут решения конкретных проблем, а не ответа на вопрос «как жить вообще».

День тишины и полуоффлайна

4X_Pro
В последнее время в жизни какой-то бардак. Слишком много времени провожу либо не дома, либо просто занимаюсь непонятно чем и испытываю от этого неудовлетворённость. Поэтому решил устроить себе несколько дней замедления жизни в полуоффлайне. Ради этого даже решил пропустить на этой неделе настолки. Но увы, вчера в полной мере замедления не получилось: слишком много бытовых вопросов. И только ближе к ночи поиграл на планшете в Small Town Murders и почувствовал, как внутренне восстанавливаюсь.
Сегодня проснулся с мыслью, что никуда не нужно спешить, чувством удовлетворённости жизнью и сосредоточенностью на здесь и сейчас. Выглянул в окно, порадовался солнечному дню. Проскочила мысль прогуляться, но понимал, что выход на улицу всё же собьёт настроение. Впрочем, пока я думал, природа решила по своему: солнце скрылось за облаками, и день снова стал мрачным. Только совсем под вечер солнце ненадолго выглянуло снова и осветила верхнюю часть соседнего дома и верхушки деревьев, где ещё остаются золотые листья. Великолепное зрелище! Жаль, не хватает умения передать это в фотографии…
Поскольку дел на сегодня никаких не планируется, занимаюсь тем, что сижу и размышляю о жизни. Опять жалею, что мысли в слова превращаются так медленно: столько всего хочется написать, высказать, но когда сажусь за компьютер и начинаю формулировать, очень многое теряется, тускнеет или искажается.
Ещё наткнулся на свою старую почти дописанную заметку про мышление «инженера» и «бизнесмена», о которой из-за кувыркания в потоке событий уже почти забыл. Тогда она казалась мне какой-то незаконченной, а сейчас понял, что вполне можно выложить и в том виде, в котором она есть, разве что добавить одну цитату, иллюстрирующую мышление «бизнесмена».

Что делать с Socionics.me

4X_Pro
После переноса бота задумался, а что вообще делать с VDSом, на котором теперь остался только сайт Socionics.Me и TypograferBot. Второго можно тоже вынести в Amazon, но вот сайт туда уносить не хочу. С одной стороны, можно было бы перенести его  на основной VDS, но тут я сознательно не делаю поддержку https, так как считаю, что бездумное шифрование всего и вся, в частности, блогов и форумов — это напрасная трата ресурсов. Поэтому буду одним из последних, кто уйдёт на https, и скорее всего, это случится только после того, как в основной версии nginx появится поддержка HTTP/3. Тогда устрою большое обновление на основном VDS! Есть мысль сделать проще: перекинуть его на обычный хостинг, где стоят мои старые сайты, и тогда можно будет избавиться от второго VDS, чтобы сэкономить 240 рублей в месяц. Но пока не могу решиться…
Зато вместо этого сделал другое дело, которым хотел заняться уже больше года — подключил Socionics.Me к SAPE. (Да, SAPE ещё жива, как это ни странно.) Увы, роста траффика там ждать неоткуда, поэтому пусть хоть так пользу приносит. Причём не просто кое-как воткнул код в шаблон, а написал полноценное дополнение, которое добавляет виджет для его вывода с настройками. Хотел было выложить виджет в каталог дополнений на сайте самой InstantCMS, но не смог зайти именно как разработчик, хотя утверждается, что регистрация там единая с основным сайтом, куда захожу без проблем. Поэтому ограничился тем, что выложил код на GitHub.
А ещё заменил кнопки Share42 на Яндекс.Share. Про Share42 слышал когда-то негативные отзывы, а Яндекс всё-таки вызывает некоторое доверие. (Эх, вот он — главный вопрос Интернета: вопрос доверия.)

Перенос бота и впечатления от Amazon Web Services

4X_Pro
Вера всё же решился и взял для SiteKnockerBot облачный сервер в Amazon Web Services. Причём сервер взял на ARM-архитектуре. Долго колебался, но в итоге сказалось то, что для ARM-серверов предлагается сетевое подключение до 5 Гбит/с, для x64 с free tier — нет, а хороший канал для этого бота очень даже важен. В качестве дистрибутива хотел было взять уже привычную Ubuntu. Но потом вычитал, что у Amazon Linux, предлагаемого по умолчанию, используется rolling model для обновлений, и это определило мой выбор в пользу него.
Первые впечатления были не очень: чуть не сломал себе мозг, пытаясь выяснить, как подключиться к серверу. Если с тем, что нужно подключаться, указывая public DNS, разобрался быстро. Но вот что вводить в качестве имени пользователя, было непонятно. Перепробовал кучу всего: идентификатор машины, идентификатор группы безопасности и т.п. Ничего не помогало, пришлось читать документацию. Оказалось, что имя пользователя фиксировано и зависит только от дистрибутива, и в моём случае нужно писать ec2-user.
Решил вернуться к истокам и снова в качестве «простукивающей» части бота использовать ту, которую писал в самом начале на PHP, а не более новую на Go. Версия для Go в последнее время стала очень сильно глючить, в последние дни даже несколько раз падала. Да и ложных срабатываний давала существенно больше. А кроме того, из-за другой архитектуры пришлось бы компилировать её непосредственно на сервере, а не просто закидывать бинарник, как раньше.
Попытался было поставить PHP и с удивлением обнаружил, что установилась версия 5.4. Пришлось снова лезть в документацию. Выяснилось, что ставить более новые версии можно с помощью специального скрипта amazon-linux-extras. Причём оказалось, что выбор версий там весьма велик: есть даже PHP 8.0. Я даже хотел был его и поставить, но потом всё же не решился и ограничился PHP 7.4.
Затем какое-то время колебался, что поставить: настоящий MySQL от Oracle или MariaDB. Пытался даже найти сравнения, но из-за недосыпа плохо вникал. В итоге поставил MariaDB просто из соображения, что это ближе к духу open source.
И вот наконец-то всё установлено, база перенесена со старого сервера и наступил момент запуска. Для начала запустил бота с отключенной отсылкой уведомлений в Telegram. После нескольких ошибок последнего момента вроде всё заработало. Но увы, существенного скачка в производительности не наблюдалось. Когда я повысил количество параллельных проверок до 500, стали проскакивать ложные срабатывания.
Остаток вечера и ночь я провёл в попытках найти оптимальное соотношение между максимально возможным числом проверок и этими ложными срабатываниями, а также подобрать настройки системные настройки через sysctl. В какой-то момент даже показалось, что нашёл. Но когда переключил бота в рабочий режим, увидел, что даже для моих сайтов то и дело приходят уведомления о слишком большом времени ответа —2-3 секунды.
В итоге где-то около пяти часов утра пришло в голову неожиданное решение: вытащить из базы общее количество URL для проверки, разделить весь пятиминутный интервал на это число, умноженное на три, и после каждой проверки делать sleep на нужное время. Решение, конечно, очень костыльное, но тем не менее, оно помогло! Ложные срабатывания исчезли, а время отклика моих сайтов стало показываться на уровне 150—240 мс — почти как в те времена, когда я только запустил бота, и проверялись только мои сайты. (На самом деле тогда было 110—180, лишние 40 мс добавились из-за того, что бот теперь находится в ДЦ во Франкфурте, а не в Москве.)
На этом решил успокоиться и пойти спать. Пока число URL на проверке не дорастёт до 25—30 тысяч, этого должно хватить, если не считать того, что PHPшная версия менее устойчива к медленным сайтам из-за особенностей работы curl_multi_exec. А к этому времени я либо всё же доведу до ума бота на Go (сейчас возникла мысль, что там можно переделать), либо вообще напишу сканирующую часть на C в многопоточном режиме, в которой, если и попадётся медленный сайт, он будет тормозить только один из сканирующих потоков.

Испытание робота-пылесоса

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

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

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