Тут мала бути якась ілюстрація, але автор не знайшов дотепного малюнка, тому, наразі, тут нічого немає.
Виявилося, що роботи учасників обласного туру олімпіади з програмування (до речі, уже розділили програмування та інформаційні технології на два окремих напрямки змагань) ніхто не перевіряє вручну. Учням видали логіни та паролі і вони мали свої роботи відправляти на якийсь сайт, де відбувалася автоматична перевірка. А так як у мене часу було вдосталь — тур тривав 4 години, впродовж яких я, здебільшого, нудьгував — то не встромити носа туди не міг. Тож про безпристрасне суддівство піде мова у цьому дописі.
Отже, у Сумському державному університеті хтось спромігся запустити в роботу суддю Дреда комплекс ejudge, прикрутивши до нього gcc, g++, fpc та tpc. Ejudge працює на Linux і як вони запхали туди Turbo Pascal Compiler мене дуже цікавить. Крім того, воно GPL і доступне для скачування всім охочим спробувати хакнути систему. Але розмова не про те.
Головна вимога до коду — уведення та виведення інформації через файли. Бо там ніхто не сидить і не запускає все вручну. Ну і обмеження на використання пам’яті та часу. Учасник відправляє свій код і ejudge компілює його та намагається запустити, підсунувши на вхід тестовий файл. Потім шукає результат і порівнює його з шаблоном. Сходиться — win. Не сходиться — ніхто не буде копатися у твоєму гівнокоді, виявляючи, що у тебе не так, просто маєш нуль за завдання. Досить строго. Досить наближено до реальності — у великих проектах твій код повинен чітко відповідати специфікаціям і нікого не хвилює. Справді, впоралися мало хто. Більше двох завдань із чотирьох повністю ніхто не розв’язав. Учні скаржилися, що багато часу займає підгонка програми під ту систему. Я сам кодити туди не пробував — ліньки, хоча і мав під боком резервні незадіяні логіни.
Так ось, поліз я на офіційний сайт цього ejudge, почав читати і прикидати, чи не зможу я поставити його собі. Wiki з інструкціями наявне, крім того, є одне застереження, що сисема потенційно вразлива, так як запускає на виконання код користувачів. Для того, щоб лімітувати його можливості прочитанням вхідного і записом вихідного файлів, треба поставити їхній патч на ядро. Що мене і непокоїло — ставити на ядра невідомо звідки патчі якось не хочеться. Почав цікавитися про наявність інших штатних рішень для цього, prapor вказав на cgroups. Виявилося, що це розробка Google і входить в ядро Linux, починаючи із версії 2.6.24. А у RHEL 6 та його похідних йде з коробки. Ну і згадав, що Google проводить свою олімпіаду з програмування, дозволяючи учасникам писати та відправляти код на багатьох мовах, автоматично перевіряючи роботи. Отже, вони мали таку-ж ситуацію. Ось таке от безпристрасне суддівство.