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

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


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

t.me/4x_pro

Лог жизни

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


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

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), то любая задача превращается в интересное дело А если нет, то приходится себя заставлять. Соответственно, главная цель сейчас — научиться чаще входить в это самое состояние. Но чтобы оно возникало, нужно делать информационную разгрузку и выделять себе время на спокойное размышление, причем желательно либо утром после подъема, либо наоборот, поздно вечером. А вот с этим как раз и проблемы…

О FUSE для WAD-файлов

4X_Pro
Вчера вдруг вспомнил о своей давней идее освоить FUSE (библиотеку для работы с файловыми системами из userspace). Когда-то я разбирал основы и тогда задумался над тем, чтобы написать модуль для монтирования WAD-файлов, которые использовались в старом добром Doom и ему подобных играх, так как у них довольно простая внутренняя структура.
И вот вчера внезапно произошло то самое складывание в голове всего в единую цельную картину. И это сразу же дало мотивацию сесть и начать писать. Сначала я сделал простую утилиту для извлечения отдельного элемента из WAD-файла для тестирования. Потом пришлось прерваться — мы с Tellой договорились прогуляться по городу. Прогулка прошла хорошо, если не считать, что чуть было не попали под дождь. Но своевременно это поняли и добрались до моста Богдана Хмельницкого буквально в момент начала дождя, где и спрятались. А перед дождем удалось сделать несколько весьма атмосферных фото.
Вернулся я достаточно поздно и занялся переделкой написанной утилиты для работы с FUSE. И тут меня ждала первая неприятность: я долго не мог понять, как правильно передавать имя файла, который требуется смонтировать. Потом выяснилось, что у FUSE есть собственные инструменты для разбора параметров командной строки, и нужно использовать их. Но с этим я разобрался только сегодня, и то далеко не сразу. И вот наконец, первый запуск программы, не приведший к ошибке. Захожу в подкаталог монтирования и с радостью вижу там имена элементов из WAD-файла! Правда, сначала они выводились криво из-за того, что я забыл добавить нулевой байт. Но это я исправил быстро. А вот с другой ошибкой — тем, что список файлов получить удалось, а прочитать какой-либо из них — нет, провозился долго. А ошибка там оказалась довольно примитивная. Я давно не писал на C и благополучно забыл, что функция fread возвращает не число прочитанных байт, а число прочитанных блоков указанного размера. Причем сначала я думал, что проблемы в поиске нужного элемента в WAD или определении его размера. Но сделал отладочный вывод — там было все нормально. И только когда вывел вообще все что можно, и обнаружил, что fread возвращает единицу, понял, откуда берется проблема.
После этого все заработало. Но не обошлось без last-minute bug. Решил сделать по-нормальному: вынести некоторые процедуры из h-файла в c-файл, а в заголовочном оставить только их объявления. Но ошибочно в спешке одну из процедур принял за структуру (ввело в заблуждение слово struct в начале), и оставил ее в h-файле. А потом долго не мог понять, почему линковщик ругается на дважды определенный символ, который к тому же вообще экспортироваться не должен. Потом еще какое-то время ушло на то, чтобы выгрузить получившееся на GitHub и написать краткое описание.
Но все это было не зря: снова удалось почувствовать себя Настоящим Компьютерщиком, который может творить то, что не каждому доступно!
А еще обнаружил, что кто-то поставил звездочку (GitHubовский аналог like) моей другой разработке — JavaScript-библиотеке CondiLoader для асинхронной загрузки JavaScript и CSS. Что ж, хоть кто-то ее заметил!

Очередные настольные игры, весьма удачные

4X_Pro
Вчера (вернее теперь уже позавчера) снова выбрался на настольные игры. Причем выбрался гораздо позже обычного: на улице была сильная гроза, и в какой-то момент даже решил было не ехать, подумав, что все равно никто не соберется. Но где-то к 20:30 гроза стихла, дождь почти закончился, а в чате написали, что уже присутствует довольно много народа. Поэтому все же я поехал.
И, надо сказать, не зря. Сыграл очень удачно: два из трех раз выиграл в «японский бенг» aka «Меч самурая». Причем первый раз — за играл за ронина. Сначала я играл не особо активно, периодически атаковал сегуна, но не особо результативно. В итоге у меня было два жетона чести Потом Ал.С. поверила, что я — ниндзя и решила разыграть так: она атаковала Dexterа (он играл за самурая) так, что у него оставался всего один жетон стойкости, и предполагала, что я на своем ходу его добью, а дальше добил Liu Art, у которой оставалось два жетона стойкости и один жетон чести. В результате игра закончилась, а у меня оказалось четыре жетона. У ронина при игре впятером они умножаются на два, и в итоге я выиграл.
Второй раз я опять же играл не слишком результативно. Я был ниндзей, Ал.С. — сегуном, и она постоянно атаковала меня из-за прошлой игры. В результате до конца я дошел всего с двумя жетонами, но зато припрятал карту дайме, а второй ниндзя (им был Dexter) набрал аж пять жетонов. И мы снова победили с 8 очками.
Третий раз мы с Liu Art были ниндзя и проиграли: противникам пришло слишком уж много карт защит и доспехов, и я просто ничего не мог сделать, несмотря на кучу карт хладнокровия. А у Liu Art, наоборот, была атака любой дальности, но было мало оружия и этих самых карт хладнокровия. Все-таки в «японском бенге» слишком многое решает случайность. А потом, когда до закрытия заведения осталось полчаса, решили сыграть в другую игру — «Зомби». Она более быстрая и гораздо более простая. Получилось так: Dexter активно обращал всех в зомби, и в конце остались мы с ним вдвоем. Но зомби в этой игре, хоть выиграть не могут, но могут помешать другим, чем Ал.С., К.Ш. и Liu Art и воспользовались. И совместными усилиями мы его и победили.
В общем, очень доволен, что выбрался и поиграл. Особенно с учетом того, что на следующей неделе такой возможности не будет.
А сегодня одержал очень необычную победу в «Колонизаторах» онлайн: не построил ни одного города, только пять поселений, а остальные очки добрал за дорогу, за армию и за карту развития. Причем победил с большим отрывом: у остальных игроков было по 6-7 очков только.

Еще немного о Пути

4X_Pro
Никогда нельзя предсказать, куда выведет Сетевой путь. Пару дней назад с подачи сэра Мика стал изучать возможность поездки в Коломну где-нибудь в августе. Рассматривая карту, обнаружил, что от станции Голутвин отходит железнодорожная линия до города Озеры. Заинтересовался, действует ли она еще. Стал искать информацию, нашел пару старых ЖЖ с фотографиями, сделанными на этой линии и впечатлениями о прогулках вдоль нее. А там в комментариях наткнулся на осколок Старого Доброго Интернета — сайт, на котором автор выложил свою повесть «Бусидо междупутья» и несколько рассказов на железнодорожную тематику. Не знаю почему, но решил прочитать, и очень впечатлило: не так часто встречаются авторы, которые могут сочетать живой и образный язык и динамичное развитие сюжета с большим количеством технических подробностей. Особенно понравилась третья часть повести, где поднимаются вопросы о том, что значит не допускать расчеловечивания, быть настоящим человеком (или, в моей терминологии, не скатываться в обывательство). Отчасти они сильно перекрываются с моими размышлениями, но с одной существенной разницей: у главного героя повести все же был четкий ответ, что и зачем он делает и почему поступает именно так. А я уже сколько времени задаюсь вопросом: что же из того, за что я пытаюсь взяться, окажется значимым для Вечности?

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

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