Перейти к содержимому

Серебро в Unleash the Geek

Краткое описание бота, с которым получилось выйти в серебро.

hNJizT1j0RA

Задача

  • У нас есть пять роботов, способных выкапывать руду либо закапывать предметы. Предметов всего два: радар и ловушка.
  • Радар показывает руду в 4 клетках (все расстояния — манхэттенские). Ловушка взрывается как только кто-то попытается копать в её клетке, уничтожая робота в своей клетке и в четырёх соседних.
  • Сами роботы могут проезжать за ход до 4 клеток либо копать в своей клетке либо в четырёх соседних.
  • Если у робота в инвентаре есть предмет, он будет закопан.
  • Если в выкапываемой клетке есть руда, единица руды переместится из клетки в инвентарь.
  • При заезде на клетки самого левого ряда (x = 0) робот сдаёт руду и добавляет очко своей команде.
  • Одновременно робот везёт только один предмет (радар, мину либо единицу руды).

Тег «Далее»

Серебро в Legends of Code and Magic

Вот эта штука заставила напрячься по настоящему. Во-первых, игра модальная — т.е. сперва идёт драфт и тебе нужен один движок ИИ, а потом начинается собственно матч и тебе нужен другой движок, тем не менее решения принятые первым влияют на решения второго. Во-вторых, игра достаточно случайная. Чтобы это нивелировать (видимо) с каждым соперником проводится по два матча. Я бы проводил вообще до двух побед, как в MtG принято. В третьих, сложность игровых ситуаций иногда просто зашкаливает — столько всего надо учесть и сделать за ход.

Тег «Далее»

Cubetutor и Data Mining

Недавно решил сделать очередной мини-проект — скачать все кубы с Cubetutor.com и найти там связанные «блоки», из которых кубы строятся — комбо, мана-фиксинг и т.п. Скачать листы оказалось делом несложным — я экспортировал один из кубов в текстовом виде, скопировал curl-вызовы в консоли Chrome (оказалось что нужен и запрос к странице и POST-запрос на сохранение) и подставил их в цикл в bash-скрипте. Задержку между скачиваниями я поставил в 6 секунд, поэтому все кубы по айдишникам экспортировались почти сутки. После этого из получившихся текстовых файлов я удалил те, в которых были страницы ошибок (удалённые кубы, видимо).

Тег «Далее»

Mercurial_keyring

Столкнулся недавно с неприятной проблемой — mercurial_keyring не хотел сохранять пароли. Mercurial_keyring — плагин к mercurial (системе контроля версий), позволяющий не вводить пароль при каждой операции с удалённым репозиторием. Мне это потребовалось для организации автодеплоя прямо из репо.

Когда я прошелся по коду mercurial_keyring (он написан на python), оказалось что проблема лежит в функции get_http_password, точнее в том, что модуль keyring не может сохранить/получить пароль, если в ключе присутствует знак :. Скрипт mercurial_keyring.py генерирует ключ из логина и url-а, соответственно если URL начинается с http: или https:, плагин просто не находит сохраненного пароля.

Я это у себя исправил просто правкой mercurial_keyring.py. Было:

    def _format_http_key(self, url, username):
        return "%s@@%s" % (username, url)

Стало:

    def _format_http_key(self, url, username):
        return "%s@@%s" % (username, url.replace(':', '#'))

nude.js и CORS

После случайного обнаружения в ленте поста про nude.js, у меня сразу появилась идея о том что можно с этим сделать. Nude.js — это javascript-библиотека для обнаружения обнаженного тела на фото. Я захотел сделать автоматическое скрытие NSFW-постов в ленте Tumblr, но, к сожалению, не получилось. Но всё по порядку.
Тег «Далее»

AI, Minecraft и Node.js

Пару месяцев назад я записался на онлайн-курс Artificial Intellingence от Stanford University. И пока курс не начался (он начался только в понедельник 10 октября) пришла ко мне мысль сделать какую нибудь «песочницу» для тестирования разных алгоритмов, которые будут встречаться в курсе. Захотелось сделать такую песочницу из Minecraft.

