В своём предыдущем посте я рассказал, что знаю, как работает Flash-компонент Codeforces для показа решений во время контеста, и собираюсь рассказать другим. Не для того, чтобы эту информацию использовали для нарушения правил, а чтобы в контестах можно было участвовать наравне со всеми без Flash. Реакция со стороны администрации была весьма болезненной — как будто я собираюсь сломать Codeforces, то есть сделать так, чтобы он не мог нормально работать. Я не согласен с подобной оценкой. Более того, я сомневаюсь, что те усилия, которые прикладывает Codeforces для защиты кода решений от копирования, вообще оправданы.
Я считаю, что когда MikeMirzayanov придумывал систему защиты от копирования кода (или оценивал, если эту систему придумал кто-то другой), он совершил две ошибки. Первая из них чисто техническая: он решил, что то, что алгоритм шифрования реализован с помощью Flash, само по себе является серьёзным препятствием для реверс-инжиниринга. Никакой другой защиты там нет: алгоритм очень простой, код легко читается, а для расшифровки не нужно даже знать ключ. Как я уже писал, это не работает — декомпиляторы для Flash легко находятся в Google. Так что почти никакой реальной защиты и не было, только видимость защиты.
Вторая ошибка скорее стратегическая: в попытке сделать систему максимально защищённой MikeMirzayanov решил пожертвовать удобством участников и продолжал настаивать на своём решении, даже когда участники неоднократно озвучивали своё несогласие. Ни для кого не секрет, что полностью исключить возможность читерства на соревнованиях невозможно. Особенно это касается онлайн-соревнований, где есть методы читерства, которые просто реализовать и сложно предотвратить. Например, совместное участие в личном контесте нескольких человек под одним аккаунтом. По сравнению с этим варианты читерства, которые возникают в результате возможности копировать код, не выглядят захватывающими: чтобы читать чужой код, необходимо уже иметь своё решение, которое проходит претесты, а значит, идею решения всё равно нужно придумать самому (да и, чтобы понять идею чужого решения, не нужно его никуда копировать — достаточно его прочитать). А чтобы использовать скопированный код чужого решения для взломов, нужно не только уметь его запускать, но и иметь нетривиальные тесты — ведь это решение уже прошло претесты. В общем, нужно достаточно много возни, а в результате на одних взломах всё равно далеко не уедешь.
При планировании системы защиты стоит предполагать, что большинство участников не будут пытаться нарушить правила, по крайней мере, преднамеренно. Потому что если это не так, то у сообщества серьёзные проблемы, которые не решить техническими средствами. Так что большинство участников вообще не будет пытаться скопировать текст решений, некоторые могут попробовать просто его выделить и скопировать (возможно, не зная, что это против правил — кто же их читает?), отдельные участники могут попробовать влезть в инструменты разработчика. Но если кто-то дошёл до того, чтобы вытаскивать текст, рисуемый на canvas-е, то у меня для вас плохие новости: он действительно хочет скопировать код, и он его скопирует. Потому что аналоговая дыра остаётся всегда, OCR — это не rocket science, а склеить изображение всего кода из видео его прокрутки — если подумать, то не такая уж и сложная задача.
Исходя из вышесказанного, я считаю, что нынешняя система на основе Flash в целом не приносит пользу. Да, она может не дать небольшому количеству участников считерить, но для большинства она создаёт неудобства. Целевой аудиторией Codeforces являются честные участники, так что о них нужно думать в первую очередь. В этом плане показателен пример TopCoder: их браузерная арена не использует Flash, и код оттуда извлекается вводом одной строчки в консоль. Их Java-арена вообще передаёт код открытым текстом — бери и копируй. И при всём при этом у них, судя по всему, нет серьёзных проблем с читерами (иначе бы они что-нибудь изменили). Лично мне их подход нравится намного больше.
Вообще, такие посты, наверно, лучше делать на английском. Если чуть ближе к теме:
Об этом, вроде, не было сказано в оригинальном посте напрямую, но кажется, что у многих сложилось впечатление будто планируется выложить аддон, который как раз позволит сразу именно копировать чужой код и/или инструкцию "для самых маленьких" о том, как такую программу сделать.
Возможно, я не очень понятно написал, но цель аддона — не позволить копировать код, а позволить читать код без Flash. С другой стороны, сильно париться с обфускацией и защитой от целенаправленного обхода я не собираюсь, так как не вижу в этом смысла.
Уже готов быть мамкиным хацкером и ломать всех в комнате?)
Евгений, спасибо за мнение.
ИМХО, лучше бы я сейчас дальше Div3 позанимался (второй раунд пока координирую я) или разобрался бы что было не так с mariadb вчера. Но ведь надо на такое отвечать, да?
По сути.
Заголовок поста слабо согласован с текстом внутри. Касательно заголовка никаких возражений нет. Как я писал ранее, я поддерживаю идею замены Flash и работа командой в этом направлении ведется (основной рывок был сделан еще в прошлом году). В обозримом будущем, конечно, мы сможем отказаться от Flash. Если ты считаешь, что это надо было сделать значительно раньше, то я не уверен, что ты прав. Мы работаем по целому фронту направлений и решаем задачи в соответствии с приоритетами и возможностями. Я был бы рад сделать всё и сразу, но так не получается. Мне кажется, что важно это постоянно двигаться вперед, развиваться, не складывать руки в случае неудач, а продолжать работу. В целом, у нас получается.
Касательно моих ошибок. У меня их хватает, но конкретно здесь, ИМХО, ты нагнетаешь.
Вернемся в 2010-й год и вспомним что там было. Поддержка canvas только начиналась, Flash стоял почти всюду, появлялись реализации не только от Adobe, но и свободные типа Gnash/Swfdec/Lightspark. Уже тогда было понятно, что Flash это скорее не будущее на века (если не превратят в свободный формат или что-то такое), но и до его заката еще не близко. Решение с Flash было легко и быстро реализовать. Оно обладало определенной защищенностью (которую в случае проблем можно было нарастить). Оно эффективно расходовало трафик пользователей во время контеста, не тормозило даже на старых компах. Я полагаю отсутствие массовой истерии по поводу использования Flash, но стабильный рост аудитории платформы показывает, что это было нормальное работающее решение. Еще долгие годы Flash оставался очень даже распространенным и поддерживаемым. Например, в Fedora я просто предполагаемым образом ставил Chrome и всё работало из коробки (не знаю как сейчас). Я не думаю, что в далеком 2010-м я совершил ошибку.
В твоем после есть еще отсылка к моей «второй ошибке», стратегической. У меня их было значительно больше, но это не тот случай. Не было цели сделать систему максимально защищенной (ты же сам хвалишься и рассказываешь, что сложностей не было). Мне кажется, ты утрируешь степень неудобства. Я довольно много наблюдал за поведением участников во время раундов, с этим интерфейсом сталкивается большая часть участников. Я не часто сталкивался с ярко выраженным отрицательным фидбеком. Если бы всё было настолько плохо, то каждый раунд были бы жалобы или предложения по исправлениям. Много писали про подсветку синтаксиса — я поддержал. Писали про отметки о просмотре решений — я поддержал. Когда-то были баги из-за кириллицы и иероглифов — я починил. Если бы на TopCoder этот элемент был бы реализован значительно удобнее, то написали бы об этом многократно за эти годы. Некоторые элементы правда реализованы, чтобы затруднить OCR. Мне кажется, что это обосновано. Тебе — что нет. В таком вопросе нет «прав не прав», это вопрос скорее вкуса. То, что за время существования КФ система взломов не превратилась в соревнование по запуску скриптов и не обросла мегатоннами негатива, говорит о том, что как минимум «ошибки» я не допустил.
Тебе кажется, что TopCoder значительно более ориентирован на участников? Я тебя умоляю. Их java-апплет запустить этот тот еще квест. Только здесь я видел 100500 постов вида «не могу запустить TopCoder-апплет». Я не знаю допилили ли они web-арену, но когда я несколько лет назад пытался ей воспользоваться, это скорее не работало чем работало. А как, кстати, реализованы взломы в веб-арене?
Кстати, напомню, что согласно правилам "запрещается использовать какие-либо технические способы ... единственный допустимый способ анализа взламываемого решения — его зрительный анализ." Я прошу участников (включая тебя) соблюдать правила. Те, кто их нарушают не правы. Я не заставляю тебя участвовать в раундах, это твое осознанное решение. Но я надеюсь на соблюдение правил. Обсуждения способов взлома/обхода как текущей системы, так и будущей будут без предупреждения стираться.
Суть моего поста в том, что решения на Javascript, даже достаточно простые (например, вывод строк в случайном порядке с абсолютным позиционированием, чтобы они были на месте) по защищённости не уступают решению на Flash, но не имеют связанных с ним проблем. Canvas — это уже в какой-то мере overkill.
Если браузерному плагину "Flash Player" можно выводить код решения на экран с целью его дальнейшего "зрительного анализа", то утверждение, что другому коду делать в точности то же самое нельзя, из правил совершенно не следует.
Существующая в TopCoder система взломов не превратилась в соревнование по запуску скриптов. Для вывода кода они используют CodeMirror с параметром
readOnly: "nocursor"
. Никакой другой защиты я у них не нашёл. У них даже исходники веб-арены выложены. Не понимаю, зачем Codeforces такое рвение к защите.Миша, я могу только про неудобство сказать — это всегда была самая глючная и неудобная часть сайта. Решения загружаются не всегда, скроллинг ужасен, шрифт тоже
Ну и в 2018 сравнивать себя с TopCoder (при всем моем к нему уважении, они же по сути начали давать понять людям, что с окончанием универа жизнь спортивного программиста не заканчивается) — идея не очень
У меня под Ubuntu в firefox не работают взломы. В chromium иногда работают, иногда нет. Я для себя считаю во время раунда, что взломов по сути нет и смотрю работают ли они сегодня только если вообще нечем заняться.
Мне кажется, этот диалог повторялся уже 100500 раз. "В линуксе не работает флеш" — "А установите Хром, это просто" — "В Фаерфоксе и Хромиуме не работает" — "Ну так установите Хром, это просто" — "Хрома нет в не-проприетарных репозиториях" — "Установите Хром, это просто". Напоминает диалог слепого с глухим, на лицо непонимание/несовпадение приоритетов (я, например, хочу у себя на компе чистую систему без непонятно что делающих blackbox'ов (да, Хром к ним относится, но не Хромиум)). Да, таких абсолютное меньшинство, но как мне кажется, использование Линукса сильно коррелирует с нежеланием использовать подобный софт.
С другой стороны, методы eatmore по вершению справедливости (IMO, граничащие с шантажом), мне тоже не нравятся (и жаль, если мои предыдущие посты этому как-то поспособствовали). MikeMirzayanov делает замечательную платформу, и пытаться заставить его приоритезировать какие-то feature requests — несколько странно.
Можно посмотреть на это с другой стороны. Предположим, что ты нашёл интересный сайт, но в верху каждой страницы у него большой мигающий баннер, который тебя задолбал. Что ты можешь сделать? Можешь уйти, но сайт интересный. Можешь продолжать терпеть. Можешь попросить админа убрать баннер. Но он отвечает, что это нормально. Что многие вешают на свои сайты большие мигающие баннеры, что так принято, что почти никто не жалуется. Что для этого даже специальный тег есть. А если сделать этот баннер немигающим, то никто не будет его кликать, так что это не пойдёт. Наконец, можешь поставить себе баннерорезку. И рассказать об этом, чтобы люди знали, что так можно. Хотя многие владельцы сайтов с этим не согласны. Некоторые даже в суд подавали. Не помогло.
вот честно, зачем все это? Реализовать базовую защиту на уровне верстки (не афишируя, чтобы не выглядело как поощрение), чтобы текст нельзя было выделить/скопировать, и все.
Среди людей, желающих повысить свой скилл, никто читерить не будет. А на всех остальных наплевать, высоких мест они в любом случае не займут. Даже если найдется несколько читеров, то улучшение интерфейса для всех остальных участников стоит того.
Не соглашусь с тем, что на одних взломах далеко не уедешь, особенно в див 2, где часто люди с меньшим количеством задач, но 30 взломами оказываются в топе таблицы. А вообще, из всех этих дискуссий напрашивается вывод о том, что лучший способ борьбы со сложившимися проблемами — отказаться от взломов на Codeforces. Не особо понятно, в чем их смысл, они только вносят дизбаланс, поднимая вверх людей, решающих меньшее количество задач, причем часто создатели контестов злоупотребляют этим и дают возможность взламывать на тестах с n=1/0, которые многие участники просто забывают заифать. Это не выглядит, как сбалансированная система по выявлению лучшего программиста, а просто долавляет какого-то лютого рандома. Кто вообще любит взломы?! От них одни проблемы!
P.S. Лично я использую safari, и каждый раз у меня прихватывает сердечко, когда приходится запускать хром, чтобы повзламывать)
я люблю, они веселые (и денег можно заработать).
Соглашусь, что плохо, что взломов обычно либо совсем нет, либо они пачками у того, кто первый успел, но вопрос "что с этим делать", на мой взгляд, для отдельной дискуссии.
Не спорю, не спорю, я просто так это тут написал, к обсуждению целесообразности взломов мой коммент не призывает. Но даже ваш пример как раз иллюстрирует то, что взломы вносят дизбаланс)
Я в другой ветке предлагал, повторю тут. Надо в div1 убрать взломы и сделать сильнее претесты.
Но ведь в div2 взломы больше проблем приносят
А на div2 Ренату пофигу.
.
В каком-то смысле. Я просто давно в див2 не был и понимаю, что мое мнение, что хорошо для его участников, а что нет, ничего не стоит. Но по моим воспоминаниям лет 10 назад, мне было полезно почитать чужой код и поискать в нем баги. Кстати, формат топкодера, когда это можно делать спокойно, не отвлекаясь на решение задач, мне больше нравится.
Взломы норм, просто авторам задач надо более глубоко их прорабатывать, чтобы они были идейные, а не
if n == 1
Тогда взломов почти не будет (хотя с моей точки зрения это хорошо)
.
Для того, чтобы не было ситуации, когда в комнате один человек сделал 10-15 взломов, можно было бы сделать ограничение вроде такого: первые 3 попытки взлома без задержек, а дальше перед каждой следующей попыткой нужно ждать 5 минут с предыдущей попытки. По идее, это даст возможность получить баллы за взломы не только первому человеку, который подумал "наверное, тут слабые претесты, поломаю ка я серых и зеленых", но и еще хотя бы 2-3 людям
Это просто какой-то странный костыль
Может, конкретно такой способ это странный костыль, но по-моему в том, чтобы дать возможность взламывать не только самому первому человеку из комнаты, смысл есть, потому что, как уже сказали раньше, сейчас взломы работают так, что либо взломов почти нет, либо в большинстве комнат есть человек с +5..+10 взломов из-за очень слабых претестов
Как еще один вариант решения можно понерфить взломы (правда, возможно это тоже своего рода костыль). Например, за первый взлом по задаче дается те же 100 очков. За второй взлом 50 и тд. Тогда пачки по 10-15 взломов не будут вносить такой дизбаланс, как сейчас. Или можно перед очередным взломом какого-нибудь решения проверить его на предыдущих взломах участника. Если решение прошло все предыдущий взломы, то взлом "идейный" и за него 100 очков, если же упало, то очков 20 (тк по сути за этот же тест очки уже начислялись).
А можно вообще убрать взломы и сделать сдачу задач по правилам ICPC...
либо оставить взломы в таком виде, как на TopCoder (отдельной фазой). В настоящее время Div3 и Educational так проводятся...
Если без взломов, лучше сделать чтобы стоимость задач зависела от количества решивших, как это происходит на некоторых других сайтах, чтобы бóльшую роль играла сложность решенных задач, а не время, за которое задачи были решены, потому что давать одинаковую стоимость A и D-E как-то глупо, ни у кого не будет стимула смотреть на D-E, если не решены все более простые. А если задачи еще и будут в случайном порядке как в ICPC, то какое-то время будет уходить на поиск самой простой задачи, чего в 2х-часовом контесте делать совсем не хотелось бы
Такое было на codeforces, называлось dynamic scoring. Правда, почему-то уже давно (с контестов порядка 320) его не используют.
Потому что координаторы сто лет не могли найти баланс, чтобы 500-1000-...-2500 не превращались магическим образом в 250-500-...-3500 со всеми вытекающими отсюда неприятностями.
никто не любит dynamic, потому что сложно выбрать, какую задачу решать не зная сколько за нее дадут потом баллов.