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

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


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

t.me/4x_pro

Лог жизни

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


Совместная прогулка с Tellой

4X_Pro

В начале недели решили с Tellой, что сходим в пятницу в кино. Она выбрала фильм под названием «На границе миров», рекламу которого мы видели прошлый раз, но потом упомянула об этом фильме в одном чате. Там ее начали троллить тем, что если она вытащит меня на такое, то это будет нашим последним походом куда-либо. Она нашла отзывы об этом фильме, почитала, и так впечатлилась, что расхотела идти сама. Это заинтересовало, в свою очередь, уже меня. Я тоже посмотрел отзывы, и пришел к выводу, что это правильное решение.
Поэтому мы решили просто прогуляться в парк за Дворцом Молодежи на Фрунзенской. Я там собирался побывать давно, и даже дважды летом проходил мимо, но внутрь попасть все не складывалось. Впрочем, парк оказался даже меньше, чем я думал, даже меньше нашего Перовского. Но зато там гораздо более красивый пруд, да и вечерний вид на окружающие дома тоже понравился.
Сделав пару кругов по парку, задумались, что делать дальше. Я предложил отправиться к Новодевичьему пруду, где не был уже достаточно давно. Пришли туда, сфотографировали башни Сити и монастырь в ночном освещении, побродили немного по дорожкам, и решили ехать на Киевскую и там поесть в ТЦ «Европейский». Но на переходе на Парке Культуры я запутался (уж очень там планировка необычная) и вместо перехода на Кольцевую мы вышли на поверхность. Решили обратно не спускаться. В пути я рассказал Telle про то, что DarLik недавно удалось сделать почти нереальное: уговорить меня попробовать незнакомую кухню, в данном случае грузинскую. Tella вспомнила, что поблизости есть одна хинкальная, где она когда-то отмечала окончание университета, и предложила сходить туда. Но там не оказалось мест, и мы пошли искать другое заведение. Нашли довольно быстро (но уже не с грузинской кухней, а совсем другое). Там еще просидели какое-то время, а потом отправились до Октябрьской, так как я вспомнил о своем давнем желании снять несколько ночных видов с Крымского моста.
В общем, прогулка получилась весьма длинной, но в целом позитивной!

Бестолковый день с ранним подъемом

4X_Pro

Сегодня проснулся гораздо раньше обычного, так как вернулся к тому, чтобы спать в холоде. В результате день получился длинный, но довольно бестолковый. Сел было писать заметку про то, как избыточный выбор обесценивает все, но как всегда, бессознательное взбунтовалось против планов. В заметке потребовалось вспомнить автора книги «Парадок выбора», я стал искать эту книгу у себя в планшете. В итоге наткнулся на совсем другую — «Человек убежденный» Эрика Хоффнера. Ее я скачал очень давно и благополучно забыл, а сейчас начал читать с огромным интересом, поскольку в ней затрагивается одна из важнейших для меня тем: как происходит возникновение и распад массовых движений. В общем, примерно полдня ушло на эту книгу.
А вечером решил еще пару задач на CodinGame на языке Lua. Но в нем я сейчас сильно разочаровался. Многие вещи приходится делать вручную. Например, там нет готового split. Да и вообще, работа со строками ужасно сделана. В общем, реально язык хорош только там, где экономия ресурсов важнее всего остального. А в других случаях лучше писать на Ruby (вот этот язык мне в последнее время нравится все больше и больше) или на Python.
Еще было бы интересно провести тестирование производительности — сравнить Ruby, Lua, PHP и Python на каких-нибудь типовых задачах типа чисел Фибоначчи или решения систем уравнений, но вряд ли до этого дойдут руки.

Жизнь вроде бы налаживается

4X_Pro

