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

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


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

t.me/4x_pro

Лог жизни

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


Познание силы frameworkов и шпаргалок

4X_Pro
Впечатлившись тем, насколько Ruby on Rails позволят ускорить работу над серверной частью сайта, решил было попробовать еще раз освоить PHP-framework. На этот раз выбрал Phalcon (как один из самых быстрых за счет реализации в виде PHP extension), начал смотреть документацию, но увы, PHP-frameworkи — это точно не мое.
Зато задумался: раз я так терпеть не могу заниматься версткой, то что если поискать framework для client-side, чтобы ускорить ее? И приступил к поиску. Увы, для обычных сайтов не нашел чего-либо, что захотело бы использовать. Зато наткнулся на NativeScript, который может в разы упростить разработку под Android, и делать это не на Java, а на JavaScript (правда, не знаю, как это будет с точки зрения потребления памяти и производительности)! И вот он вроде бы мне понравился! Кроме того, он использует Vue, с которым я знаком на базовом уровне, но не имел возможности нормально попрактиковаться.
А еще куча готовых мини-приложений на NativeScript Playground навела меня на мысль: а ведь можно же и для верстки под обычный Web в некоторых случаях брать за основу что-то готовое, например, с того же CodePen.io, раз уж так мне версткой заниматься не нравится.
Еще одним открытием последних дней были шпаргалки. Началось все с того, что я наткнулся на сайт, где были собраны шпаргалки по языкам программирования. Посмотрел, и понял, что они прекрасно решают проблему запоминания названий стандартных функций в разных языка (например, в Python перевод строки в верхний регистр делается методом upper, в Ruby — upcase, а в JavaScript — toUpperCase, и я постоянно забываю и путаюсь, где что и приходится лезть в документацию, на что тратится куча времени).
Потом решил поискать шпаргалки для frameworkов, связанных с анализом данных (Pandas, Keras, SkLearn), где тоже никак не мог запомнить, как пишутся всякие классификаторы, регрессоры и тому подобное. И, как это ни странно, нашел! Так что когда надумаю вернуться к этой теме, все будет намного проще!

Ночное осознание или Слово о моей закрытости

