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

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


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

t.me/4x_pro

Лог жизни

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


Sitemap для личного сайта

4X_Pro
Сегодня как-то сама собой возникла идея устроить себе день информационной разгрузки. И утром, загрузив компьютер, я сразу же отключил сетевой интерфейс, и стал думать, чем займусь. Дело нашлось быстро: уже недели две я раздумывал о том, что надо бы сделать генератор Sitemap для форумного движка. К тому же об этом постоянно напоминал Яндекс.Webmaster. (Забавно: я-то думал, что Sitemap — это пережиток прошлого, и сейчас, в эпоху нормальных URL, поисковики прекрасно обходятся без него, но оказалось, нет.) Но все никак не получалось сосредоточиться: когда включен Интернет, постоянно что-то отвлекает.
Теперь же я довольно быстро сделал его основную часть, которая генерировала список URL форума, и повесил ее на планировщик задач. Но дальше столкнулся с двумя проблемами. Во-первых, в стандарте Sitemap есть ограничение на 50000 URLов в одном файле, что для форума не такая уж большая цифра. Но сложность в том, что узнать их количество можно только тогда, когда уже все сгенерированы. И я долго не знал, что с этим делать. А во-вторых, URLы в Sitemap должны быть полными (интересно, чем вызвано столь странное решение?) планировщик может выполняться через системный crontab, то есть в режиме CLI, и в этом случае он просто не знает домена и пути к сайту. (А в настройках я его принципиально не храню.)
После недолгих раздумий нашлось достаточно красивое решение: генерирую все URL в один временный файл  с относительными путями через планировщик, а в еще один сохраняю их общее количество. И отдельно кладу в каталог www скрипт sitemap.php, который считает, какое число Sitemap-файлов нужно для отображения всех этих URL и отдает либо список этих файлов, либо нужную часть URL. Но, как всегда, доделав это, остановиться не мог, и остаток ночи провозился с мелкими доработками сайта: добавил еще немного микроразметки, нашел и исправил несколько мелких ошибок в HTML-коде. И сейчас с удивлением обнаружил, что опять засиделся до 5 утра.
А еще выяснил, что Socionics.Me в Яндексе поднялся до 4—5 места по запросу «соционический форум» (и подвинул Зверофорум, о чем мечтал в далеком 2006 году) и вернулся на 10-е по «соционическим знакомствам», но толку от этого почти нет: число запросов по данным Wordstat составляет 100 и 300 показов в месяц.

Неэффективный день мелких неприятностей

4X_Pro
На какие уловки иногда идет бессознательное, чтобы не завершать день! Вчера около трех часов ночи вдруг задался вопросом: можно ли в Windows 10 отключить «плитки» и какой эффект это даст в плане производительности. В результате нашел видео, где рассказывалось, как это сделать, и давалось еще пара советов. Решил попробовать на старом стационарном компьютере, который до этого за весь год включал два раза. Итог: сидел и возился с оптимизацией до 6 утра, а потом еще и сегодня днем продолжил.
Правда, результат особо не порадовал: все равно работает тяжеловато, особенно в первую минуту после загрузки. Да и время загрузки изменилось очень несущественно. Пожалуй, единственный плюс — удалось убрать lock screen, который меня бесил с самого момента своего появления: ну почему для того, чтобы ввести пароль, нужно сначала щелкнуть мышкой, да еще и дождаться смены картинки? Почему нельзя показать ввода поле сразу? Ну и заметку про сделанную оптимизацию написал.
Еще кучу времени убил на установку обновлений. Они сначала ставились, а после перезагрузки откатывались обратно. Видимо, пытались удалить старые версии чего-то там, но не могли, так как не сохранились установочные файлы этих старых версий. В общем, еще раз убедился, что правильно сделал, что перешел под Linux. На том же самом компьютере интерфейс там гораздо легче и отзывчивее… Да и если с обновлениями что-то пойдет не так, легко понять, что именно и поправить вручную. А Windows даже никаких сообщений об ошибке не выдает нормально, по которым можно было понять, что не так! (Пожалуй, именно это я и всегда считал его главным недостатком.)
Под вечер решил зайти на Wikium, чтобы не нарушать цепь непрерывных тренировок. Лучше бы я этого не делал! То ли недосып сказался, то ли весь день работы под грохот системного блока вместо почти бесшумного ноутбука (интересно, как я раньше такое выдерживал), но подтормаживал я ощутимо, и в ряде случаев просто не мог сосредоточиться. Итог — ощутимо просадил главный показатель — Индекс Производительности, даже несмотря на то, что в паре тренажеров, наоборот, поставил рекорды. И это очень сильно демотивировало заниматься дальше… Знал бы такое дело, вообще не стал бы сегодня ничего делать. Эх, и почему нет возможности вычеркивать плохие результаты? И не только в Wikium или Clash of Code, но и в жизни вообще?

