Задача
Історія
Це був початок зими. Після свят, зібравшись на роботі, ми знайшли коробочку невеликого розміру та чорного кольору. На одній із сторін знаходився невеликий екран, біля якого був напис «PROJECT-BETA», а на зворотній – порт Ethernet-адаптера. Ніхто не міг згадати, як вона могла тут опинитися (після свят діло було). В першу чергу, ми, звісно, підключили її до свого свіча та побачили, що в мережі з’явився новий пристрій зі своєю IP-адресою. Просканувавши його порти, виявили відкриті в діапазоні 20015-20115. Підключившись telnet-ом до одного із них, отримали деяку текстову інформацію, і тут нам в черговий раз вирубили світло. Було вже досить пізно, тому ми пішли додому, але коробку від свіча не відключали.
Наступного дня, зайшовши в офіс, ми відчули запах горілого з кімнати, де стояла коробка. Відключивши її від свіча, звернули увагу на екран. Він був пошкоджений, але можна було розібрати напис «GEND P0 1_30 2 _1 50_ 3 P2 1502 1». Повторні спроби підключити «PROJECT-BETA» до свіча результатів не дали: він тільки грівся, напевно полетіла система охолодження. Нічого не лишалося, як її розібрати, тим паче ніхто заперечень не виявляв.
Усередині ми знайшли модулі флеш-пам’яті, а на одному із чіпів був напис PicoJava-IV-core. Припустили, що ця залізяка є нічим іншим, як Java-машиною. Зробивши дамп флеш-пам’яті, ми відшукали в ньому щось схоже на файли класів. Спробували їх запустити на своїй JDK версії 1.6 – не вийшло, оскільки знайшлися деякі недокументовані інструкції. Через це довелося написати свій модуль завантаження (ClassLoader), що модифікує байт-код перед використанням. Це нам дозволило запустити програму.
Як виявилося, «PROJECT-BETA» є ігровим сервером, клієнтами якого є пристрої з назвою Sapka. Що таке Sapka, невідомо: Google нічого не сказав. Після кількох експериментів із запусками сервера стало зрозуміло наступне.
- Кожна Sapka повинна мати унікальне ім’я.
- Sapka повинна бути сконфігурована. Дані про конфігурацію відправляються за допомогою токенів типу CFG12345678901234567890.
- Токени конфігурації можуть бути знайдені в пам’яті сервера, доступ до якої захищений паролем.
- Прямий доступ до певних ділянок пам’яті можна отримати за допомогою токенів прямого доступу (DMA tokens), наприклад, DMA12345678901234567890.
- Рівень доступу до пам’яті серверу залежить від поточної конфігурації Sapka та введених токенів прямого доступу.
- Основним завданням Sapka є функціонування в режимі запуску (активується командою launch).
- Формат даних, що отримуються в режимі запуску, залежить від конфігурації Sapka.
- При переході в режим запуску Sapka включається в гру. Гра розрахована на визначену кількість учасників і починається незалежно від того, чи вони підключилися, чи ні, після 5 секунд від запуску сервера “PROJECT-BETA”.
- Переможець гри визначається за кількістю набраних балів. Інфомацію щодо правил нарахування балів можна знайти в самому сервері.
Постановка задачі
Ваше завдання полягає в програмній реалізації пристрою Sapka та його конфігурації.
PROJECT-BETA лежить тут: ftp://sapka:sapka@stanfy.com.ua/project-beta-1.6.zip
Також PROJECT-BETA скоро буде лежати і тут: http://code.google.com/p/sapka-contest-09/downloads/list
Версія для друку цього завдання лежить тут ftp://sapka:sapka@stanfy.com.ua/sapka-task-1.3-ukr.pdf
Опис сервера
Для запуску сервера, використовуються скриптові файли start.sh / start.bat.
Вони запускають наш модуль завантаження, з іменем файла конфігурації у якості параметра. Файл конфігурації (за замовчуванням) має ім’я server.properties. В папці lib лежать необхідні для запуску Java-бібліотеки, вони підключаються в сриптових файлах. В папці maps лежать файли, що використовуються ігровим сервером. Для роботи сервера необхідною і достатньою умовою є встановлений в системі пакет JRE 1.6.
У файлі конфігурації можуть бути задані наступні параметри:
# Path to the map file map = maps/simple
Префікс імен файлів, що використовуються при запуску ігрового сервера.
# Ports for clients client.ports = 20015, 20016
Список портів, до яких можуть підключатися пристрої Sapka. Їхня кількість визначає кількість учасників у грі.
# Trace output file trace.out = trace.out
Ім‘я файла, куди записуються дані про перебіг гри.
# Result output file result.out = result.out
Ім’я файла, куди записуються результати гри.
# Visualizer port, it's never waited for visualizer.port = 20090
Порт для спеціального пристрою Visualizer, ще одному варіанту пристрою, що може підключатися до PROJECT-BETA, якому відсилаються ті самі дані, що зберігаються в trace.out.
# Flag to wait for all clients before starting the game or not (true = 'yes' | 'true' | 'y') client.wait = yes
Прапорець, що дозволяє призупинити старт гри, до моменту підключення всіх Sapka.
# Flag to wait the first visualizer visualizer.wait = no
Прапорець, що дозволяє призупинити старт гри, до моменту підключення хоча б одного пристрою Visualizer.
Відображення стану гри
З версії сервера 1.3 додано відображення стану гри на сервері. Для запуску сервера з відображенням використовуйте скрипти keyboard.bat/keyboard.sh. Параметри: teamname config-tokens graph-mode-flag keyboards-count.
teamname - ім’я команди
config-tokens - токени конфігурацїї
graph-mode-flag - ‘yes’, ‘y’ - вмикає “гарненьке” відображення
keyboards count - кількість клавіатурних клієнтів
Конфігурація сервера при проведенні змагання
Будуть використовуватися наступні параметри сервера:
map = maps/xxx client.ports = 20015, 20016 [, 20017, 20018] trace.out = trace.out result.out = result.out visualizer.port = 20090 client.wait = no //Сервер стартує гру через 5(п‘ять) секунд після запуску. visualizer.wait = no
Важливо
При проведенні змагання не буде можливості використовувати DMA-токени, та команди memconfig (про неї ви дізнаєтеся більше від самого PROJECT-BETA).
У якості унікального імені пристрою необхідно використовувати ім‘я своєї команди, замінивши пропуски на знаки підкреслення або дефіси.
Токени, які ви будете знаходити, залежать від вказаного імені пристрою (teamname), тому виберіть його одразу.
Рекомендованою першою командою при проведенні змагання є
launch teamname cfg-token[#cfg-token …]
Вона сконфігурує ваш пристрій відповідно до вказаних імені команди та токенів і під‘єднає до гри.
Правила завантаження рішень
При першому завантаженні вам буде повернено унікальний ідентифікатор вашої команди, який необхідно використовувати для подальших завантажень. При завантаженні рішення, одразу проходить його валідація: перевірка на наявність файлів з іменем команди, контактів, файла contest/bin/run та відповідність структури каталогів наступній схемі.

Опис елементів структури:
- рішення повинно бути запаковано у ZIP-файл
- у корені цього файлу повинна лежати папка contest.
- файл team складається з назви команди (одна строка)
- файл contact складається з контактних e-mail адресів та імен участників (по одному контакту на строку у форматі Ivan Ivanov <iVanov@gmail.com> ). Перша строк а файлу - основний (капітана) з котрим можна буде зв’затися у разі чого.
- У папці bin має бути один або два файли - run та install(install - не обов’яковий), плюс, до цього усього - те, що вони мають запускати. Тобто ваши бінарники, чи интерпретуємі файли повинні лежати тоже у цій папці. Яущо мова интерпретуєма, то можна все залишити у src, як вам більше подобається.
- У папці src мають бути ваші сурси. Крім того, у файлі readme можете написати що-нибудь цікаве, наприклад які бібліотеки використовуються та навіщо.
Запуск ваших рішень буде робитися наступним чином:
cd contest if test -r bin/install ; then chmod +x bin/install bin/install fi chmod +x bin/run bin/run hostname port
Скрипт запуска буде виконуватися під користувачем user (не root).
Live CD
Для тестування прийнятих рішень ми будемо використовувати систему на базі Ubuntu, аналогічну тій, що доступна на Live CD. Там у нас є користувач stanfy (пароль - також stanfy), під ним, без яких-небудь запитів про логін/пароль, і виконується вхід до системи.
Для того, щоб отримати права суперкористувача, необхідно виконати
sudo -i
і, увівши пароль stanfy отримати рутові права. Це знадобиться, якщо вам доведеться налаштувати Live CD.
У системі є такі бібліотеки
| java | Sun JRE | 1.6.0_12 |
| c/c++ | GCC | 4.3.2 |
| haskell | GHC | 6.8.2 |
| php | 5.2.6 | |
| ruby | 1.8.7 | |
| perl | 5.10.0 | |
| scheme | MzScheme | 4.0 |
| python | 2.5.2 | |
| c# | Mono | 1.9 |
| caml | Ocaml | 3.10.2 |
| caml | Camlp4 | 3.10.2 |
| lisp | Sbcl | 1.0.18 |
Завантажити Live CD можна з торрентів - thepiratebay чи freeexchange.ru
Якщо з торрентів ніяк, тоді можете спробувати з нашого серверу ftp://sapka:sapka@stanfy.com.ua/sapka-cd-0.2.iso. На не український трафік діють обмеження.
Для перевірки завантаження використовуйте md5 (5b713e289d058e07f485f5b9ec73ab0c)
На Live CD рішення не повинно компілюватися, але має запускатися і корректно працювати. Порядок запуску рішень дивіться у розділі “Правила завантаженні рішень”.
Обов’язково протестуйте ваше рішення на Live CD. З досвіду - не протестував у цільовому середовищу, значить - не працює. Не забувайте про це.
Раунди та час
Рішення будуть прийматись з 18:00 13-го березня до 18:00 20-го березня. Усі відіслані вами розв’язки будуть брати участь у Main раунді змагання та визначенні двох переможців - нульове місце та перше. Нульове місце, звичайно, престижніше: у програмістів все починається з нуля.
Крім цього буде окремо проведено Overclock раунд серед рішень, прийнятих у перші три дні змагання до 18:00 16 березня, де також будуть визначенні переможці.
Росподіл призового фонду між переможцями буде зробленний наступним чином.
Тестування та результати
Після 18:00 20-го березня ми йдемо у глубоке тестування всього того, що ви нам прислали, процес автоматизовано, але за ним потрібно слідкувати. А може ви там вірусного коду понаписували та засабмітили до нас! :)
Через тиждень 29 березня на Codecamp’09 у Києві ми оголосимо результати та дамо до всього публічний доступ. До цього, скоріш за все, ми покажемо пару цікавих виступів учасників.
Якщо переможець не зможе приїхати до Києва на оголошення результатів, то він всеодно залишеться переможцем з усіма привілегіями, нагородами та призами.
Жучки, проблеми та спілкування
У работі чорної коробочки іноді трапляються баги (оскільки JVM у неї не рідна), і ми за час спілкування з нею навчилися їх виправляти. Вся взаємодія по таким питанням буде проходити через issue tracker проекта на google code.
Різні питання, зауваження, пропозиції та все, що прийде вам у голову, ви можете висловлювати в гугл групі.
Оперативне спілкування між учасниками - через IRC канал irc://freenode/sapka. Ми там тож будемо.
Сервер: irc.freenode.net, Виконати команду: /join #sapka, Кодування: cp1251
Гарантовані канали спілкування issue tracker и гугл група.
