Pull to refresh

Comments 71

| каждый человек любит соревноваться и доказывать свое первенство
Я не человек (
Не поверю если скажете что любите проигрывать или быть аутсайдером.
Быть в чем то и кого то лучше, не означает движения к собственной цели.
У Вас слишком абстрактная формулировка. А на самом деле это весьма связанные вещи.
Вот взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.
взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.

open source энтузиасты пилят, чтобы у себя работало, а отдают — чтобы не протухло со временем. Если тебе самому не надо — фиг ты что толковое напишешь.
Не все пытаются быть именно лучше других, именно соревноваться, кто-то просто творит без привязки лучше\хуже.
Вот взять к примеру open source, это движение само по себе уже говорит что ради признания, уважения или первенства люди готовы даже денег не брать.
Или ради проверки на вшивость кода (конечно редко но возможность то есть).
Или ради доработки софта, который собираешься использовать.
Или ради обретения навыков командной разработки.
Или… или…
Нельзя так просто взять и отождествить open source с глобальной фаллометрией.
Отсутствие желания соревноваться не означает проигрыш. Иногда проще съесть корешок, а не гоняться за мамонтом, рискуя быть сожранным саблезубым тигром.

Ну и, чтобы два раза не «вставать», движение Open Source держится не только и не столько на «признании, уважении и первенстве», сколько на простой невозможности некоторых людей не писать код. Скольких контрибюторов ядра Линукс вы знаете? Я — ни одного, кроме самого Линуса. О какой популярности тут может идти речь, если о них не знает никто, кроме тех, кто с ними же работает? Широко известные в узких кругах? Ну, ок. Только это скорее повторяет мою мысль — они занимаются этим либо за деньги (сколько там процентов коммитов в ядро идет от корпораций вроде Google и Intel?), либо из любви к искусству.

Соревновательный элемент в IT представлен исключительно спортивным программирование, успехи в котором, по слухам (https://geektimes.ru/post/248580/), имеют скорее обратную корреляцию со способностью работать в команде среднестатистических людей. Проводя аналогию — да, ты можешь догнать мамонта быстрее остальных охотников, но что ты будешь с ним делать один? Ты можешь «запилить» крутой коммит в любимый OS проект, но если его сможет понять 1-2 человека из команды, кому он нужен в таком виде? Кто будет его поддерживать потом?
UFO just landed and posted this here
Ну и, чтобы два раза не «вставать», движение Open Source держится не только и не столько на «признании, уважении и первенстве», сколько на простой невозможности некоторых людей не писать код. Скольких контрибюторов ядра Линукс вы знаете? Я — ни одного, кроме самого Линуса. О какой популярности тут может идти речь, если о них не знает никто, кроме тех, кто с ними же работает?
И даже тут «признание, уважение и первенство», таки имеет место быть. Просто признание не со стороны «ширнармасс», а конкретно со стороны «уважаемого человека Линуса», например. Признание от коллег и т.д. и т.п. Конечно, мировая слава не всех манит, но признание от людей, которых человек сам уважает (что важно), значит, причем значит многое.
Да, вот эту часть я и пытался донести.
Тем не менее свой первонах под постом вы вбили…
Чем доказали свое первенство в этом скромном соревновании...
Может вы просто вытесняете мысль о желании быть первым из сознания, а подсознание грезит господством над МИРОМ!
каждый человек любит соревноваться и доказывать свое первенство
Я не человек (
Человек. Как говорит старинная народная мудрость: мир движут вперёд две вещи — лень и пиписькомерение.
Для написание нужны: java
Вы добавили бы поддержку более других языков :)
В данной ситуации это было для меня затратно по времени, поэтому я решил отказаться от этой идеи.
Сейчас система в ран тайм подключает ботов как плагины и выполняет их код.
Для поддержки же многих языков нужен иной подход. Или многоязычная среда исполнения, или та же java но которая будет выполнять роль интерпретатора.
Или запуск бинарников (в докере(небезопасно?) или в виртуалке(ресурсоемко)) и игра с ними используя сетевой протокол.
Да, оба варианта были на примете. И все это я назвал одним термином — многоязычная среда исполнения (в детали реализации я не вдавался). Но все же это требует времени на реализацию, а я пока решил держать концентрацию функциональной составляющей.
Можно просто паблик апи. Я даю вам ссылку где слушает мой бот, вы посылаете ему исходные данные и получаете ответ.
А это облегчит вам работу? Скомпилировать и залить ведь "piece of cake" а поднимать инрфаструктуру для доступа из-вне, уже чуть заморочнее.
Это облегчит мне возможность написать на чем я хочу и высунуть вам данные в JSON, например.
Под апи подразумевается не какой-то Java-RPC, а что-то простенькое.
Да, это полезное замечание, добавлю себе в TODO список.
А также арендовать облачную ферму.
Если на вход поступает .jar, то значит, в теории, jvm based языки должны работать?
Не из мира Java, но идея мне понравилась, да и выглядит хорошо. Думаю, желающие сразиться найдутся.
Идея замечательная! Но использование Lombok может отпугнуть потенциальных участников, не знакомых с ним. Тем более даже плагин Lombok для Intellij IDEA "подсвечивает" некоторые ошибки.
Спасибо. И я действительно старался использовать 3rd party по минимуму, но именно тут не удержался. Надеюсь что заинтересовавшиеся все же найдут время что бы познакомиться с данной библиотекой. Тем более что такое знакомство может быть полезно и для личных целей.
UFO just landed and posted this here
Система расширяема. Так что не стесняйтесь. Какую игру предложите?
Покер. Дурак — слишком прямолинейная игра. Да и знают о нем только на просторах бывшего СССР.
UFO just landed and posted this here
+1 к Покеру. Сам участвовал в Lean Poker хакатонах, де нужно кодить покерных ботов — было весьма интересно.
UFO just landed and posted this here
Преферанс. И профурсеток
Но он гемморойнее на этапе реализации + требование наличия трех ботов. (Зато нематчевая система учета очков. =) )
Можно взять те же шашки. Довольно простая игра
Я буду следить за этой веткой и по результатам обсуждения глянем кто наберет побольше плюсов.
Если вариант окажется стоящим — возьму в разработку.
Прикольно) Еще бы была возможность играть с собственным ботом, то есть нечто вроде пользовательского тестирования. А так — идея очень хорошая, да и реализовано на уровне.
Да, весьма разумное замечание, для отладки это очень полезная вещь.
Добавил в список фич для релиза, спасибо.
Интересно, дойдёт ли до того, что боты начнут объединяться друг с другом против более сильных ботов, или обойдётся тем, что каждый будет сам за себя…
Есть ли возможность узнать некий ID противника и сохранять какие-то данные между играми? Тогда можно было бы писать ботов, подбирающих стратегию против конкретных противников. Или всё полностью анонимно?
Пока что все анонимно. Считаете имеет смысл "раскрыть карты"?
Как мне кажется это позволит расширить возможности ботов. Учить бота подстраиваться под конкретного соперника — довольно интересная функция
правильно ли я понимаю, что бота можно написать на любом jvm-based языке (Scala, Kotlin), главное чтоб на выходе jar для загрузки получился?
… главное что бы на выходе был jar в котором есть класс AiImpl реализующий интерфейс Ai
Как-то фильтруется время выполнения?
Если while(true){} будет в боте или еще что-то подобное?
Да, это оговорено в правилах, 10 секунд таймаут бота.
Реализовано с помощью ExecutorService который умеет ограничивать время выполнения.
А можно чуть подробнее? Если делается Thread.stop(), то получим неконсистентность, если interrupt, то
while(true) {
  try {
     ...
  } catch (InterrruptedException ignored) {
  }
}
Да и InterruptedException скорее всего даже не возникнет, если не будет блокирующих операций, а будет просто тупой while (true)
Вот как это выглядит:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<GameResults> futureResult = executor.submit(new GameTask(player1, player2));
results.add(futureResult.get(Constants.GAME_TIMEOUT, TimeUnit.MILLISECONDS));
Потоки потекут. Future.get не прерывает исполнение внутри executor'а, только возобновляет работу текущего потока. В потоке Executor'а будет всего лишь вызван Thread.interrupt(). Это нормально?
Просто в Java многозадачность кооперативная. Нельзя (насколько мне известно) кого-то принудить завершиться за определенный промежуток времени. Возможно, конкретно в вашем случае это вполне ок. Но выглядит так, что будет не очень хорошо.
Что бы держать потоки под контролем нужно их прерывать, тут я согласен. Делать это можно в 2 этапа. Первое, Future.cancel, второе, обрабатывать interrupt внутри задачи.
Так я думаю будет корректно.
Да, но timeout же для того и нужен, чтобы нехорошие пользователи не отжирали все время под себя? Или я не правильно понял? А если пользователь нехороший, то странно ожидать от него, что он обработает interrupt корректно.
Да, поняли все правильно. Но тут дело в том что Callable для ExecutorService'а умеет отличать ситуацию когда Future.cancel.