4X_Pro
Несколько месяцев назад Tellа в одном из разговоров сказала, что если сравнивать с тем, что было на моем старом форуме (имеется в виду Socioclub.Org), я стал гораздо более закрытым и менее эмоциональным. Я сказал, что да, и сам это замечал. Где-то между 2007 и 2009 годами случилось «выгорание», после которого я сильно изменился. И задумался над тем, а что именно было этим поворотным моментом.
Долгое время я считал, что «выгорание» было вызвано перегрузками 2008 года — последнего года аспирантуры, а также тем, что не было возможности нормально прийти в себя после ее окончания.
Недавно мы вернулись к этой теме, и возникло предположение, что это была реакция на мятеж Spyke, а точнее даже тот факт, что его поддержало столь большое количество участников моего форума. Но вчера вечером вдруг пришло осознание, что это не так. Мятеж Spyke скорее поставил вопрос так: «на что теперь в жизни можно опереться, если даже форум не является такой надежной опорой» (и это тогда я еще и представить себе не мог, что пройдет несколько лет, и социальные сети  и привел к мысли, что нужно делать сайт, привязанный к моей личности (что в полной мере было реализовано только 11 лет спустя созданием этого сайта).
А сегодня ночью пришло осознание, что переключение в параноидный режим «кругом враги» произошло чуть позже. Первый шаг к этому был сделан 7 декабря 2007 года, во время ситуации с доменом socionics.su. Напомню, что в тот день произошло снижение цены на регистрацию в доменной зоне .su, и я планировал взять этот домен. Но регистратор R01.Ru в тот момент, когда должна была начаться регистрация по новой цене, вдруг взял и устроил технические работы почти на сутки! И за это время домен благополучно присвоил себе Oleg, зарегистрировав его через РуЦентр, и стал из-за этого моим врагом. (Много позже я узнал, что был монопольный сговор: РуЦентр проплатил другим регистраторам, чтобы они в тот день не работали.) Вторым шагом было то, что я узнал, что Хрулев позаимствовал у меня идею создать сайт на отдельном домене по признакам Рейнина. Но поскольку он был более известным и имел больше возможностей по раскрутке, то многие считали, что это была его собственная идея.
Третий случился то ли в 2008, то ли в 2009 году, когда от того же Olegа пришло спамное приглашение в его соционическую группу, где было 42 тысячи человек, и было понятно, что это результат накрутки и спама (в 2013 году это подтвердилось — чуть ли не половина из них оказалась ботами, и когда их перебанили, группа просела до где-то 24 тысяч). И стало ясно, что победить его честным образом не представляется возможным (примерно так же как нельзя обыграть шулера в карты, даже будучи самым лучшим игроком). Тогда-то и включился параноидный режим: появилась злость на всех вокруг, что не помогают мне бороться с этим нехорошим человеком (а то и вовсе поддерживают его, состоя в этой самой накрученной группе), и, как следствие, закрытость в плане типологического сотрудничества.
Не очень, правда, понятно, что с этим делать, как снова вернуться к себе-прежнему в полной мере…

ИКС дали!

4X_Pro
Жизнь в полуоффлайне на даче привела к тому, что я только вчера узнал, что в конце июля на Яндексе пересчитали формулу для ИКС. И у большинства моих сайтов очень неплохо повысились показатели: у 4xpro.ru вместо 130 стало 220, у socionics.me и sociomodel.ru показатель вернулся к 60, и даже у TypTest подрос до 140! Правда, как выяснилось, во многом это результат смены методики расчета самого ИКС. Но все равно приятно: есть прогресс!

Пятый заезд: итоги

4X_Pro
Вот и все: пятый заезд подошел к концу. Менее чем через полчаса уже отправляюсь обратно в Город. Настало время подвести итоги. Успел я довольно многое:
  1. Собрал ядро Linux и впервые получил время загрузки лучше, чем во времена MS-DOS, а также узнал немало новой информации о его настройках.
  2. Попрактиковался в Ruby on Rails и в целом остался доволен возможностями этого framework.
  3. 3. Пять раз сходил на прогулки и снял немало интересных кадров.
  4. 4. Прошел еще одну кампанию в Battle for Wesnoth: Under burning sun.
  5. 5. Осознал, что для того, чтобы наладить режим дня, нужно устроить себе день с ограниченным Интернетом (или отключить связь вечером).
Но кое-что так и осталось не сделанным:
  1. 1. Не съездил в дальний лес и не обследовал местность вдоль дороги на Васютино (впрочем, не было цели сделать это конкретно в этот заезд)
  2. 2. Не смог полностью наладить режим дня, только в последние два дня смог ложиться около трех часов, а не пяти, как все остальное время.
  3. 3. Так и не дочитал книгу по алгоритмам, хотя собирался.
  4. 4. Не смог ограничить себе Интернет, чтобы входить в то состояние озарения (ЭСП №2), о котором писал перед заездом.
Общее впечатление осталось противоречивым: вроде и съездил не зря, но и такое ощущение, что что-то важное упустил.

RoR и размышления о собственном frameworkе

4X_Pro
После того, как закончил со сборкой ядра, вернулся к изучению Ruby on Rails. Наконец-то перешел от теории к практике — стал писать Интернет-магазин. Впечатления довольно противоречивые: с одной стороны, за несколько дней весьма ленивого программирования получил почти работающий прототип (осталось только оформление заказов доделать), причем с правильной структурой URL.
С другой — серверная часть разрабатывается быстро, а вот в плане верстки плюсов практически никаких. Даже то, что генерируется автоматически, выглядит так ужасно, что если делать серьезный проект, то пришлось бы переверстывать.
Еще двоякое впечатление вызвала такая штука как migrations. С одной стороны, они решают проблему обновления структуры БД, с которой я сталкивался при разработке IntB, с другой — делают это совершенно иначе, чем у меня. Я-то исходил из того, что есть структура база такая, какая должна быть, и есть текущая, и нужно увидеть разницу и добавить/убрать недостающие столбцы через какой-нибудь sqlt_diff или mysql_diff, при этом база может редактироваться через сторонний визуальный редактор, и это делается часто. И еще удивлялся, почему так мало подходящих для этой цели инструментов, хотя с проблемой сталкиваются почти все разработчики. А в Ruby on Rails нужно документировать каждое изменение БД в виде отдельной migration, и задавать изменения либо в командной строке, либо в коде файла migration. С одной стороны, много лишних трудозатрат, с другой — они гарантировано фиксируются.
А вообще, все описанное выше заставило меня вспомнить о моих давних идеях data driven framework, где разработка приложения начинается именно с того, что в визуальном редакторе описываются данные. Причем делается это не как сейчас в RoR, где в командной строке указываются только типы данных, а задается то, может ли это поле вводиться через форму, сохраняться в базу или являться вычислимым, а также нужны ли пре- и пост- обработчики поля при сохранении/загрузке. Если оно отображается в форме, то указывается способ отображения (input, radio, checkbox или вообще целый компонент) для редактирования и просмотра, краткое описание, длинное описание и справка. Потом с учетом всего этого генерируется файл и два класса модели: абстрактный, который только сохраняет и фильтрует поля и может многократно перегенерироваться, и его наследник, где реализуются всякие функции расчета и валидации. В общем, вместо того, чтобы максимально разделять frontend и backend, как сейчас делает большинство frameworkов, наоборот, максимально управлять и тем, и другим через единый интерфейс, и делать упор на минимизацию верстки, которую я терпеть не могу, ибо это трата ресурсов на то, что в моем представлении является второстепенным — интерфейсы и внешний вид.

В поисках болотных озер

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

В лес за малиной

4X_Pro
В пятницу пошел на прогулку в лес за малиной. Хотел было идти в середине дня, но из-за пересборок ядра Linux, о которых писал в предыдущем сообщении, задержался, и вышел уже около 17 часов. Но прогулка получилась не очень: сказывался недосып, из-за которого как бы отключились эмоции, плюс я долго не мог найти тот малиновый куст, ради которого и пошел. Из-за этого нарезал круги по дорожкам, пройдя куда большее расстояние, чем рассчитывал В конце концов нашел место, которое выглядело похожим, но вместо большого куста там было несколько маленьких и чахлых. До сих пор не знаю, то ли его так вытоптали за эти два года, то ли это все же это было другое место. Тем не менее, несколько ягод я все же нашел, но не там, а на других кустах. Кроме этого снова попал к месту, где растет черника, а также видел языческое капище (см. фото в Instagram).
А когда пошел обратно, снова впал в то состояние, в котором принимаю очень странные решения: уже почти дойдя до выхода из леса, вдруг решил пройти по еще одной дорожке, в надежде, вдруг куст окажется там. А когда прошел, подумал, что теперь будет проще добраться по просеке ЛЭП до того соснового бора, о котором упоминал не раз. По карте возвращаться тем же путем и идти через бор выглядело примерно одинаково. Но увы, не учел, что после дождей даже с моей склонностью лезть во всякие труднопроходимые места пробраться по этой просеке стало очень сложно — местами она превратилась в болото. Пришлось делать то, чего я терпеть не могу больше всего — возвращаться назад, пройдя почти три лишних километра.
В общем, устал сильно, впечатления остались странные, но не могу сказать, что прямо уж совсем недоволен прогулкой.

Сборка ядра Linux и новый рекорд скорости загрузки

4X_Pro
В пятницу планировал снова пойти в лес на прогулку. Но, как всегда, стоит что-либо запланировать, как тут же находится причина сделать все иначе. В этот раз все началось с того, что ПНБ на форуме IntB задал мне вопрос, связанный со сборкой ядра Linux. В поисках ответа на этот вопрос я вспомнил, что у меня на дачном ноутбуке лежат исходники ядра, которые я выкачал их еще перед первым заездом из соображений «будет время — поизучаю», но потом благополучно о них забыл.
И вот в среду вечером пришла в голову мысль, почему бы не собрать свое ядро. Но увы, было слишком поздно, поэтому сборку я отложил на четверг. Как всегда, главными целями были экономия памяти и ускорение загрузки. Последний раз я пытался это сделать летом то ли прошлого, то ли позапрошлого года, но не получилось: ядро выдавало панику на этапе загрузки, а терпения разбираться, почему, у меня тогда не хватило. На этот раз решил идти более консервативным путем: не отключать сразу кучу всего, а взять за основу defconfig и дальше убирать или выносить в модули все пошагово. К моему удивлению, на этот раз все сработало, и новое ядро загрузилось! Причем оказалось, что грузится оно ощутимо быстрее штатного: что-то около 2 секунд вместо шести (речь идет о загрузке kernelspace).
Но вскоре выяснилось, что не все так хорошо, как казалось сначала: новое ядро не видит WiFi от слова совсем. Какое-то время ушло на то, чтобы порывшись в настройках ядра, найти там раздел с нужными драйверами и включить их. Но через пару перезагрузок я вдруг обнаружил, что время загрузки вдруг снова выросло до 6 секунд, и дело явно не в WiFi-драйвере. В результате остаток дня прошел в поисках возможных причин. И только глубокой ночью я вдруг вспомнил про то, как в городе отсутствие swap на Ubunutu 18 приводило к 30-секундному простою при загрузке. А поддержку swap я во время экспериментов с ядром как раз взял и выключил! Включил обратно, пересобрал, перезагрузился — лишние три секунды исчезли!
Потом еще экспериментировал с разными настройками безопасности: включал и отключал их, чтобы посмотреть, как это влияет на производительность. Оказалось, что включение запрета на отображение ядра в userspace ведет к весьма ощутимому падению скорости. Остальное влияет мало (если только не пересобирать весь дистрибутив без PIC/PIE-кода). За всеми этими экспериментами засиделся до пяти утра. Эх, прямо таки стереотипное красноглазие: бессонная ночь и консоль с потоком сообщений компилятора!
А в пятницу по каким-то непонятным причинам проснулся гораздо раньше, чем обычно в последнее время, где-то около 12 часов. Решил воспользоваться тем, что погода улучшилась, и пойти наконец-то в лес пособирать малину. Но перед этим вспомнил про то, что вчера так и не проверил работу с новым ядром нескольких устройств: Web-камеры, cardreader и мобильника в режиме модема при подключении по шнурку. Cardreader заработал сразу, а вот для остального пришлось подключать дополнительные модули и пересобирать ядро еще раз. Причем я толком не знал, что именно нужно, поэтому пошел таким путем: сначала делал модулями все, что хоть как-то имело отношение к тому, что нужно, а потом смотрел список, какие модули оставались загруженными, и оставлял только их.
Потом ушел на прогулку (ее опишу в отдельном сообщении). А когда вернулся и вновь занялся экспериментами с ядром. Наконец-то разобрался с вопросом, почему при попытке избавиться от initramfs получается kernel panic, даже несмотря на то, что все необходимые драйвера и модули вкомпилированы в ядро. Дело оказалось в том, что нужно указывать UUID раздела, а не файловой системы (я прежде вообще не знал, что они отличаются). После этого стало ясно, что основной оставшийся источник задержек при загрузке — это драйвер дискретной видеокарты nouveau. Немного подумав, я взял и отключил его вообще.
И вот, перезагрузившись, я увидел скорость, которая еще недавно казалась мне нереальной: по данным systemd время загрузки составляло чуть больше 1.2 сек. kernelspace и 1.0 сек. userspace, суммарно же меньше 2.3 секунды! Впервые мне удалось получить более хорошие показатели, чем у связки PC DOC 7.0 + Windows 3.11 на Pentium, которая была для меня эталоном быстроты! Причем это была не просто какая-нибудь экспериментальная система, а вполне реально работающая и поддерживающая все имеющиеся устройства, кроме дискретной видеокарты. Причем памяти она занимала всего 134 Мб против 181 при использовании штатного ядраю. Эх, во времена Pentium III такая экономия была бы просто прорывом. А сейчас, увы, этого разве что на лишнюю вкладку в броузере хватит…
Казалось бы, нужно сделать скриншот и закончить на этом эксперименты с ядром, вернувшись к обыденной жизни, но увы. Мысль о дискретной видеокарте не давала мне покоя, поэтому в субботу я снова занялся экспериментами с ядром. Сначала выяснил, что использование дискретной карты с nouveau приводит к отключению аппаратного ускорения в броузере (а если включить его принудительно — к весьма эффектным глюкам), без которого на дискретной карте показатели даже хуже, чем на встроенной с включенным ускорением. Поэтому осталась последняя надежда — пропиертарные драйвера от nVidia.
Увы, здесь меня ждало разочарование. Драйвера из дистрибутива собираться с новым ядром не хотели категорически. Я решил пойти другим путем — скачать драйвер с самого сайта nVidia. Скачал версию 390. Сначала все было хорошо: все установилось и собралось без проблем. Но при загрузке X Server драйвер почему-то не использовался. Из логов было видно, что X Server сначала загружает его, потом выгружает без каких-либо внятных объяснений, и вместо этого берет драйвер встроенной карты. После нескольких попыток сделать с этим хоть что-нибудь я решил попробовать другую версию — 340 (384-ой, увы, на сайте не было). Но с ней и вовсе получилось непонятно: если в каталоге с исходниками ядра был файл .config, она отказывалась собираться, ругаясь source is not clean, а при его отсутствии ругалась на то, что в ядре выключена поддержка модулей (при попытке включить которую создавался новый .config и история повторялась сначала). Потом еще были попытки собрать более новую версию nouveau из исходников на его сайте, попытки оптимизировать время загрузки обычного nouveau, задавая разные параметры командной строки, но все безрезультатно. В итоге пока что отключил его полностью, и все.
Но несмотря на это, я снова чувствую себя Настоящим Компьютерщиком, который знает и контролирует то, что происходит в его системе, а не воспринимает ее как некий черный ящик.

Продолжаю изучать Ruby on Rails

4X_Pro
(Запись сделана 23 июля.)
Организм пытается перестроиться на загородный режим, но получается только частично. Спать ложусь около трех часов ночи, но потом еще несколько часов не могу заснуть, и просыпаюсь поздно. Из-за этого сегодня не поехал на прогулку в лес, ради которой, собственно, и заехал на дачу. Да и вообще день куда-то мимо прошел.
Разобраться с тем, как входить в то состояние целостного видения, о котором я писал в предыдущих сообщениях, пока не получается. Простого ограничения Интернета явно недостаточно. Зато, вспомнив, как я делал ту или иную разработку, я понял, что почти все, что получило хоть какое-нибудь признание, начинало делаться именно в этом состоянии!
Также продолжаю изучать Ruby on Rails. Уже голова пухнет от новой информации… Но в целом то, что узнаю, очень и очень нравится: о чем-то подобном я мечтал в 2010—2012 годах, когда начинал делать IntB. А до некоторых вещей так и не додумался, например, автоматической генерации helperов для путей для всех actions или предпросмотра генерируемых Email. А еще пришла в голову мысль, что изучение нового frameworkа или API подобно изучению иностранного языка: нужно быстро запомнить, как по-новому называется знакомое понятие, и, самое главное, вспомнить в нужный момент, чтобы не лезть опять в документацию. По идее, конечно, нужно делать что-то вроде шпаргалки, куда выписывать основные моменты, но увы, как-то я к таким вещам никогда не мог приучить себя. Поэтому остается только одно: время и практика.
Еще мне начали писать люди с конкурса «Цифровой прорыв». Предлагают вступить в команды, но я все же участвовать там не буду. Во-первых, хакатон, где за 36 часов нужно слепить что-то кое-как работающее — это не мой формат, во-вторых, из-за необходимости указывать оффлайновые данные. Но все равно приятно, что заметили!

О цели и внутреннем состоянии

4X_Pro
Вчера вечером, когда закончил писать FUSE-модуль, пришла вдруг в голову мысль: важно не то, что именно я делаю, а то, из какого состояния. То есть если получается зайти в то самое состояние целостного видения (разновидность ЭСП №2), то любая задача превращается в интересное дело А если нет, то приходится себя заставлять. Соответственно, главная цель сейчас — научиться чаще входить в это самое состояние. Но чтобы оно возникало, нужно делать информационную разгрузку и выделять себе время на спокойное размышление, причем желательно либо утром после подъема, либо наоборот, поздно вечером. А вот с этим как раз и проблемы…

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

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