CYBER-PHYSICAL TECHNOLOGY OF EMERGENCIES MONITORING V.N. Ruchkin, B. V. Kostrov, A.N. Kolesenkov
The paper presents theoretical and experimental research in the field of development and application of systems challenges cyber-physical emergency monitoring. Designed cyber-physical technology monitoring of natural and man-made disasters. Proposed information and algorithmic support cyber-physical fire monitoring system. Is a block diagram cyber-physical fire monitoring system. The technology is realized through the creation of intelligent telecommunications structures based on neural MB7707.
Key words: cyber-physical technology, emergency, remote sensing, sensors, fire, decision-making, clustering, MW 7707, neuro-processor.
Kostrov Boris Vasilevich, doctor of technical sciences, professor, kostrov. b. vaevm.rsreu.ru, Russia, Ryazan, Ryazan State Radio Engineering University,
Ruchkin Vladimir Nikolaevich, doctor of technical sciences, professor, v. ruchkinarsu. edu. ru, Russia, Ryazan, Ryazan State Radio Engineering University,
Kolesenkov Aleksandr Nikolaevich, candidate of technical sciences, docent, [email protected], Russia, Ryazan, Ryazan State Radio Engineering University
УДК 681.3.06
АВТОМАТИЗИРОВАННАЯ СИСТЕМА ВЕРИФИКАЦИИ ПРОГРАММНЫХ ПРИЛОЖЕНИЙ
Н.И. Савин, Е.И. Бредихин
Рассмотрены принципы построения АСВПП, записанных на алгоритмических языках программирования, и реализации алгоритмов. АСВПП позволяет повысить эффективность обучения методологии программирования и освоения семантических и синтаксических конструкций языка. Приведены примеры использования АСВПП.
Ключевые слова: верификация, программа, семантика, синтаксис, алгоритмический язык.
Данная система (далее АСВПП) создана для решения задачи автоматизации проверки программных реализаций заданий, сформулированных определенным образом. Система размещается на удаленном сервере и предоставляет пользователям web-интерфейс для получения заданий, отправки решений, форум, справку по функциям особенностям оформления решений и возможность авторизации. Решения могут быть записаны на языках Visual C++ 2008/2010, C# и Python 2.7. АСВПП создана на основе принципов, заложенных в таких широко известных проверяющих системах, как Contester, Timus Online Judge, El Judge и др. [1-3].
260
Отличительная особенность данной системы заключается в том, что она позволяет проверять не только реализацию алгоритмов, но и использование выразительных средств языка программирования, заданных в условиях задачи, а, следовательно, и достичь высоких показателей в эффективном освоении методологии программирования в условиях процесса обучения.
Структурная схема системы
Укрупненная схема серверной части системы приведена на рис. 1.
Представление задач в серверной части системы.
Основная единица обработки в системе - это задача. Задача состоит из следующих частей.
Условие задачи.
В условие включаются: описание того, что нужно сделать; ограничения на время исполнения и требуемый объем памяти; необходимые участки кода (опционально), которые обязательно присутствуют в итоговом коде задачи; образец каркаса программы (опционально).
Web-интерфейс
- Регистрация
- Авторизация
- Отображение условий заданий
- Прием заданий
- Отображение результатов
проверки заданий
- Отображение
справки
Î .
Проверяющая
часть
База данных решений
Среда изоляции
База данных заданий
Задание
Папка задания
1
Tests
¡nfo.txt
-ь
¡ndex.html
Проверяющая программа
Рис. 1. Структурная схема серверной части системы
Проверяющая программа или набор тестов
Каждая задача в системе должна быть представлена как отдельная папка, имя которой совпадает с именем задачи. Все задачи хранятся в отдельной папке.
Элементы в папке с задачей:
info.txt - информация о задаче (сложность, ограничения по времени, по памяти); index.html - страница с условием задачи; /tests - папка с входными и выходными данными к задаче (тесты).
Проверяющая программа (далее ПП) используется в одном из вариантов в виде исполняемого файла или в виде скрипта Python и может читать вывод программы пользователя из файла "out.txt", входные данные из файла "in.txt" и эталонное решение из файла "pattern.txt" (если требуется).
Пример проверяющей программы на языке Python.
pattern = open("pattern.txt","r") userüut = open("out.txt","r")
if int(pattern.readline().split()[0])==int(userüut.readline().split()[0]):
print "yes"
else:
print "no"
Если ни одна проверяющая программа не найдена, производится проверка по тестам.
Дополнительно подключаемые папки и файлы. Папки - содержат подключаемые файлы для языков C++, C#, Python, (подключаются опционально) -/includes_cpp; /includes_csharp; /includes_python.
Файлы main.cpp,main.cs, main.py подключаются опционально. Если файл main создан, то код решения пользователя вставляется системой на место #USERCODE# в этом файле, и решение проверяется в таком виде.Этим необходимо пользоваться, если по условию задания пользователю нужно реализовать конкретную конструкцию языка, например, функцию или класс.
Примеры типовых задач
Примеры приводятся для языка Visual С++ 2010. Алгоритмические задачи проверяются путем компиляции исходного кода пользователя и последующей проверкой результатов исполнения программы на наборе тестов или с помощью ПП. Задачи на владение парадигмой объектно-ориентированного программирования, на знание синтаксиса и семантики языка проверяются путем подстановки сформированного кода пользователя в заготовку( один из файлов main.cpp, main.cs или main.py), спроектированную составителем соответствующего задания, которая затем также компилируется и проверяется системой.
Далее приведены примеры на некоторые методологические и выразительные средства языка.
Пример на применение инкапсуляции
Существует класс Dog, который содержит private переменную std::stringBreed.
Требуется реализовать методы voidSetBreed(std::stringbreed) и std::stringGetBreed(), которые позволят получать и устанавливать значения этой переменной. Для формирования такой задачи разработчику задания потребуется спроектировать файл main.cpp, в котором необходимо будет объявить и частично реализовать данный класс и отметить место, куда должны быть вставлены методы, написанные пользователем. Проверки правильности реализации можно предусмотреть в функции main() и при необходимости добавить файлы тестов.
Файл main.cpp (создается разработчиком задания). #include <iostream> #include <string>
class Dog {
private:
std::string Breed; public: Dog(){} #USERCODE#
// сюда система автоматически подставит методы
//пользователя };
intmain() {
Dog *a = new Dog(); std::stringbr; std::cin>>br; // чтение очередного теста a->SetBreed(br); std::cout<<a->GetBreed()<<std::endl; return 0; }
Пример теста: /tests/1-input.txt: Labrador /tests/1-output.txt:Labrador
Пример решения, отправляемого пользователем: voidSetBreed(std::string breed){ Breed = breed; } std::stringGetBreed(){ return Breed; }
Пример на реализацию метода класса
Задан класс Triangle, который содержит переменные float x1, x2, x3, y1, y2, y3, представляющие координаты вершин треугольника на плоскости. Требуется реализовать метод floatgetPerimeter(), который вычисляет периметр треугольника.
Для создания такой задачи потребуется файл main.cpp, который необходимо будет поместить в папку с задачей и в котором необходимо будет частично реализовать класс Triangle и отметить место, куда будет вставлен метод, написанный пользователем. Кроме того, необходимо добавить заданные проверки в функции main() и добавить тесты в папку tests в папке с задачей.
Файл main.cpp. #include <iostream>
#include <string>
class Triangle {
private:
float x1,x2,x3 ,y1,y2,y3; public:
Triangle(float _x1, float _y1, float _x2, float _y2, float _x3, float _y3) {
x1 = _x1;x2 = _x2;x3 = _x3;
y1 = _y1 ;y2 = _y2;y3 = _y3; };
#USERCODE#
// сюда система автоматически подставит
//метод пользователя };
intmain() {
float x1,y1 ,x2,y2,x3 ,y3;
std::cin>> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
// чтениеочередноготеста
Triangle *tr = new Triangle(x1, y1, x2, y2, x3, y3);
std:: cout<<tr->getPerimeter() <<std:: endl;
return 0;}
Особенности построения основных компонентов системы
Задание на компиляцию программы пользователя
Формат команды компилятору VisualC++ 2010в программе на языке
Python
command = 'call ' + + vcPath + + '&cl ' + '"' + usrCppPath + '"' + \
incl + ' /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib"'+ \ ' /02 /GL /FetmpWusr_prog.exe /Fotmp\\usr_prog.obj /EHsc /link /SUBSYSTEM:WIND0WS /ENTRY:WinMainCRTStartup' res = os.popen(command)
Формат команды компилятору C# в программе на языке Python
command = csPath + '\\csc /target:winexe
/r:mscorlib.dll /main:MainClassNamespace.MainClass /out:"{0}"
{1}'.format(scriptPath+'\\tmp\\usr_prog.exe',
scriptPath+'\\tmp\\usr_prog.cs')
res = os.popen(command)
Подавление системных сообщений об ошибках Во время выполнения программ пользователей могут возникать критические ошибки, перехватываемые операционной системой, например деление на 0 или обращение в запрещенную область памяти. Это приводит к появлению окна (рис. 2) на серверной машине, что препятствует ее нормальной работе.
C++ConsoleApp licatioiTl0.exe
Прекращена работа программы "С+ +ConsoleApplication10.ехе"
Windows осуществляет поиск способа устранения зтой ошибки...
Отмена
Рис. 2. Окно сообщения об ошибке
Для предотвращения появления этого сообщения данного окна каждая программа, написанная пользователем, запускается в оболочке следующего вида.
#include <windows.h> #include <iostream> usingnamespacestd;
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPSTR lpCmdLine, intnCmdShow) {
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX | SEM_NOGPFAULTERRORBOX); main();
return 0; }
Функция SetErrorMode() отключает появление таких окон из программы пользователя, а функция main() - соответственно из программы пользователя. Аналогичная оболочка реализована и в C#. Для Python и других интерпретируемых языков она не требуется, так как для них все ошибки перехватываются интерпретатором.
Модуль изоляции проверяемой программы
Особую проблему при создании автоматизированной системы проверки решений представляет обеспечение достаточного уровня ее безопасности. Так как программы пользователей выполняются на серверной машине, очевидно, что необходимо ограничивать их права для предотвращения несанкционированного доступа к ресурсам системы.
Известны несколько подходов к решению данной проблемы. Разработанная система использует стандартные механизмы защиты Windows и включает следующие шаги.
Каждый процесс решений помещается в объект работы JobObject с максимальными ограничениями и запускаются от имени специально созданной учетной записи пользователя ContestSystem, у которого имеются минимальные права. Во время выполнения решения постоянно отслеживается превышение заданных ограничений по времени или памяти, и в случае такого превышения процесс пользователя немедленно завершается.
При правильной настройке указанный подход обеспечивает приемлемый уровень защиты. Форум
В системах тестирования используется форум, где пользователи могут общаться и задавать вопросы по задачам. В АСВПП предусмотрена возможность отключения форума на время проведения соревнований по очевидным причинам.
Реализация системы
При реализации АСВПП использована технология объектно-ориентированного программирования на языке Python 2.7.8 [4,5]. Web-интерфейс реализован с использованием свободно-распространяемого web-фреймворка Flask [6,7]. Среда изоляции программ реализована на языке C++ с использованием функций WinAPI [8,9]. Для сервера реализован графический интерфейс на языке C++/CLI. Web-интерфейс.
Web-интерфейс реализован на Python 2.7.8 с использованием Flask микрофреймворка для создания веб-приложений. С помощью Flask можно реализовать практически любой web-интерфейс для приложения. Например, данный код создает web-приложение, которое отображает строку "Hello World!" на странице, доступной по ip-адресу компьютера: from flask import Flask
app = Flask(_name_)
@app.route("/") def hello():
return "<b>Hello World!</b>"
if_name_== "_main_":
app.run(host='0.0.0.0')
Серверная часть системы
При получении решения пользователя на обработку сервер создает новый поток и формирует запрос в очереди потоков на проверку, как только подходит очередь потока, в нем выполняются проверка решения и обновление базы данных решений. Укрупненный алгоритм работы сервера проиллюстрирован на рис. 3.
Рис. 3. Алгоритм работы серверной части системы
Среда изоляции исполнения проверяемой программы
Для запуска скомпилированных программ-решений используется среда изоляции (файл newSandbox.exe в папке tmp). Ограничение прав программ осуществляется на уровне WinAPI и направлено на предотвращение выключения сервера, запуска процессов, получение доступа к файлам, и.т.п. Кроме того, здесь выполняется проверка на превышения ограничений по объему памяти и процессорному времени. Основное приложение устанавливает связь со средой изоляции на основе технологии клиент-сервер.
Разработанная система прошла испытания на кафедре вычислительной техники ТулГУ и показала соответствие поставленным целям и достаточно высокий уровень эффективности.
Список литературы
1. Описание системы Contester. [Электронный ресурс]. URL: http://www.contester.ru/faaTa обращения 08.12.2015).
2. Описание Timus Online Judge. [Электронный ресурс]. URL: http://acm.timus.ru/ (дата обращения 08.12.2015).
3. Описание олимпиад по программированию МФТИ. [Электронный ресурс]. URL: httpéJ¿acm.mipt.ru/ (дата обращения 08.12.2015).
4. Лутц М. Программирование на Python, том II, 4-е издание. Пер. с англ. СПб.: Сим-вол-Плюс, 2011. 992 с.
5. Электронный ресурс Python [Электронный ресурс]. URL: https : //www .python. org/ (дата обращения 08.12.2015).
6. Grinberg M.Flask Web Development: Developing Web Applications with Python. 2014. 258 c.
7. Описание технологии Flask [Электронный ресурс]. URL. http://flask.pocoo.org/ (дата обращения 08.12.2015).
8. Рихтер Дж. Windows для профессионалов: создание эффективных Шт32-приложений с учетом специфики 64-разрядной версии Windows / пер. с англ. 4-е изд. СПб.: Питер. М.: Изд-во «Русская Редакция», 2008. 720 с.
9. Электронный ресурс Microsoft Developer Network [Электронный ресурс]. URL: https://msdn.microsoft.com (дата обращения 08.12.2015).
Савин Николай Ильич, канд. техн. наук, доц, savin949@gmail. com, Россия, Тула, Тульский государственный университет.
Бредихин Егор Игоревич, бакалавр, [email protected], Россия, Тула, Тульский государственный университет
A UTOMA TED SYSTEM FOR VERIFICA TION OF SOFTWARE APPLICA TIONS
N.I. Savin, E.I. Bredikhin
The principles of construction of the automated software verification system (ASVPP) for programs recorded on the algorithmic programming languages, algorithms and implementation. ASVPP improves the effectiveness of the training program and methodology for study of semantic and syntactic structures of language.
Key words: verification, program, semantics, syntax, algorithmic language.
Savin Nikolay Ilich, candidate of technical sciences, docent, savin949@gmail. com, Russia, Tula, Tula State University,
Bredikhin Egor Igorevich, bachelor, [email protected], Russia, Tula, Tula State University