До субботы всё было совсем плохо, а потом, как это ни странно, жизнь начала налаживаться. Сменился эмоциональный фон. А за воскресенье и понедельник столкнул большую часть из тех доделок, о которых писал в предыдущих сообщениях. Ещё съездил в гости к Р.Л., доделали кое-что и по его сайту.
И вообще, не раз уже замечал, что если растянуть проблему во времени, она проблемой быть перестаёт, решение рано или поздно находится, а необходимая для его реализации энергия — накапливается (или я получаю ее от людей, заинтересованных в решении).
На CodingGame решил ещё одну оптимизационную задачу (правда, решение пока далеко от идеала и позволило подняться только в TOP-70%) — Code vs Zombies. И в общем рейтинге поднялся примерно до 1230 места.
А сегодня с DarLik ходили в кино. Посмотрели фильм «Репродукция», где поднимается тема клонирования и переноса сознания. Хотя сначала я отнесся к идее сходить на этот фильм без энтузиазма, но в итоге совершенно не жалею, что посмотрел. Даже несмотря на некоторые явные нелогичности в фильме.
Ещё вчера совершил сеанс технонекромантии — оживил свой старый планшет, купленный в 2015 году. В нем от долгого хранения в разряженном состоянии начал портиться аккумулятор. И получалось вот что: на этапе перехода от зарядки малым током к обычной планшет пытался включить экран, чтобы показать индикатор. Но экран начинал потреблять столько энергии, что уровень заряда тут же снова падал ниже критического, и планшет отключался. Часа два я держал его на зарядке и надеялся, что это как-то решится. А потом пришлось прибегнуть к хитрости: вскрыть планшет и отключить экран вообще. Физически вынуть шлейф из разьема. Я не верил, что это даст результат, и ожидал, что все, планшет придется признать сдохшим, но, к огромному моему удивлению, это сработало! Но увы, в процессе вскрытия случилась другая неприятность: отломились провода от динамика, который приклеен к задней крышке. Так что устройство теперь в вечном беззвучном режиме. Потом ещё удалил с него KingRoot (весьма вредная утилита, которая кроме основной задачи — получения root-прав, пытается делать кучу ненужного: то систему оптимизировать, то рекламу на экране блокировки показывать).

Неприятности продолжаются

4X_Pro

В пятницу забил на все, и на какой-то момент показалось, что жизнь улучшилась. А сегодня опять все плохо! Какое-то непонятное сочетание усталости и злости на все вокруг без видимых причин. И опять все из рук валится. На CodinGame сыграл несколько clashей. Сначала все было хорошо, поднялся с 95 до 74 места. А потом сначала затупил на одной задаче по реверсу, а потом прилетела неадекватно сложная задача в shortest mode, которую даже просто за 15 решить сложно, не говоря уж об оптимизации. И тут же свалился обратно на 94-ое, аннулировав тем самым все достигнутое.
Да еще отец достает ерундой разной. Хочется звуконепроницаемую дверь с двумя замками как минимум в комнату поставить!
Зато от злости наконец-то принял решение удалить Ask. А то в последнее время там доля нормальных вопросов упала до 20%, если не меньше, остальное — полнейший дебилизм. Да и криво работающие уведомления в приложении тоже давно уже доставали.
В общем, нужно уходить в спячку до конца декабря!

Осенние проблемы и неприятности

4X_Pro

Наступила настоящая осень с серыми и мрачными днями, и это тут же сказалось на настроении. Раздражает все! В частности, то, что вчера, несмотря на то, что хотел наладить режим и выключить компьютер в 3:10, засиделся в Сети до 3:45, а спать лег каким-то образом все равно в 5 ночи. Тем не менее, сегодня заставил себя встать в 11:15, и теперь все валится из рук.
Еще опять посыпались проблемы. Всего пару дней назад я думал, что все, столкнул очередную freelance-задачу и теперь свободен, и уже почти было собрался прожить месяц в режиме «в Интернет только с МЦК», но тут посыпались неприятности. Сначала попытались подкинуть еще одну задачу, потом по завершенной задаче вылезло несколько мелких, но очень противных доработок. А потом вдруг написал один мой давний знакомый, с которым мы пытались сделать одну доработку его сайта в январе, но дело забуксовало, а теперь он о нем вспомнил.
А самое главное, что голова совсем не соображает, и поэтому ничего не могу делать: осенняя погода давит на психику. Весной или летом бы я все то же самое воспринял бы как мелкие неприятности, да и только. А сейчас все кажется мрачным и беспросветным. Причем вот что забавно: раньше я от жизненных неприятностей пытался убежать в Сеть, а сейчас ситуация меняется на обратную: хочу спрятаться в оффлайне, от всяких наведенных «надо», идущих из Сети.

Две прогулки: Кусково и Пресня

4X_Pro

