Какой-то очень дурной и бестолковый день. Вроде бы ничего плохого не происходило, но все из рук валится. То ли погода влияет, то ли интеллектуальный спад по биоритмам, то ли еще что — не знаю. Вернулся сегодня на Клавогонки, и получилось вот что: печатаю быстро, но очень «грязно» даже по своим меркам. В смысле, очень много опечаток, причем, порой очень нелепых. За исключением самого первого заезда, никак не мог поймать ритм, в котором удается печатать чисто. Потом отец вывел из себя, начав «под руку» рассказывать какую-то хрень, связанную с футболом. Как всегда бывает при попытках слушать и печатать одновременно, тут же заболела голова. Ну не совместимые это действия!
Потом пошел на CodinGame, хотел снова попробовать Clash of Code, но из этого тоже ничего хорошего не вышло: два раза из трех просто не успел решить задачи. Точнее, решить-то успевал, но не успевал отформатировать вывод. А время пролетало очень быстро. Видимо, скорость мышления слишком замедлилась.
А еще начался какой-то поток полнейшей тупости на Ask. Прямо хоть каждый второй вопрос в мусорку отправляй. Видимо, у кого-то из анонимов тоже спад умственной активности.
Был в Сети 15 дек. 2024 г., 00:24
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Специализируюсь на ускорении загрузки сайтов и разработке ботов для Telegram. Linuxоид (использую Debian+LXDE). Сторонник IndieWeb, slow lifer.
- Перово, Москва, Россия
- me@4xpro.ru
- x4_pro
- XXXXPro
Новости сайта в Telegram
t.me/4x_proЛог жизни
Лог моей жизни, где я фиксирую наиболее эмоционально значимые для меня события и текущее настроение. Является продолжением блога, который я вел в ЖЖ с ноября 2004 по апрель 2018 года.
Шашлычная встреча в Перово
На прошлой неделе на связь со мной вышел С.Ш. (тот самый, который написал книгу) и пригласил на шашлычную встречу, которую он задумал провести возле Большого Перовского пруда. Я некоторое время колебался, но потом согласился. Но потом одна из участниц, которая взялась готовить, решила, что деньги нужно собрать заранее, и перевести ей на карту Сбербанка. Я был против этого: во-первых, Сбербанк засвечивает имя при переводе, что для меня неприемлемо, во-вторых, перевод денег заранее лишал меня возможности принять решение идти/не идти вечером предыдущего дня, как это я обычно делаю. В итоге чуть было не отказался от встречи вообще, но С.Ш. предложил мне такой вариант: он переводит деньги за меня, я отдаю ему наличными. Я согласился.
И вот сегодня отправился на эту встречу. Сначала все же думал «а не зря ли я иду». Пруд этот ничем не примечателен, плюс явно предназначенных мест для шашлыка там нет, в отличие от Измайловского парка и Кусково. Начиналось все вполне обыденно: встретились у метро, дождались всех остальных, отправились на место. Но народ шел как-то на удивление медленно, и мы с С.Ш. сильно ото всех оторвались вперед. Плюс я еще думал идти к этому пруду по Перовской улице, а С.Ш. и Н.П. решили по Кусковской. Из-за этого мы с С.Ш. отделились от остальных. В итоге они пошли дозакупать то, что еще осталось (хотя большую часть всего принесли с собой, кроме угля и воды), а мы — к пруду занимать место. Место выбрали довольно быстро. Но потом пришла Н.П. и уговорила всех сместиться чуть правее (впрочем, я сам сначала тоже там разместиться планировал, но потом передумал, так как слишком близко к другим людям получалось).
И тут возникла первая проблема: тот человек, который обещал принести мангал, к этому времени еще не приехал, и было известно, что приедет не скоро. Но тут А.Ш. проявил свою черную интуицию (хоть он сам себя и белым интуитом считает). Он решил, что если возле этого пруда часто жарят шашлыки, то высок шанс найти кем-то брошенный мангал. К огромному удивлению всех, он оказался прав, и буквально через несколько минут мангал у нас был! Мы с ним начали разводить огонь. Почему-то угли разгорались ну очень плохо, я потратил полгазеты, прежде чем удалось добиться результата. В это время несколько человек, включая С.Ш., ушли куда-то с неизвестной целью, и нас осталось всего шестеро. Мы стали жарить первую порцию курицы. В это время стало видно, что с юго-запада идет очень темная туча, и скорее всего, будет дождь (а еще МЧС все прислал по SMSке, а некоторым и не одну). Стало ясно, что нужно что-то делать. Мы стали перетаскивать вещи еще правее, под более густые деревья, в надежде, что они хоть как-то защитят от дождя. Сумели перенести даже горящий мангал. Правда, переноска сказалась на нем плохо, и через пару минут после приземления он все же развалился. Но тут приехал тот самый человек, который обещал привезти мангал и тент. Надо сказать, очень вовремя! Еще он привез лопатку, с помощью которой мы все угли смогли перебросить в новый мангал. Потом растягивали тент. Это была целая история! Возились минут 10, причем почти все как-то укрылись под тентом, а А.Ш. влез на дерево, чтобы крепить тент оттуда, и мок под дождем, а Н.П. чуть не унесло ветром, так как тент сильно парусил.
И почти сразу, как закончили со всем этим делом, дождь прекратился! Немного поели и сели играть. Разделились на три группы: одна группа (к которой присоединился и я) играла в японский Бенг и Карту Сокровищ, другая — в alias (или что-то подобное), третья — в Манчкин. В Карту Сокровищ я играл впервые, и очень понравилось, несмотря на то, что так и ни разу не получилось занять первое место. Постоянно получалось так, что ходы с отличными результатами чредовались с нулевыми ходами, или же лишался самых ценных карт стараниями других игроков. В Бенг первый раунд сыграли отлично, а во втором я был ронином. Помня о предыдущем опыте, не стал сразу себя выдавать где-то до середины игры, в результате чего меня долго принимали за ниндзя. Да еще и карты шли отличные. Но ближе к концу ситуация поменялась: и хорошие карты закончились, и ниндзя стали выигрывать с огромным отрывом, и пришлось себя выдать, начав атаковать их. Плюс еще на одном ходу сыграл не так, как надо было. Потом снова занялся шашлыком, увидев, что его постаивли жариться, но никто за ним толком не следит. В какой-то момент досыпал угля, и казалось, что все потухло, но несколько минут усиленного раздувания дали свой результат: удалось обойтись без повторного розжига.
Потом просто много разговаривали. Пообщался с человеком, который выступил в роли редактора для книги С.Ш. Еще с одним человеком чуть было не проугался довольно серьезно. Он заявил, что в СССР науки не было вообще, аргументируя это тем, что почти все советские НИИ после развала Союза тут же накрылись. Я ему пытался объяснить, что это не потому что там наука плохая, а потому что люди, привыкшие к госфинансированию, не имеют ни малейшего представления о том, как продавать результаты своего труда в условиях рынка (да еще и не просто рынка, а весьма специфических условий 90-х, где никто не думал о долгосрочном развитии). Он эти мои аргументы назвал бредом. Но без толку. Впрочем, там к спору подключился еще один участник, и вскоре стало ясно, что у первого спорщика вообще о науке весьма своеобразные представления (а еще возникло подозрение, что он, похоже, 3Л по психософии). В итоге спор достаточно быстро съехал на тему, возможна ли наука без математики, и я довольно быстро потерял к этому интерес.
Так досидели где-то часов до 23, несмотря на то, что я ожидал, что разойдемся раньше. Но в итоге я остался очень доволен встречей! Вполне можно сказать, что день прошел не зря!
И вот сегодня отправился на эту встречу. Сначала все же думал «а не зря ли я иду». Пруд этот ничем не примечателен, плюс явно предназначенных мест для шашлыка там нет, в отличие от Измайловского парка и Кусково. Начиналось все вполне обыденно: встретились у метро, дождались всех остальных, отправились на место. Но народ шел как-то на удивление медленно, и мы с С.Ш. сильно ото всех оторвались вперед. Плюс я еще думал идти к этому пруду по Перовской улице, а С.Ш. и Н.П. решили по Кусковской. Из-за этого мы с С.Ш. отделились от остальных. В итоге они пошли дозакупать то, что еще осталось (хотя большую часть всего принесли с собой, кроме угля и воды), а мы — к пруду занимать место. Место выбрали довольно быстро. Но потом пришла Н.П. и уговорила всех сместиться чуть правее (впрочем, я сам сначала тоже там разместиться планировал, но потом передумал, так как слишком близко к другим людям получалось).
И тут возникла первая проблема: тот человек, который обещал принести мангал, к этому времени еще не приехал, и было известно, что приедет не скоро. Но тут А.Ш. проявил свою черную интуицию (хоть он сам себя и белым интуитом считает). Он решил, что если возле этого пруда часто жарят шашлыки, то высок шанс найти кем-то брошенный мангал. К огромному удивлению всех, он оказался прав, и буквально через несколько минут мангал у нас был! Мы с ним начали разводить огонь. Почему-то угли разгорались ну очень плохо, я потратил полгазеты, прежде чем удалось добиться результата. В это время несколько человек, включая С.Ш., ушли куда-то с неизвестной целью, и нас осталось всего шестеро. Мы стали жарить первую порцию курицы. В это время стало видно, что с юго-запада идет очень темная туча, и скорее всего, будет дождь (а еще МЧС все прислал по SMSке, а некоторым и не одну). Стало ясно, что нужно что-то делать. Мы стали перетаскивать вещи еще правее, под более густые деревья, в надежде, что они хоть как-то защитят от дождя. Сумели перенести даже горящий мангал. Правда, переноска сказалась на нем плохо, и через пару минут после приземления он все же развалился. Но тут приехал тот самый человек, который обещал привезти мангал и тент. Надо сказать, очень вовремя! Еще он привез лопатку, с помощью которой мы все угли смогли перебросить в новый мангал. Потом растягивали тент. Это была целая история! Возились минут 10, причем почти все как-то укрылись под тентом, а А.Ш. влез на дерево, чтобы крепить тент оттуда, и мок под дождем, а Н.П. чуть не унесло ветром, так как тент сильно парусил.
И почти сразу, как закончили со всем этим делом, дождь прекратился! Немного поели и сели играть. Разделились на три группы: одна группа (к которой присоединился и я) играла в японский Бенг и Карту Сокровищ, другая — в alias (или что-то подобное), третья — в Манчкин. В Карту Сокровищ я играл впервые, и очень понравилось, несмотря на то, что так и ни разу не получилось занять первое место. Постоянно получалось так, что ходы с отличными результатами чредовались с нулевыми ходами, или же лишался самых ценных карт стараниями других игроков. В Бенг первый раунд сыграли отлично, а во втором я был ронином. Помня о предыдущем опыте, не стал сразу себя выдавать где-то до середины игры, в результате чего меня долго принимали за ниндзя. Да еще и карты шли отличные. Но ближе к концу ситуация поменялась: и хорошие карты закончились, и ниндзя стали выигрывать с огромным отрывом, и пришлось себя выдать, начав атаковать их. Плюс еще на одном ходу сыграл не так, как надо было. Потом снова занялся шашлыком, увидев, что его постаивли жариться, но никто за ним толком не следит. В какой-то момент досыпал угля, и казалось, что все потухло, но несколько минут усиленного раздувания дали свой результат: удалось обойтись без повторного розжига.
Потом просто много разговаривали. Пообщался с человеком, который выступил в роли редактора для книги С.Ш. Еще с одним человеком чуть было не проугался довольно серьезно. Он заявил, что в СССР науки не было вообще, аргументируя это тем, что почти все советские НИИ после развала Союза тут же накрылись. Я ему пытался объяснить, что это не потому что там наука плохая, а потому что люди, привыкшие к госфинансированию, не имеют ни малейшего представления о том, как продавать результаты своего труда в условиях рынка (да еще и не просто рынка, а весьма специфических условий 90-х, где никто не думал о долгосрочном развитии). Он эти мои аргументы назвал бредом. Но без толку. Впрочем, там к спору подключился еще один участник, и вскоре стало ясно, что у первого спорщика вообще о науке весьма своеобразные представления (а еще возникло подозрение, что он, похоже, 3Л по психософии). В итоге спор достаточно быстро съехал на тему, возможна ли наука без математики, и я довольно быстро потерял к этому интерес.
Так досидели где-то часов до 23, несмотря на то, что я ожидал, что разойдемся раньше. Но в итоге я остался очень доволен встречей! Вполне можно сказать, что день прошел не зря!
Возвращение и хорошие новости
Вчера, отоспавшись и немного придя в себя после переживаний по поводу конкурса, отправился собирать землянику на луг около Клязьмы. Но увы, как выяснилось, съездил напрасно: земляника то ли еще не созрела (а те несколько ягод, которые я нашел в лесу во время прошлой прогулки, были каким-то исключением), то ли уже созревшую обобрали в выходные. В результате вместо этого ограничился просто прогулкой в тот сосновый бор, о котором писал уже не раз.
А сегодня вернулся в Москву. Решил не повторять прошлый неудачный опыт, и ехать вечером. Впрочем, отчасти все же повторил: во-первых, чуть было не опоздал из-за того, что будильник отставал на 10 минут, но на этот раз я заметил еще тогда, когда до нужного времени оставалось еще почти 10 минут, чтобы собраться. Во-вторых, снова пронаблюдал отправление маршрутки из дальней части деревни, не успевая на нее. Только в этот раз я ее там увидеть совершенно не ожидал, поскольку раньше последняя заезжала туда в 12:54. Посмотрел расписание, и выяснил, что оно изменилось: теперь появилось две маршрутки вечером. Эта новость меня обрадовала: до той остановки шагать более чем на километр ближе!
В целом же добрался на удивление хорошо, всего за два с половиной часа, при этом успел на электричку на 10 минут раньше той, на которую собирался попасть изначально.
И вообще, прихожу к выводу, что ездить по вечерам все же лучше. Во-первых, проще успеть сделать что-то до выезда, чем потом настроиться на рабочий лад после него. Во-вторых, можно собраться спокойно и без спешки. Да и не так жарко.
А сегодня вернулся в Москву. Решил не повторять прошлый неудачный опыт, и ехать вечером. Впрочем, отчасти все же повторил: во-первых, чуть было не опоздал из-за того, что будильник отставал на 10 минут, но на этот раз я заметил еще тогда, когда до нужного времени оставалось еще почти 10 минут, чтобы собраться. Во-вторых, снова пронаблюдал отправление маршрутки из дальней части деревни, не успевая на нее. Только в этот раз я ее там увидеть совершенно не ожидал, поскольку раньше последняя заезжала туда в 12:54. Посмотрел расписание, и выяснил, что оно изменилось: теперь появилось две маршрутки вечером. Эта новость меня обрадовала: до той остановки шагать более чем на километр ближе!
В целом же добрался на удивление хорошо, всего за два с половиной часа, при этом успел на электричку на 10 минут раньше той, на которую собирался попасть изначально.
И вообще, прихожу к выводу, что ездить по вечерам все же лучше. Во-первых, проще успеть сделать что-то до выезда, чем потом настроиться на рабочий лад после него. Во-вторых, можно собраться спокойно и без спешки. Да и не так жарко.
Code of Ctulu: мои итоги очередного конкурса
В течение этого заезда на дачу почти все время я активно занимался программированием. Сначала я реализовал одну свою давнюю идею, о которой более подробно напишу через пару дней. А в среду зашел на CodinGame и увидел, что там идет очередной конкурс. Хотя к тому времени прошла уже половина отведенного времени (конкурсы длятся по десять дней обычно), я все же решил попробовать участвовать. Не столько даже ради рейтинга, сколько ради опыта.
Конкурс назывался Code of Ktulu. Сюжет задачи, которую предстояло решить, был такой: четверо исследователей проникли в лабиринт Ктулху и потревожили его сон. Ктулху стал посылать против них своих прислужников, вызывающих ужас и постепенно сводящих с ума. Цель заключалась в том, чтобы управляя одним из исследователей, продержаться дольше остальных. Но каких-либо способов активной борьбы с монстрами не предусмотрено, поэтому нужно было придумать алгоритм, который позволял как можно дольше убегать по лабиринту. При этом здоровье (точнее, величина, называемая sanity) там понемногу убывает при каждом ходе, но если держаться группой, то медленее, чем по одиночке.
На первый взгляд кажется, что решать такую задачу нужно с помощью алгоритмов, аналогичных шахматным: просчитывать возможные варианты развития событий на несколько ходов вперед, отсекая заведомо бесперспективные варианты, и затем выбирать лучший. И начал писать код. Но прежде я никогда ничем подобным не занимался, равно как и алгоритмами поиска путей в лабиринтах, поэтому на продумывание и написание программы ушло два дня. Только к пятнице я получил нечто законченное. Зашел на сайт, запустил, и вдруг обнаружил, что мой персонаж без видимых причин дохнет через несколько ходов. Сначала не мог понять, что происходит. Потом выяснилось, что там очень жесткие ограничения на время, за которое программа должна произвести расчет и дать ответ: секунда для первого хода и по 50 мс на все последующие. И мой алгоримт в это время просто не укладывался. Я попытался переделать расчеты так, чтобы они использовали библиотеку NumPY, в надежде, что это ускорит работу, но эффект был незначительный. В какой-то момент я заметался, не зная, что делать, так как перекладывать написанный алгоритм на C, Go или какой-то еще компилируемый язык не хотелось (да и не факт, что это помогло бы). Потом решил действовать иначе: сел и быстро, буквально за 15 минут, набросал другую программу, которая была гораздо примитивнее: она находила ближайшего монстра и строила маршрут, который позволял его обойти по самой длинной траектории.
Как это ни странно, такой простенькой программы хватило для того, чтобы сразу же проскочить все три «дубовые» лиги (Wooden league), и подняться примерно на сотое место из 280 в бронзовой. Но на этом его возможности были исчерпаны: при переходе в следующую лигу меняются правила, в частности, появился новый вид монстров с другим способом атаки, против которых этот алгоритм оказался неэффективен.
Что делать дальше, было непонятно. Но потом я вспомнил, как для другой игры использовал подход, который называю «гравитационным»: каждому объекту приписывается некое числовое значение, характеризующее желательность взаимодействия с ним, которое уменьшается с расстоянием, а дальше считается сумма воздействий на точку, где находится игрок, от всех объектов и происходит движение по градиенту. За субботу и начало воскресенья я сделал такой алгоритм. Но увы, когда запустил, ждало разочарование: сначала алгоритм показал даже худшие результаты, чем предыдущий — 170 место во все той же бронзовой лиге. Я стал разбираться, в чем дело. Обнаружил несколько глупых багов (например, путаницу координат x и y), а также то, что в пограничных ситуациях мой персонаж начинает метаться из стороны в сторону. Я там делал так, что выбор, куда идти, зависел от того, где находится ближайший монстр: если далеко, то идти к ближайшему глобальному максимум на карте, если ближе — искать локальный максимум в окрестности заданного размера (или величину, которая меньше него на значение не более N, но при этом находится ближе), если совсем близко — то выбирать клетку с наибольшим значением для следующего хода. Оказалось, что метания вызваны тем, что средний и последний варианты дают противоречивые результаты.
Где-то к 23 часам воскресенья я со всем этим более-менее разобрался. И вот после одного из запусков режима тестирования «все против всех в данной лиге», наступил момент когда мой алгоритм поднялся вроде бы на первое место, но увы, не удержался там, и когда все бои завершились, откатился где-то к первой десятке. Я начал играться с настройками некоторых параметров (например, радиусов, где применяются разные способы принятия решения), пытаться добавить мелкие доработки, но становилось только хуже: из первой десятки стал падать в первую сотню. Где-то часам к четырем я откатил все изменения, поизучал ситуации, в которых этот алгоритм проигрывает, и понял, что иногда он принимает решение идти «на таран» на монстра тогда, когда в этом нет никакой необходимости. Думать, как это исправить на уровне алгоритма, уже не было времени (конкурс заканчивался в 11 утра в понедельник), поэтому поступил так: взял тот предыдущий алгоритм избегания противника, и стал использовать его в тех случаях, когда у моего персонажа есть куда отступать (то есть нет окружения со всех сторон). Результаты улучшились: я стал устойчиво попадать на второе место в своей лиге. Но на первом месте там стоит бот, сделаный самими разработчиками игры, а условием прохода в следующую лигу являтся именно победа над ним. А вот этого никак и не получалось.
Каких-либо идей, что еще можно добработать за оставшиеся несколько часов, не было. Все, что оставалось делать — это играться с несколькими глобальными параметрами, например, радиусами, от которых зависит способ принятия решения или коэффициентом, который влиял на то, насколько алгоритму будет важно находиться рядом с другими игроками. Но увы, каждая проверка кода в режиме «все против всех» занимает достаточно большой промежуток времени (порядка 5—10 минут в зависимости от загруженности сервера). И где-то часам к шести я начал приходить к выводу, что все бесполезно, и уже собирался было идти спать. Но постоянно говорил себе «сейчас попробую еще вот такое сочетание показателей, и пойду». Но потом хотелось проверить другое сочетание, за ним еще одно, и так длилось примерно до 8 часов утра. Тогда, запустив в очередной раз просчет, я почти сразу обратил внимание, что результаты на этот раз вроде бы лучше: подъем в таблице идет быстрее. Когда было посчитано около 70% всех игр, я оказался на первом месте. Но такое случалось уже не первый раз, и я знал, что это бывает обманчиво. Так и вышло: когда расчет дошел где-то до 84-85%, я снова сполз на второе. В районе 90% снова началась серия побед, снова — первое место, но было понятно, что оно очень и очень непрочно. И вот до окончания расчетов оставалось всего 4 игры. Две из них заканчиваются поражениями (причем по-моему, на четвертом месте). Я ожидаю, что вот-вот в любую минуту упаду на вторую строчку таблицы, но нет, все еще первый. И остается еще две игры. И обе заканчиваются полной победой! Есть, есть серебрянная лига!
Дальше я дождался, когда определится моя позиция в серебряной лиге. В ней я казался примерно 230 место из примерно 570. На этом я и решил закончить, пойти отсыпаться и приходить в себя.
В общем, впечатление о конкурсе у меня двоякое. С одной стороны, это интересно, и заставляет пробовать новое и лучше изучать то, что уже знаю (так, например, сейчас бы я совершенно иначе сделал алгоритм расчета пути по лабиринту, и, скорее всего, не имел бы проблем с таймаутом), с другой — слишком уж затратно в эмоциональном и физическом плане. Кроме того, когда я занят конкурсом, начинают вставать другие дела (тот же freelance), что тоже несколько напрягает. Кроме того, я чуть было из-за этого конкурса не пропустил очередные задания КСИ. Еще прихожу к выводу, что мне имеет смысл поучаствовать в Clash of Code — программировании небольших задач на скорость на том же CodinGame, чтобы приучить себя не думать долго при написании кода и реже лазить в справочники по стандартным функциям, больше полагаться на свою память.
Конкурс назывался Code of Ktulu. Сюжет задачи, которую предстояло решить, был такой: четверо исследователей проникли в лабиринт Ктулху и потревожили его сон. Ктулху стал посылать против них своих прислужников, вызывающих ужас и постепенно сводящих с ума. Цель заключалась в том, чтобы управляя одним из исследователей, продержаться дольше остальных. Но каких-либо способов активной борьбы с монстрами не предусмотрено, поэтому нужно было придумать алгоритм, который позволял как можно дольше убегать по лабиринту. При этом здоровье (точнее, величина, называемая sanity) там понемногу убывает при каждом ходе, но если держаться группой, то медленее, чем по одиночке.
На первый взгляд кажется, что решать такую задачу нужно с помощью алгоритмов, аналогичных шахматным: просчитывать возможные варианты развития событий на несколько ходов вперед, отсекая заведомо бесперспективные варианты, и затем выбирать лучший. И начал писать код. Но прежде я никогда ничем подобным не занимался, равно как и алгоритмами поиска путей в лабиринтах, поэтому на продумывание и написание программы ушло два дня. Только к пятнице я получил нечто законченное. Зашел на сайт, запустил, и вдруг обнаружил, что мой персонаж без видимых причин дохнет через несколько ходов. Сначала не мог понять, что происходит. Потом выяснилось, что там очень жесткие ограничения на время, за которое программа должна произвести расчет и дать ответ: секунда для первого хода и по 50 мс на все последующие. И мой алгоримт в это время просто не укладывался. Я попытался переделать расчеты так, чтобы они использовали библиотеку NumPY, в надежде, что это ускорит работу, но эффект был незначительный. В какой-то момент я заметался, не зная, что делать, так как перекладывать написанный алгоритм на C, Go или какой-то еще компилируемый язык не хотелось (да и не факт, что это помогло бы). Потом решил действовать иначе: сел и быстро, буквально за 15 минут, набросал другую программу, которая была гораздо примитивнее: она находила ближайшего монстра и строила маршрут, который позволял его обойти по самой длинной траектории.
Как это ни странно, такой простенькой программы хватило для того, чтобы сразу же проскочить все три «дубовые» лиги (Wooden league), и подняться примерно на сотое место из 280 в бронзовой. Но на этом его возможности были исчерпаны: при переходе в следующую лигу меняются правила, в частности, появился новый вид монстров с другим способом атаки, против которых этот алгоритм оказался неэффективен.
Что делать дальше, было непонятно. Но потом я вспомнил, как для другой игры использовал подход, который называю «гравитационным»: каждому объекту приписывается некое числовое значение, характеризующее желательность взаимодействия с ним, которое уменьшается с расстоянием, а дальше считается сумма воздействий на точку, где находится игрок, от всех объектов и происходит движение по градиенту. За субботу и начало воскресенья я сделал такой алгоритм. Но увы, когда запустил, ждало разочарование: сначала алгоритм показал даже худшие результаты, чем предыдущий — 170 место во все той же бронзовой лиге. Я стал разбираться, в чем дело. Обнаружил несколько глупых багов (например, путаницу координат x и y), а также то, что в пограничных ситуациях мой персонаж начинает метаться из стороны в сторону. Я там делал так, что выбор, куда идти, зависел от того, где находится ближайший монстр: если далеко, то идти к ближайшему глобальному максимум на карте, если ближе — искать локальный максимум в окрестности заданного размера (или величину, которая меньше него на значение не более N, но при этом находится ближе), если совсем близко — то выбирать клетку с наибольшим значением для следующего хода. Оказалось, что метания вызваны тем, что средний и последний варианты дают противоречивые результаты.
Где-то к 23 часам воскресенья я со всем этим более-менее разобрался. И вот после одного из запусков режима тестирования «все против всех в данной лиге», наступил момент когда мой алгоритм поднялся вроде бы на первое место, но увы, не удержался там, и когда все бои завершились, откатился где-то к первой десятке. Я начал играться с настройками некоторых параметров (например, радиусов, где применяются разные способы принятия решения), пытаться добавить мелкие доработки, но становилось только хуже: из первой десятки стал падать в первую сотню. Где-то часам к четырем я откатил все изменения, поизучал ситуации, в которых этот алгоритм проигрывает, и понял, что иногда он принимает решение идти «на таран» на монстра тогда, когда в этом нет никакой необходимости. Думать, как это исправить на уровне алгоритма, уже не было времени (конкурс заканчивался в 11 утра в понедельник), поэтому поступил так: взял тот предыдущий алгоритм избегания противника, и стал использовать его в тех случаях, когда у моего персонажа есть куда отступать (то есть нет окружения со всех сторон). Результаты улучшились: я стал устойчиво попадать на второе место в своей лиге. Но на первом месте там стоит бот, сделаный самими разработчиками игры, а условием прохода в следующую лигу являтся именно победа над ним. А вот этого никак и не получалось.
Каких-либо идей, что еще можно добработать за оставшиеся несколько часов, не было. Все, что оставалось делать — это играться с несколькими глобальными параметрами, например, радиусами, от которых зависит способ принятия решения или коэффициентом, который влиял на то, насколько алгоритму будет важно находиться рядом с другими игроками. Но увы, каждая проверка кода в режиме «все против всех» занимает достаточно большой промежуток времени (порядка 5—10 минут в зависимости от загруженности сервера). И где-то часам к шести я начал приходить к выводу, что все бесполезно, и уже собирался было идти спать. Но постоянно говорил себе «сейчас попробую еще вот такое сочетание показателей, и пойду». Но потом хотелось проверить другое сочетание, за ним еще одно, и так длилось примерно до 8 часов утра. Тогда, запустив в очередной раз просчет, я почти сразу обратил внимание, что результаты на этот раз вроде бы лучше: подъем в таблице идет быстрее. Когда было посчитано около 70% всех игр, я оказался на первом месте. Но такое случалось уже не первый раз, и я знал, что это бывает обманчиво. Так и вышло: когда расчет дошел где-то до 84-85%, я снова сполз на второе. В районе 90% снова началась серия побед, снова — первое место, но было понятно, что оно очень и очень непрочно. И вот до окончания расчетов оставалось всего 4 игры. Две из них заканчиваются поражениями (причем по-моему, на четвертом месте). Я ожидаю, что вот-вот в любую минуту упаду на вторую строчку таблицы, но нет, все еще первый. И остается еще две игры. И обе заканчиваются полной победой! Есть, есть серебрянная лига!
Дальше я дождался, когда определится моя позиция в серебряной лиге. В ней я казался примерно 230 место из примерно 570. На этом я и решил закончить, пойти отсыпаться и приходить в себя.
В общем, впечатление о конкурсе у меня двоякое. С одной стороны, это интересно, и заставляет пробовать новое и лучше изучать то, что уже знаю (так, например, сейчас бы я совершенно иначе сделал алгоритм расчета пути по лабиринту, и, скорее всего, не имел бы проблем с таймаутом), с другой — слишком уж затратно в эмоциональном и физическом плане. Кроме того, когда я занят конкурсом, начинают вставать другие дела (тот же freelance), что тоже несколько напрягает. Кроме того, я чуть было из-за этого конкурса не пропустил очередные задания КСИ. Еще прихожу к выводу, что мне имеет смысл поучаствовать в Clash of Code — программировании небольших задач на скорость на том же CodinGame, чтобы приучить себя не думать долго при написании кода и реже лазить в справочники по стандартным функциям, больше полагаться на свою память.
После дня солнцестояния
Вот и все: вчерашний (вернее, уже позавчерашний) день летнего солнцестояния остался позади, а с ним — и лучшая часть года. Получилось так, что я встретил и его рассвет (так как лег после 4 часов) и закат. А днем прогулялся сначала вдоль реки, а оттуда — в сосновый бор за дальним СНТ. А вечером — жарил картошку в костре. И еще много размышлял о том, что этот день у меня вызывает двоякое впечатление. С одной стороны, кругом потрясающее лето, все поет и цветет, и так будет еще два месяца, но с другой — все же начинается движение вниз, и остановить его никак нельзя. Можно только дождаться следующего года, но для этого нужно пережить мрачную зиму.
День поглощения информации и ночная прогулка
Сегодня у меня просто день поглощения информации какой-то. Утром увидел рассылку ЖЖ с лучшими публикациями последней недели, и начал день с их чтения. Потом — решил поискать примеры использования NLPTK, нашел пару статей по этой теме на Хабре, и застрял там. Заодно узнал о проекте OpenCorpora, в котором, возможно, поучаствую. Потом на том же Хабре узнал про Progressive Web Apps и Flutter, а затем заинтересовался вопросом, какой язык программирования перспективнее: Dart или Kotlin. Четкого и однозначного ответа на этот вопрос не нашел, и остался при мнении, что все же последний.
А вечером, точнее, уже ночью, отправился на прогулку. Ночи сейчас очень светлые и очень тихие: соловьи уже умолкли (хотя сразу после этого заезда я еще одного или двух слышал), лягушки тоже, а сверчков еще не слышно. И только трескучие крики какой-то ночной птицы нарушают эту тишину и шум шоссе в некоторых местах слышен. Как обычно, дошел до насыпи, посмотрел с нее на звезды. Их сейчас видно не так уж и много: небо слишком светлое. Зато хорошо были видны Юпитер и Сатурн. А еще я решил все же пойти на поле, и попробовать увидеть Марс. Пока шел, увидел ежа. Точнее, сначала услышал в кустах какое-то шуршание и странное фырканье. Посветил туда фонариком, и обнаружил, что это еж. Как это ни странно, он меня особо не испугался, только вот слишком яркий свет ему не нравился. Он был так близко, что я мог бы попытаться его поймать, но не стал.
Добравшись до поля, я увидел Марс. Он был достаточно низко над южным горизонтом, гораздо ярче Сатурна (я почему-то ожидал, что по видимой яркости они будут примерно равны), а по цвету он вполне оправдывал название Красной планеты! Минут пять я постоял, наблюдая все три планеты сразу и чувствуя полноту Бытия и гармонию с миром, потом пошел обратно. Но чтобы сократить путь, решил зайти в поселок через главные ворота. В результате разбудил собак, а они, в свою очередь, разбудили сторожа, который стал допытываться, кудя я иду и чего это я так поздно шляюсь.
А вечером, точнее, уже ночью, отправился на прогулку. Ночи сейчас очень светлые и очень тихие: соловьи уже умолкли (хотя сразу после этого заезда я еще одного или двух слышал), лягушки тоже, а сверчков еще не слышно. И только трескучие крики какой-то ночной птицы нарушают эту тишину и шум шоссе в некоторых местах слышен. Как обычно, дошел до насыпи, посмотрел с нее на звезды. Их сейчас видно не так уж и много: небо слишком светлое. Зато хорошо были видны Юпитер и Сатурн. А еще я решил все же пойти на поле, и попробовать увидеть Марс. Пока шел, увидел ежа. Точнее, сначала услышал в кустах какое-то шуршание и странное фырканье. Посветил туда фонариком, и обнаружил, что это еж. Как это ни странно, он меня особо не испугался, только вот слишком яркий свет ему не нравился. Он был так близко, что я мог бы попытаться его поймать, но не стал.
Добравшись до поля, я увидел Марс. Он был достаточно низко над южным горизонтом, гораздо ярче Сатурна (я почему-то ожидал, что по видимой яркости они будут примерно равны), а по цвету он вполне оправдывал название Красной планеты! Минут пять я постоял, наблюдая все три планеты сразу и чувствуя полноту Бытия и гармонию с миром, потом пошел обратно. Но чтобы сократить путь, решил зайти в поселок через главные ворота. В результате разбудил собак, а они, в свою очередь, разбудили сторожа, который стал допытываться, кудя я иду и чего это я так поздно шляюсь.
Еще о страхе перед выступлениями
Пару дней назад осознал, откуда у меня берется торопливость и страх пауз при выступлениях/съемке на камеру. Вспомнил, что в 5—6 классах у меня нередко бывала такая ситуация: на уроке английского, когда учительница меня спрашивала что-то, я начинал в голове строить ответ, делал это достаточно медленно, и к тому моменту, когда достраивал и начинал открывать рот, чтобы сказать, она успевала решить, что я просто ничего не знаю, и спрашивала следующего. (Кстати, хороший пример различия восприятия рационалов/иррационалов по соционике, да и каталогов из КЛ — тоже.) А потом меня дома ругали за плохие оценки (тем более, что отец был просто помешан на важности двух предметов: английского и физики). И, по всей видимости, где-то в бессознательном отложилась установка «молчать нельзя, а то лишат слова вообще».
О программировании и личной неэффективности
В последние дни как-то совершенно не хочется ничего писать в блог. Возможно, потому что особо не о чем, кроме того, что в последние дни снова стало возвращаться чувство гармонии с миром, включенности в жизнь, полноты Бытия.
В пятницу занимался изучением frameworkа Flask для Python. В отличие от большинства PHP-шных, он мне очень понравился. Фактически, там создается Web-сервер прямо в самом скрипте, и все соединения обслуживаются одним процессом, что позволяет использовать общую память (прадва, есть и обратная строна: любая утечка ресурсов тут же будет давать о себе знать). Очень удобно для тех случаев, когда нужны динамические скрипты, но при этом связка Apache+PHP является слишком тяжелой.
Framework оказался на удивление простым. Фактически, нужно написать несколько строчек кода инициализации + навесить декоратор на функцию-обработчик того или иного URL. Правда, я чуть было не сломал мозг в начале, не понимая, почему же код примера не работает. Оказалось, нужно еще было добавить app.run(), который почему-то во всех примерах отсутствует. (Хотя, возможно, дело в версиях.)
Правда, получилось как всегда: в то, как работать с frameworkом, я въехал быстро, но весь день откладывал и откладывал попытку попробовать сделать на его основе что-то свое. И первый скрипт с его использованием запустил только на следующий день, в субботу. Эх, а ведь когда-то были времена, когда я, узнав что-то новое, сразу же начинал пробовать это в действии! Интересно, как их вернуть? А не ждать непонятно чего, как сейчас…
Кстати, и с freelance-задачей, о которой я уже упоминал, ситуация та же самая: сегодня днем в голове сложилось четкое понимание, что и как нужно сделать, но вот никак не соберусь взять это и сделать.
В пятницу занимался изучением frameworkа Flask для Python. В отличие от большинства PHP-шных, он мне очень понравился. Фактически, там создается Web-сервер прямо в самом скрипте, и все соединения обслуживаются одним процессом, что позволяет использовать общую память (прадва, есть и обратная строна: любая утечка ресурсов тут же будет давать о себе знать). Очень удобно для тех случаев, когда нужны динамические скрипты, но при этом связка Apache+PHP является слишком тяжелой.
Framework оказался на удивление простым. Фактически, нужно написать несколько строчек кода инициализации + навесить декоратор на функцию-обработчик того или иного URL. Правда, я чуть было не сломал мозг в начале, не понимая, почему же код примера не работает. Оказалось, нужно еще было добавить app.run(), который почему-то во всех примерах отсутствует. (Хотя, возможно, дело в версиях.)
Правда, получилось как всегда: в то, как работать с frameworkом, я въехал быстро, но весь день откладывал и откладывал попытку попробовать сделать на его основе что-то свое. И первый скрипт с его использованием запустил только на следующий день, в субботу. Эх, а ведь когда-то были времена, когда я, узнав что-то новое, сразу же начинал пробовать это в действии! Интересно, как их вернуть? А не ждать непонятно чего, как сейчас…
Кстати, и с freelance-задачей, о которой я уже упоминал, ситуация та же самая: сегодня днем в голове сложилось четкое понимание, что и как нужно сделать, но вот никак не соберусь взять это и сделать.
Опять распыляю силы
В последние дни опять такое чувство, что меня разрывает на куски между множеством всего, что я хотел бы сделать, но при этом ни одно из этих желаний не дотягивает до полноценного «хочу», ради которого можно было бы все бросить и заняться прямо сейчас. Плюс еще постоянно вылезают какие-то мелочи, которые я на самом деле делать совершенно не хочу, но надо, в основном, тот же freelance. И получается так: висит какое-нибудь «надо», я из-за него откладываю остальные дела, но из-за внутреннего протеста против планов заняться никак не могу до самого позднего вечера. И получается, что дело, на которое нужно минут 20—30, реально приводит к тому, что из-за него вникуда уходит целый день.
Сегодня в попытках хоть как-то избавиться от этого снова уехал за город (а еще из-за отключения горячей воды). И теперь снова думаю над вопросом, чем же заниматься в жизни, если учитывать следующее:
1) Я не умею легко и быстро, играючи, излагать свои мысли ни на бумаге, ни тем более устно, любой процесс написания (даже вот этого текста) для меня именно муки творчества.
2) У меня нет коммуникативных навыков (и по идейным причинам нет желания их приобретать), что накладывает довольно много ограничений.
3) Чтобы быть замеченным в условиях современного «мира наизнанку», нужно либо делать что-то совсем необычное, что вызывало бы удивление и желание об этом рассказать, либо заниматься целенаправленной раскруткой. Но раскрутка, во-первых, вызывает у меня глубокое внутреннее неприятие, во-вторых, создает необходимость коммерциализировать свою деятельность. Но коммерциализация сразу же повышает уровень ответственности за сделанное. А вот ответственность-то я брать на себя не хочу.
Впрочем, недавно произошло нечто, что можно считать указанием высших сил на то, что делать. На встрече по настольным играм я пересекся с давним знакомым С.Ш. и узнал, что он, оказывается, написал и издал небольшую книгу, причем тоже по саморазвитию. Он подарил мне один экземпляр. Увы, ничего особо прорывного я из его книги не узнал, она будет полезна, в основном, школьникам 8—9 классов, и то не всем, а только тем, кому ближе янская модальность жизни. И самое главное, он повторяет типичную ошибку нашего времени: подает янскую модальность жизни как единственно возможную.
Но сам факт того, что раз у него получилось (причем книга по объему раза в два меньше, чем я задумывал для своей), мотивирует меня пытаться тоже. Тем более, что на мой взгляд, есть немало тем, которые он либо не раскрыл в достаточной мере, либо написал слишком мало конкретики.
Сегодня в попытках хоть как-то избавиться от этого снова уехал за город (а еще из-за отключения горячей воды). И теперь снова думаю над вопросом, чем же заниматься в жизни, если учитывать следующее:
1) Я не умею легко и быстро, играючи, излагать свои мысли ни на бумаге, ни тем более устно, любой процесс написания (даже вот этого текста) для меня именно муки творчества.
2) У меня нет коммуникативных навыков (и по идейным причинам нет желания их приобретать), что накладывает довольно много ограничений.
3) Чтобы быть замеченным в условиях современного «мира наизнанку», нужно либо делать что-то совсем необычное, что вызывало бы удивление и желание об этом рассказать, либо заниматься целенаправленной раскруткой. Но раскрутка, во-первых, вызывает у меня глубокое внутреннее неприятие, во-вторых, создает необходимость коммерциализировать свою деятельность. Но коммерциализация сразу же повышает уровень ответственности за сделанное. А вот ответственность-то я брать на себя не хочу.
Впрочем, недавно произошло нечто, что можно считать указанием высших сил на то, что делать. На встрече по настольным играм я пересекся с давним знакомым С.Ш. и узнал, что он, оказывается, написал и издал небольшую книгу, причем тоже по саморазвитию. Он подарил мне один экземпляр. Увы, ничего особо прорывного я из его книги не узнал, она будет полезна, в основном, школьникам 8—9 классов, и то не всем, а только тем, кому ближе янская модальность жизни. И самое главное, он повторяет типичную ошибку нашего времени: подает янскую модальность жизни как единственно возможную.
Но сам факт того, что раз у него получилось (причем книга по объему раза в два меньше, чем я задумывал для своей), мотивирует меня пытаться тоже. Тем более, что на мой взгляд, есть немало тем, которые он либо не раскрыл в достаточной мере, либо написал слишком мало конкретики.
Настольные игры и мелкие неприятности
Сегодня сходил на настолки, которые проводились на той же квартире, что и в январе. Изначально хотел было прийти к 15 часам, но, как водится, сначала проспал, потом прособирался, и до места доехал только в 17:15. Как только пришел, сразу же позвали играть в «Нечто». Сыграли несколько конов, но в этот раз почти все время побеждали мирные. Сам я Нечто был только один раз, причем в тот кон смог сделать всего один ход, остальное время были то пересадки, то смена направления, то выпадала паника. Впрочем, потом одной участнице вообще «повезло»: она была нечто, но за всю игру ход до нее не дошел. Отчасти с моей подачи: я сидел рядом с ней, и на своем ходу сделал смену направления движения. Еще дважды были моменты, когда подавляющее большинство было уверено, что в роли Нечто снова оказался я, но это было не так.
Потом еще сыграли в японский вариант Бэнга. Очень понравилось, хотя в первый кон я сразу выдал свою роль (а играл я ронином, который один против всех), в результате многие сыграли против меня. Второй раз играл за самураев, но там получилось так: ниндзя и и ронин объединились (плюс еще сидели еще очень удачно) и весьма эффективно сыграли против сегуна, устранением которого игра и закончилась.
В общем, очень сегодняшней игрой доволен, жалею только об одном: не поиграли в Кондотьеров и в обычный Бэнг (хотя в последнйи — была возможность). Заигрались примерно до 0:25. Я собирался вернуться по МЦК, поэтому думал, что по времени не особо критично. И вот тут-то и начались неприятности. Я не поверил своей белой интуиции, которая требовала оторваться ото всех и идти на МЦК как можно быстрее, а пошел со всеми до метро. Но народ шел медленно, и в результате к МЦК добрался только в 0:46. Сотрудники у входа сказали мне, что подходит последний поезд в нужную мне сторону. Я бросился бежать, но там длинный переход, и когда я бежал по нему, увидел, что поезд уже стоит на станции. Я пытался успеть на него изо всех сил, но увы, не хватило где-то 20—25 секунд на то, чтобы спуститься вниз. Кто же знал, что МЦК закрывается раньше часа ночи!
Вообще, какой-то период постоянного опоздания последней минуты…
Было очень обидно и что не успел, и что напрасно потратил поездку на вход в МЦК. Но делать было нечего, пришлось идти обратно к метро, благо оно еще было открыто. Было ясно, что на свою линию я не успеваю никак, и придется ехать на ночном автобусе. Было два варианта: ехать до Лубянки, а оттуда идти пешком до Китай-Города, или же пытаться поймать последний поезд на пересадке Чистые Пруды — Сретенский Бульвар, а на автобус пересаживаться на Римской. Уже совсем было приготовился выйти на Чистых Прудах, но в последний момент передумал и поехал на Лубянку. Там вдруг понял, что не знаю, сколько по времени идти от нее до южного выхода из КГ (а автобусы уходят именно от него) и запаниковал по этому поводу. Но, как выяснилось, зря: до нужного места добежал с запасом в 8 минут до отправления автобуса. Но домой добрался только в 2 часа ночи и в последний момент немного попал под дождь.
Потом еще сыграли в японский вариант Бэнга. Очень понравилось, хотя в первый кон я сразу выдал свою роль (а играл я ронином, который один против всех), в результате многие сыграли против меня. Второй раз играл за самураев, но там получилось так: ниндзя и и ронин объединились (плюс еще сидели еще очень удачно) и весьма эффективно сыграли против сегуна, устранением которого игра и закончилась.
В общем, очень сегодняшней игрой доволен, жалею только об одном: не поиграли в Кондотьеров и в обычный Бэнг (хотя в последнйи — была возможность). Заигрались примерно до 0:25. Я собирался вернуться по МЦК, поэтому думал, что по времени не особо критично. И вот тут-то и начались неприятности. Я не поверил своей белой интуиции, которая требовала оторваться ото всех и идти на МЦК как можно быстрее, а пошел со всеми до метро. Но народ шел медленно, и в результате к МЦК добрался только в 0:46. Сотрудники у входа сказали мне, что подходит последний поезд в нужную мне сторону. Я бросился бежать, но там длинный переход, и когда я бежал по нему, увидел, что поезд уже стоит на станции. Я пытался успеть на него изо всех сил, но увы, не хватило где-то 20—25 секунд на то, чтобы спуститься вниз. Кто же знал, что МЦК закрывается раньше часа ночи!
Вообще, какой-то период постоянного опоздания последней минуты…
Было очень обидно и что не успел, и что напрасно потратил поездку на вход в МЦК. Но делать было нечего, пришлось идти обратно к метро, благо оно еще было открыто. Было ясно, что на свою линию я не успеваю никак, и придется ехать на ночном автобусе. Было два варианта: ехать до Лубянки, а оттуда идти пешком до Китай-Города, или же пытаться поймать последний поезд на пересадке Чистые Пруды — Сретенский Бульвар, а на автобус пересаживаться на Римской. Уже совсем было приготовился выйти на Чистых Прудах, но в последний момент передумал и поехал на Лубянку. Там вдруг понял, что не знаю, сколько по времени идти от нее до южного выхода из КГ (а автобусы уходят именно от него) и запаниковал по этому поводу. Но, как выяснилось, зря: до нужного места добежал с запасом в 8 минут до отправления автобуса. Но домой добрался только в 2 часа ночи и в последний момент немного попал под дождь.
Страницы:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141