Вот примерно так stackoverflow.com/a/16277241/1239020
Что значит «Callable для ExecutorService'а умеет отличать ситуацию когда Future.cancel»? Все, что делает future.cancel(true) — выкидывает задачу из очереди, если она еще не запустилась, или говорит Thread.interrupt, если задача уже работает.
При future.cancel тред выполняющий задачу помечается как interrupted. Тут то и можно внутри таски проверить Thread.currentThread().isInterrupted() и сделать необходимые действия.
Вообще, корректно сделать песочницу — довольно сложная задача. Да и все равно найдется способ все сломать. С другой стороны, песочница у нас уже есть — jvm. Соответственно, я у себя в конечном счете пришел к решению запускать jvm со включенным SecurityManager и ограниченным хипом на каждую игру. А время работы мониторить снаружи и слать sigterm если зависло.
Тут сделано аналогично, и квалификация и игры турнира запускаются в отдельной jvm.
Так что даже если все свалится, урона будет не много.
время работы мониторить снаружи и слать sigterm если зависло.

в моем случае это не подходит, мне нужно знать виновника
Future.get никаких интераптов не делает. Все, что вы получите — TimeoutException вместо результата. На сколько я понимаю, там дальше стоит catch на него и future.cancel.
На самом деле, если очень аккуратно, то Thread.stop() можно. Главное, о чем предупреждают — отпускание мониторов. Но в данном случае их и так не будет.
Я правильно понимаю, что игра более чем двух игроков не поддерживается?
Да, все так. Но в списке фич есть поддержка игры для более 2-х игроков.
Под фичами имеются в виду планируемые доработки? Почин интересный, но «Дурак» из двух игроков довольно примитивная игра (особенно если ещё и не переводной). Ещё вопрос: интерфейс AI выглядит как-то куце, непонятно, как бот узнаёт о том, какие карты на руках? Или всё это включается в Table? Может ли бот хранить какое-то своё состояние? По интерфейсу не помешало бы более подробное описание. Я немного думал об этой игре (и возможно вернусь к этому). Тема мне интересна и хочется больше технических подробностей.
Под фичами имеются в виду планируемые доработки?
Да

Или всё это включается в Table?
Да

Может ли бот хранить какое-то своё состояние?
На всю сессию игры используется один инстанс, так что можете создать поля класса и хранить там доп информацию

По интерфейсу не помешало бы более подробное описание.
Большая часть описана в Dev Guide секции на Intro странице. Если чего не хватает — пишите, добавлю

хочется больше технических подробностей.
Судя по результатам голосования мне придется раскрыть карты.
После прочтения в «Битву умом» желания включаться не появилось, но интерес пройти по ссылке появился. На первый взгляд все достаточно культурно оформлено, смутило лишь то что дизайн сайта не адаптивный.
Серверная часть весьма независима от клиентской. Это было сделано для того что бы можно было поддержать в будущем другие платформы. Адаптировать сам сайт я не стал, так как для того же андроида весь функционал не нужен, но вот сделать легкий клиент будет довольно просто.
Sign up to leave a comment.

Articles