Вначале я думал о том чтобы просто модифицировать клиент или написать к нему плагин. Но т.к. при модификации пришлось бы работать с декомпилированным (плохо читаемым) Java-кодом, а система плагинов пока оставляет желать лучшего, я переключил своё внимание на сервер. Тут дела были несколько лучше. Для Minecraft есть несколько серверов с открытым исходным кодом на разных языках — C, Java, Python, .NET и т.д. Покопавшись в них, а также покопавшись в nodecraft — заброшенной попытке написать minecraft-сервер на JavaScript, я решил все таки попробовать написать сервер самостоятельно, благо опыт работы с двоичными протоколами после разработки limestone у меня есть, да и во внутренности Minecraft я уже немного забирался (правда с Питоном). Протокол Minecraft описан (пусть даже немного неточно) в Minecraft Coalition wiki.

За первые пару дней я разобрался с последовательностью авторизации клиента и перешёл непосредственно к логину. Для логина сервер должен выслать клиенту местность вокруг места появления и всякие стартовые параметры типа времени сервера, содержимого инвентаря, точки респауна в случае если игрок погибнет и т.д. В IRC на канале #mcdevs меня сразу предупредили что отправка чанков клиенту это довольно сложная часть разработки и многие авторы серверов срезаются именно здесь. В результате двухдневных попыток подбора библиотеки сжатия и экспериментов с порядком пакетов отправить местность всё таки получилось. На следующий день после этого я прикрутил отправку keepalive-пакетов (без этого время пребывания на сервере ограничивалось одной минутой) и добавил респаун мобов и их движение. Теперь осталось только добавить определение столкновений, чтобы делать лабиринты, и можно приступать к заданиям второй главы курса — алгоритмам поиска пути.

Когда доделаю сервер будет видимо отдельный большой пост о протоколе Minecraft, написании сервера и насколько он на самом деле подходит для тестирования AI-алгоритмов. Пока мои наработки можно найти на Github. Сервер я назвал blackstone (на #mcdevs предлагали node-minecraft, но по моему это скорее название для какой нибудь библиотеки утилит).

Яндекс.Метрика

Последнее время с интересом слежу за развитием истории с проиндексированными смс, заказами (а теперь ещё и билетами). На Хабре (да и в Интернете вообще, по моему) все горой стоят за Яндекс — дескать, кто не закрыл нужные страницы с помощью robots.txt, тот сам себе злобный Буратино. Я не совсем согласен с такой точкой зрения. Как пользователь Яндекс.Метрики лично я пропустил момент когда она начала по тихому сдавать страницы в очередь краулера (и, соответственно, в индекс). Я использую кое где Метрику для статистики, и для меня такое открытие было неприятной неожиданностью. Причём я сейчас проверил в новостях метрики — о таком нововведении там ни слова. Хотя мне скрывать какие то страницы смысла не имеет, подобное изменение всё равно вызывает вопросы. Имхо, раз уж метрика привязывается к почтовому аккаунту, могли бы и разослать предупреждение.

Впрочем, это не означает что владельцы сайтов тут совсем ни при чём. При защите пользовательских данных подход security through obscurity ни к чему хорошему привести не может. Особенно если данные действительно личные (номера телефонов, адреса + состав заказа, данные о поездке), лучше защищать их явно, чем просто надеяться на то что никто и никогда этих страниц не увидит. И неожиданно изменившиеся правила игры не обернулись бы такими конфузами.

В общем, этот случай — хороший повод задуматься о безопасности пользовательских данных в своих проектах, не полагаясь на поведение поисковиков «по умолчанию». Обновить robots.txt, поставить авторизацию на страницах, которые содержат личные данные.

Kue — очереди с приоритетами на основе Redis

Если в Вашем проекте необходимо выполнять какие то задачи в фоновом режиме, будь то отправка почты или перекодирование видео, Вам следует присмотреться к Kue — инструменту для управления очередями задач с поддержкой приоритетов, метаданных и удобным веб-интерфейсом.

Тег «Далее»

Случайная находка — dev-сервер Хабрахабра

Сегодня совершенно случайно обнаружил один из development-серверов Хабрахабра. Так получилось что как раз сегодня прошло 3 года с моей регистрации на ресурсе. Узнал я об этом, зайдя с утра в почту и увидев письмо от Хабрахабра с темой «Вам доступен значок ‘Старожил’«.

Точнее, таких писем было два.

Тег «Далее»

Операции с однородными потоками данных

Недавно задумал написать вспомогательный модуль для node.js, чтобы облегчить работу с потоками для чтения. Например, быстро собрать по кускам ответ от сервера и представить в виде одной строки или JSON.

Тег «Далее»