Странный сон

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

Зависимость от солнечного света

4X_Pro
Все-таки насколько я зависим от солнечного света! Два дня (во вторник и среду) была хорошая погода, и уровень активности был высокий, и настроение на подъеме, хотелось что-то делать. Потом погода поменялась, и уровень активности тоже пошел на спад. Но по закону мировой подлости, опять много пишут и чего-то от меня хотят. У меня же наоборот, желание уйти в спячку и стать недоступным, чтобы все отстали.
Впрочем, этот спад активности касается именно желания общаться. Cо всякими CodinGame, Wikium и Клавогонками все в порядке, и времени уделяю им достаточно. Только вот на Wikium небольшой облом: первые несколько дней показывался результат относительно других людей, а теперь перестал, вместо этого навязчиво предлагают перейти на Премиум. Еще пытался дописать заметку для личного сайта про избыточный выбор и сделать для него же генератор Sitemap, но не получалось от слова совсем: бессознательное просто переключает мое внимание. В частности, сегодня полдня зачем-то просидел на Хабре.

Babylon Tower — достижение взято

4X_Pro
Вчера после долгих поисков нашел на CodinGame задачу, которую легко можно было решить с помощью bash-скрипта. Все-таки сколько я, оказывается, о bash не знаю! В частности, не знал, что там можно использовать массивы, правда, с крайне неудобным синтаксисом. Потом тут же решил легкую задачку на C++ (заодно понял, что ощутим его подзабыл, в отличие от чистого C, на котором хотя бы иногда что-то пишу). В результате до достижения Babylon Tower, которое дают за решение задач на 15 разных языках программирования, осталось использовать всего один язык программирования. Им, как и планировалось, стал Kotlin, изучением которого я хотел заняться уже давно, но, как всегда, бессознательное протестовало против планов, поэтому вместо него стал писать на Lua и Ruby.
Требовалось решить задачу, которая сначала казалась предельно простой: найти минимальное N при котором a^N оказывается меньше N!. Казалось бы, достаточно пройтись циклом, и решение будет найдено. Но я не учел одного: того, что тесты для решения содержали весьма большие числа (такие,что N уходил за тысячу). И для подсчета «в лоб» попросту не хватало разрядности чисел (тем более в Kotlin, как и в Java, максимальная разрядность для чисел с плавающей точкой — 64 бита, а не 80).
Пришлось включать мозг и искать обходное решение. Оно нашлось довольно быстро. Сначала я решил попытаться получить результат через аппроксимацию факториала. Но увы, аппроксимация есть аппроксимация: N находилось с точностью до нескольких соседних чисел. По сути дела, ее можно было использовать как верхнюю оценку N, и дальше уменьшать его, проверяя выполнение неравенства на каждом шаге. Но как проверить неравенство, если и справа и слева значение вылезает за пределы допустимого? Поломав голову, вспомнил совет, когда-то давно виденный на Хабре: работать не с самими числами, а с их логарифмами. Тут я сообразил, что нужно взять логарифм от факториала можно посчитать как сумму логарифмов отдельных множителей. А с другой частью — все и того проще: N*ln(A).
Как только я это реализовал, программа тут же заработала как надо, и я получил долгожданное достижение Babylon Tower (впервые о нем я начал думать еще с лета, если не раньше).

