Не существует универсального способа поимки читов, как и не существует универсального способа обмана игры. Это может быть весьма творческим процессом с обеих сторон, сильно зависящим от конкретной игры.
Читал где-то недавно, что один товарищ написал очень умного бота, который активно мочил NPC, но если в близкой окрестности появлялся живой игрок, то он останавливался, как будто игрок AFK. Но админы игры всё же заметили в его поведении и статистике что-то неладное, а чтобы поймать его на горяченьком, просто слегка сдвигали его на очень короткое расстояние во время боя. Короткие перемещения себя бот не замечал и в вычислениях не учитывал, на том и погорел.
Я приведу пример не про игры, просто из практики. Был некий сайт с голосовалкой. Страница голосования содержала длинный текст, в конце которого можно было проголосовать, разгадав капчу. Все действия пользователя в этом разделе сайта логгировались, а потом использовались для последующего поведенческого анализа. В частности, была очень простая метрика накруток: если голос оставлен меньше, чем через 5 секунд, то голос постфактум исключался. Разработчик специально проверил, что при самом тщательном усердии открытие страницы, промотка её до конца и ввод капчи не могут занять меньше 7 секунд.
Через год капчу решили заменить на интеграцию с соцсетями, и там тоже было много интересного. Куча голосов с аккаунтов, страницы которых выдавали 404 или имели имена типа Sljlffffq Ufewfhr. Распределение по странам у накрученных показывало 20-50% иностранцев, а распределение по времени суток было весьма нетипичным (специфичность конкурса означала, что 99% голосов будут не просто от русских, а вообще от москвичей в UTC+3). В общем, кто накручивал, тех было прям очень сильно видно. Более того, поиском в гугле по честным лидерам голосования можно было найти море упоминаний "прошу проголосвать" на тематических форумах, в аккаунтах соцсетей заинтересованных поддерживающих, а по накрутчикам вообще ничего не находилось, вообще никакого источника подобной активности нельзя было увидеть.
Так что укрыться от пристального внимания и детального анализа достаточно сложно, особенно если данные анализирует достаточно внимательный и дотошный человек.
TemaKam, ну значит реально есть что-то ещё. К слову, макось создаёт на неродных файловых системах файл .DS_store с какими-то данными, а при штатном создании zip-архивов в них ещё помещается какой-то мусор.
На самом деле в Linux тоже бывает POSIX extended attributes, возможно что-то подобное.
TemaKam, я лет 10 уже не щупал макось, да и тогда не особо в ней ковырялся, только решал спонтанные задачи. Поэтому не разбираюсь в её особенностях. Может, в ней acl просто через @ и показываются?
TemaKam, в Linux может отображаться @ как признак того, что это симлинк, при некоторых ключах ls, например, ls -F. Но у имени файла, а не около прав. При наличии нестандартных acl там будет +, а не @
Asriel, я думал речь об общении между ботами, а не о проверке токена. Ну так можно просто дёргать /getMe у бота по url или создав объект бота в любимой библиотеке и вызвать от него bot.get_me(). Но глубокого смысла такого действия не понимаю.
Думается мне, что на Heroku и текст будет английский, и формат вывода будет из Linux, и кодировка cp866 не при делах... Не говоря уже о том, что и самого ping может не быть в песочнице, в которой запускается приложение.
Можно и даже разумно класть информацию в какой-нибудь менеджер очереди типа rabbitmq (не вместо базы, а совместно с ней). Можно класть информацию об изменениях в отдельную таблицу в самой базе. Можно версионировать записи в таблице, поднимая version при каждом изменении (если используемая база поддерживает триггеры, это можно даже автоматизировать), тогда бот будет запрашивать записи с version больше последней известной.
Любой "аналог" это всегда условность. Дело в том, что S3 - это 1) протокол 2) функционал 3) конкретная реализация.
В своё время тестировал riak cs и в нём не было поддержки S3 SIGv4. К счастью, большинство клиентов S3 поддерживают принудительное использование SIGv2, поэтому было решаемо, но всё же. Это довольно простой и в то же время реальный пример отличий.
Поддержка протокола S3 означает, что сервис умеет отвечать на запросы в соответствии с протоколом, но насколько глубоко он поддерживается? Там можно назначать метаданные файлам, генерировать preshared url или поддерживается lifecycle policy?
С точки зрения функционала вообще есть ли в этом сервисе то, что нужно? Например, умеет ли он вообще удалять файлы по истечении TTL, даже если формальное назначение lifecycle policy проходит без ошибок?
И с точки зрения реализации не факт, что всё будет работать так же, как в AWS. Например, если в AWS положить миллион файлов, то он прожуёт спокойно. А если положить в minio миллион файлов на один уровень вложенности, то будет очень грустно. Всё потому, что minio хранит каждый файл в виде каталога с шифрованным blob и метаданных в json. Запрос списка файлов вызывает миллион вызовов stat, и это ни фига не быстро, особенно на HDD. Причём ни фига не очевидно, что так будет, если исходить только из наличия поддержки S3 и формальной информации о том, что миллион туда положить можно (да, можно, но если класть неправильно, будут нюансы).
Конкретно с Ceph не имел дело, а про HCP вообще первый раз слышу. Привёл общие соображения. Надо смотреть официальную информацию о поддержке фич (что поддерживается и насколько полноценно), гуглить опыт реальных пользователей, ну и, конечно, тестировать в своих условиях.
Причём тут упоминание NoSQL применительно к реляционной sqlite?
Иногда делают очень специфические решения для необычных задач. Например, Internet Archive хранит данные в виде архивов на диске - никакой базы.
Или вот если вспомнить почту, то dovecot хранит каждый ящик отдельно от других. Ещё бывают почтовики, у которых mailbox (все письма одним файлом длинной портянкой) или maildir (письма отдельными файлами с timestamp в имени).
Но в целом это неудобно для больших масштабируемых решений.
Да, чтобы это работало нормально (актуально резался спам, ничего не отваливалось итд), нужно постоянно следить и прикладывать усилия.
Когда какое-нибудь письмо о регистрации на Нужном Сайте не доходит до mail.ru - Нужный Сайт напряжётся и что-нибудь сделает. Когда оно не доходит на маленький сервачок - сайт пошлёт пользователя самого искать подходящих тараканов в своей конфигурации. Придётся осваивать навыки чтения логов, изучения документации по конфигам итд.
Но если всё же хочется, то рекомендую посмотреть на проект MailCow.
Данил, умные слова типа "колцо вычетов по модулю p" - это не так страшно. Это когда мы берём не все числа вообще, а только остатки от деления на p. И переопределяем основные операции: сложение берём по остатку, умножение тоже. Например, если p=7, то 2*4 mod 7 = 1.
В python так:
(2*4) % 7
Определённые подобным образом "сложение" и "умножение" обладают рядом свойств: коммутативность (a+b=b+a, a*b=b*a), ассоциативность (a+(b+c)=(a+b)+c) и некоторыми другими. Собственно, такое вот множество с двумя операциями и некоторыми особыми свойствами называют в алгебре кольцом.
Но всё это для задачи не очень важно. Тут достаточно просто брать остаток по длине словаря:
jcmvbkbc, нет, inline-функция это не макрос и не может содержать ошибок. Изначально inline-функции в C означали именно то, что они никак не вызывались (call/ret), а просто копировались в целевую функцию, чтобы избежать относительно дорогой операции вызова (особенно far call, когда вызов осуществлялся не в пределах сегмента по смещению, а с переходом в другой сегмент) для очень простых функций. Разумеется, это также означает, что экспорт inline-функции как символа в принципе лишён смысла.
inline-функция не должна компилироваться, её тело должно вставляться в нужное место программы и компилироваться каждый раз заново. Соответственно, ld её и не сможет увидеть никогда в принципе. Кстати, inline-функции надо описывать в h-файлах, а не c-файлах.
9 функций делать не надо. Достаточно одной функции, которая будет обрабатывать разные значения.