Вчера отправился на длинную прогулку в Кусково. Как обычно, вышел из дома позже, чем хотел, где-то после 16 часов. Зато дошел до моста из Новогиреево в Кусково как раз в тот момент, когда закатное солнце отражается в рельсах железной дороги, проходящей под мостом, создавая удивительную игру света. И даже удалось это сфотографировать! Помнится, года два я собирался это сделать, и вот получилось. Правда, фотография все равно не передает полноту впечатлений.
А когда я дошел до Большого Дворцового пруда, уже начало темнеть. Я немного посидел на берегу. Подумал о том, что вот, какой уже раз прихожу сюда с мыслью «нужно бросить все и начать настоящую жизнь», где будет больше прогулок и впечатлений, а внимание не будет постоянно расфокусировано Интернетом. С другой стороны, также хочется заняться капитально своим сайтом и сайтовым движком. Но потом возвращаюсь домой и все снова получатся как обычно: поток жизни захватывает меня и тащит неизвестно куда.
Потом я еще прогулялся вдоль дальнего берега пруда и канала, а затем отправлся домой. Перехода по мостику над ж/д станцией Кусково нашел забавную надпись: «Народ проснись!» и ответ другим цветом и шрифтом: «Еще пять минуточек!». Сфотографировал ее и выложил в Instagram.
Сегодня с Tellой отправились в парк Красная Пресня. Туда собирались съездить очень давно, еще то ли с весны, то ли даже с прошлого года, но все никак не складывалось. Парк очень небольшой, но в целом произвел хорошее впечатление, несмотря на то, что некоторые его части сейчас отгорожены забором и недоступны. Необычен он прудом, который в нем имеется: по сути дела, это даже не пруд, а достаточно широкий канал необычной формы с несколькими мостами. В канале плавало немало уток, которые при виде нас сначала оживились, но когда поняли, что еды не будет, утратили к нам всякий интерес. Еще запомнилась необычная подсветка и вид на башни Москва-Сити, верхняя часть которых исчезала где-то в тумане. Еще был момент, когда чуть не поругались с Tellой из-за того, что она затронула неприятную для меня тему, а я на это резко отреагировал фразой «фильтруй базар!».
На обратном пути попали под холодный и неприятный дождь. А сейчас я в каком-то странном состоянии, и весь остаток дня ни на чем не могу сосредоточиться…

CodinGame: конкурс A*Craft завершился

4X_Pro

Сегодня закончился конкурс A*Craft на CodinGame. В отличие от предыдущих, он длился всего два с половиной дня и был не на игры, а на оптимизацию: нужно было расставить стрелки на карте так, чтобы сделать суммарный путь роботов по ней максимальным. Я занял 150-ое место из 2456! (Правда, примерно последние 500 участников — те, кто зарегистрировался, но даже не попытался прислать хоть какой-то код, и поэтому получившие 0 очков.) Это гораздо лучший показатель, чем во всех предыдущих конкурсах. Если считать в относительных показателях, то до этого мне максимум удавалось подняться до 84%, а в этот раз — до 93%, что близко к моему верхнему порогу амбициозности!
И это несмотря на то, что толком на конкурс не настроился, и до воскресенья подходил к нему как-то лениво. Впрочем, задачи по оптимизации даются мне проще сами по себе. Кроме того, код был основан примерно на том же рекурсивном алгоритме, который я впервые пытался применить еще в Code of Ctulu. Написал я его достаточно быстро, но потом обнаружился какой-то совершенно непонятный баг, на борьбу с которым ушла половина воскресенья. А причина оказалась банальной: я дважды использовал одно и то же имя result в одной функции, но подразумевая при этом две совершенно разных переменных: одну для поиска максимума, вторую — для хранения значения, которое будет возвращено из функции. В результате вместо максимума возвращался последний результат.
Из-за этого я только вечером воскресенья обнаружил, что хотя алгоритм хорошо справляется с картами из узких длинных коридоров, но дает довольно посредственные результаты на картах с большими смежными областями. Для таких карт я задумал было еще один алгоритм с совершенно другим подходом, но так его и не реализовал. Во-первых, не хватало времени, чтобы тщательно его обдумать и вытащить из зоны неуверенности. Во-вторых, нашел один случай, когда первый алгоритм (который рекурсивный) давал неоптимальный результат. Сначала казалось, что ошибка простая и ее удастся устранить быстро. Но все оказалось не так: я провозился с ней до глубокой ночи. А потом выяснилось, что ошибка действительно примитивная: я забываю вызвать .copy() при рекурсивном вызове функции, в результате чего вместо копии карты для поиска на следующем шаге передается ее исходный вариант и результаты поиска пути в разных направлениях начинают влиять друг на друга. Странно, что на остальных картах это работало! Причем выяснилось, что если на каждом шаге создавать копию карты, это занимает много времени, и в итоге на многих тестах начинается вылет по таймауту. Пришлось применить «костыльное» решение: написать условие, по которому принимается решение, делать копию или нет.
Поэтому вместо второго алгоритма сделал простую проверку: если карта с большими смежными областями, и роботов много, то для последних строить путь только до ближайшей уже размещенной стрелки. И, как это ни странно, это дало определенный результат: вместо 5400 очков, которые я набирал изначально, стало получаться 5700! А вот исправление того бага с копией дало всего лишь жалких 17 очков (впрочем, их оказалось достаточно, чтобы подняться еще на несколько мест).
Но вообще, наверное, надо было писать не на Python, а на PHP. Там и код быстрее выполняется (если в PHP 7), и копии массивов создаются автоматически (так что я бы не возился полдня с первым багом и, может быть, успел бы и второй алгоритм реализовать), причем в режиме copy-on-write, что тоже дало бы неплохую оптимизацию. Но увы, нельзя применять в качестве ключей для хеша связки из нескольких значений (то, что в Python называется tuples). Впрочем, при желании это можно было бы легко обойти.
Но в любом случае, я доволен результатом!