Изменение в себе: обесценивание сделанного самостоятельно

4X_Pro
Ночью осознал одно интересное изменение в себе. Раньше, видя какой-нибудь простой, но полезный онлайн-инструмент, типа кодирования/раскодирования base64 или Punycode, калькулятора хеша, генератора паролей и т.п., я думал «надо бы и у себя такой сделать». И потом, если делал, гордился тем фактом, что могу пользоваться своим, а не чужим. Сейчас же реакция совершенно противоположная: «ну вот, такое уже есть, смысла нет делать что-то аналогичное, все равно там посетителей будет больше». А если и сделать, то все равно особого повода для гордости от того, что теперь есть свое, не будет. Не знаю почему, но как-то в моем восприятии сам факт возможности сделать что-то самому (равно как и владеть потом этим) обесценился почти до нуля.
Пожалуй, это самое худшее изменение в себе за последние 10 лет. И многие мои нынешние проблемы им и вызваны.

Бестолковый день

4X_Pro
Опять чувствую растерянность в жизни. Возможно, из-за отсутствия четких целей, когда хочу заниматься одним, надо заниматься другим, а по факту — занимаюсь третьим. В частности, сегодня учудил Р.Л. У него вдруг стал медленнее работать сайт. Сначала он пытался оптимизировать картинки товаров, но из-за того, что мы не учли то, что их перегенерация вызовет скачок нагрузки на сервер, получилось еще хуже: часть их них стала просто недоступна с ошибкой 503. Пока я думал, что к чему, и что с этим делать, он успел взять и откатить сайт до ночного backupа, отменив тем самым результаты своей оптимизации. Но даже это не помогло: сайт все равно продолжал подтормаживать, а некоторые картинки — не отображаться.
Из переписки с техподдержкой мы узнали, что проблема в том, что картинки с параметром отдаются не nginxом, а передаются на обработку Apache, число процессов которого на хостинге весьма жестко лимитировано. Пришлось срочно придумывать, как избавиться от этого параметра (в нем передавался token для генерации уменьшенной картинки) так, чтобы не пострадала безопасность. Но зато результат порадовал: сайт с кучей картинок и тяжелых скриптов без кеша стал грузиться всего за 3.1 секунду! Правда, тут еще сказывается, что хостинг недавно наконец-то сделал поддержку HTTP/2. Но вот загружать оптимизированные картинки Р.Л. придется теперь заново.
Потом я занялся доработкой своего алгоритма для Code vs Zombies на CodinGame. Реализовал две идеи, но одна из них себя в целом не оправдала. На паре карт она позволяла спасти больше людей, но на остальных результат становился только хуже, и итоговый показатель был на 2000 очков меньше примерно. Пришлось от нее пока отказаться, и попробовать другую — поправить алгоритм так, чтобы игрок уничтожал зомби не последовательно, одного за другим, а старался накрыть одним ходом несколько (за это дается существенный бонус). Отчасти получилось, но результат оказался меньше ожидамого: ~56000 вместо 50600 и подъем в рейтинге примерно на сотню позиций. В общем, рост есть, прорыва нет. И вообще, видимо, надо пока переключиться на другие игры, так как тут пока больше идей нет, что еще можно попробовать.
А вообще, конечно, чувствую, как мне не хватает знаний именно по чисто математическим алгоритмам типа проверки принадлежности точки многоугольнику или пересечения двух отрезков.
Сегодня ночью наткнулся на очередной сайт по тренировке внимания, памяти и интеллекта — Wikium. Но если все предыдущие были почти полностью платными, тут вроде по одной из трех программ можно тренироваться бесплатно. (Впрочем, ничто не мешает сделать несколько аккаунтов.)

Совместная прогулка с 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-прав, пытается делать кучу ненужного: то систему оптимизировать, то рекламу на экране блокировки показывать).

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

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