Почти выздоровел

4X_Pro

Наконец-то выздоровел. Причем сегодня еще сумел встать раньше 11 часов, впервые за последние два месяца, и застать момент, когда солнце еще заходит в окно моей комнаты. Все же утро создает совсем другое настроение!
Еще задумался, что в последнее время живу в каком-то совершенно расхлябанном режиме: день проходит за днем без каких-либо четких целей. И никак не могу понять, что это: то ли обретение той самой свободы и жизни без забот, о которой я мечтал в 2000-х годах, то ли я сорвался с жизненных рельс и лечу куда-то в пропасть, и кончится все это плохо.
Пожалуй, только вчерашний день был некоторым исключением: я отключил Интернет на ноутбуке, что дало возможность написать две заметки: про взросление, и про то, как импортировать контакты со старого мобильника по Bluetooth. Но на это ушел почти весь день: закончил я где-то в 22 часа, потом даже на CodinGame не успел зайти.
В общем, все больше и больше задумываюсь, что все же надо перейти на режим жизни «в Интернет — только из метро». Так как при включенном Интернете время летит вообще вникуда, и ни на чем толком сосредоточиться не получается.

Болею

4X_Pro

В субботу меня угораздило заболеть. Как обычно, из-за сквозняков, которые возникли из-за постоянно открытого окна из-за слишком теплой погоды. (Из-за этого даже задумался, есть ли возможность сделать принудительную вентиляцию в квартире так, чтобы можно было держать окна закрытыми.) Причем если обычно в таких случаях я болтаюсь на грани между болен и здоров, то в этот раз разболелся всерьез. В субботу был сильный насморк, а вчера полезла вверх температура, и, судя по всему, шел какой-то воспалительный процесс. Сегодня, наоборот, чувство какого-то внутреннего холода. Из-за этого вчера почти весь день прошел мимо. Да и сегодня тоже как-то ни на чем не могу сосредоточиться.
А еще разозлила некая Эвелина Странная, зачем-то зашедшая на мою страницу ВК. Она считает себя ЛИИ-ЛВЭФ, но при этом озвучивает гаммийско-ускорительские позиции, аналогичные тем, которое в свое время высказывала Harriet Specter aka HH. Терпеть не могу подобное! И теперь думаю, что сделать: забанить сразу или промолчать, в надежде, что сама сбежит.

Отличный день

4X_Pro

На удивление сегодня получился отличный день! Проспал очень допоздна, а встав, долго думал, что лучше сделать — досмотреть вебинар про протокол IPv6 или отправиться на прогулку в Измайловский парк. В итоге решил, что погода может поменяться, а вебинар никуда не денется, и выбрал второе. Решил дойти до острова на Серебряно-Виноградном пруде, на котором не бывал со злополучного 2013 года. В парке замечательно! Золотая осень в самом разгаре. Сделал по дороге несколько фотографий деревьев, потом — поснимал на самом острове. Обратно тоже решил идти пешком, в результате в сумме прошагал целых 12 км, в результате чего довольно ощутимо устал.
Вечером объяснял отцу, который купил новый телефон, как пользоваться Android и перенес ему контакты со старого. (Кстати, сделать это оказалось не так-то просто.) Потом прошел несколько Clash of Code и поднялся с 127 до 61 места. Причем очень легко, голова соображала просто супер! Затем поиграл в World of Tanks и выполнил дневную норму в 5 безошибочных заездов на Клавогонках.
Не успел только две вещи: досмотреть-таки этот вебинар, и написать пару заметок в другие разделы своего мультиблога (уже который раз это откладываю).


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

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