Секция 7 - MATLAB в образовании и Интернете (1250002), страница 9
Текст из файла (страница 9)
MATLAB в образовании и ИнтернетеНиже приведен листинг вводной части функции radiation с изменениями, которые необходимо произвести, чтобы удовлетворить перечисленным требованиям. Для входной структуры мы используем название ins,что является сокращением слов «input structure». В завершение своей миссии расчетная функция должна сформировать текстовую строку rs. Ее название происходит от слов «return stream», что буквально означает «возвращаемый поток». Этот поток направляется непосредственно веб браузеру клиента, минуя промежуточную запись на жесткий диск сервера, однакопри локальной отладке приложения возвращаемое значение rs можно использовать, например, для сохранения на диск компьютера в виде HTMLфайла.function rs=radiation(ins)% Диаграмма направленности излучения частицы.% Веб вариант.% Считываем исходные данные из структуры insbeta= str2double(ins.beta);alpha= str2double(ins.alpha)*pi/180;azimuth = str2double(ins.azimuth);elevation = str2double(ins.elevation);k= str2double(ins.k);% ===================================================Последующий текст функции radiation не нуждается в правке, за темисключением, что необходимо запомнить дескриптор рисунка для дальнейшей записи рисунка в графический файл.
При этом полезно сделать рисунок «невидимым», чтобы сэкономить ресурсы сервера на открытие окнас рисунком, которое пользователь Интернета все равно не мог бы увидеть.% Открываем невидимое графическое окно.f = figure('visible','off');hold on;В самом конце текста функции нужно добавить еще несколько строк,чтобы сформировать возвращаемую текстовую переменную rs, а также записать сгенерированное изображение на жесткий диск компьютера. Однако прежде полезно выполнить еще несколько подготовительных мероприятий по обработке входных параметров.Рекомендуемая практика программирования для Интернета предполагает, что введенные данные должны пройти хотя бы минимальную проверку перед их использованием.
В разделе 4 мы кратко обсудим способыпроверки входных данных на стороне клиента. Однако такая проверка невсегда возможна. Злонамеренный пользователь имеет возможность обойтипроверку на стороне клиента, введя входные параметры непосредственно вадресной строке веб браузера. Поэтому еще одну проверку необходимоделать на стороне сервера, в тексте программы MATLAB. Как минимум,необходимо убедиться, что все обязательные параметры заданы, а числовые значения лежат в допустимых пределах. Ниже приведен усовершенст1865Труды II научной конференции «Проектирование инженерных и научных приложений в среде MATLAB»вованный вариант вводной части функции radiation с проверкой входных данных.function rs=radiation(ins)% Диаграмма направленности излучения частицы.% Веб вариант №2.% Проверяем исходные данные из структуры ins.es.count = 0;if( isfield(in, 'alpha') )alpha = str2double(in.alpha);if( ~isnumeric(alpha) | alpha < 0 | alpha > 180)es.count = es.count+1;es.description{es.count} = ['Значение alpha='...in.alpha ' вне допустимого интервала.'];elsealpha= alpha*pi/180;end;elsees.count = es.count+1;es.description{es.count} = ['Параметр alpha не '...'задан.'];end;Для краткости мы ограничились проверкой одного параметра, ноаналогичным или иным способом следует проверить значения всех входных параметров.
Информация о выявленных ошибках здесь сохраняется вструктуре es. При обнаружении ошибки увеличивается счетчик ошибокes.count, а пояснительный текст записывается в элемент массиваes.description. Если после проверки всех параметров значение es.count будет больше нуля, выполнение задачи следует прекратить, сформировав изструктуры es возвращаемую текстовую переменную rs. Эту задачу решаетфункция getError, используемая всеми учебными задачами, которые размещены на сайте MATLAB.tutornet.ru:function rs = getError( es )TXT = '';for loop=1:es.countTXT = [TXT '<LI>' es.description{loop} '</LI>'];endrs = [sprintf('Content-type: text/html\n\n')...'<html><HEAD>'<META HTTP-EQUIV="Content-Type" '...'CONTENT="text/html; '...'charset=windows-1251"></HEAD><body>'...'<p>Ошибки MATLAB:</p>'...'<OL>' TXT '</OL>' ...'</body></html>'];% end of getErrorMessageЗдесь следует обратить внимание, что возвращаемая строка rs должна начинаться с заголовка 'Content-type: text/html', который служит указа1866Секция 7.
MATLAB в образовании и Интернетением на тип возвращаемого потока, а именно на то, что это текстовый поток.Аналогичным образом текстовый поток с результатами расчета формируется функцией getHtml. Она используется в том случае, когда проверка входных параметров не выявила ошибок. Выбор функции, возвращающей текстовой поток rs, производится в соответствии со значениемсчетчика es.count.
Таким образом, в заключительную часть расчетнойфункции radiation в первом приближении достаточно добавить всего несколько строк:% ===================================================if( es.count )rs = getError( es );elsers = getHtml( ins, gs );end;% end of radiationКак видно из приведенного текста, помимо входной структуры,функции getHtml нужно передать еще один параметр gs. Это еще однаструктура. Она содержит информацию о графическом изображении, сформированном расчетной функцией.
Для формирования структуры gs мы используем общую для всех приложений функцию getGS, которая описана вследующем разделе.Передача структур в аргументах функций чрезвычайно продуктивна,так как позволяет легко решить проблемы, возникающие при обновленииверсий функций, как вызываемых, так и вызывающих. При передачеструктур между функциями обычно удается обеспечить обратную совместимость версий и параллельную работу как старых, так и обновленныхприложений, что чрезвычайно важно для веб приложений, поскольку онидолжны непрерывно находиться в работоспособном состоянии. При использовании общих для сайта библиотечных функций типа getError,getHtml, getGS или saveBitmap (см. ниже) разработчик конкретной задачиосвобождается от забот по адаптации своего приложения для размещенияна сайте.
При обновлении общих функций мы стремимся обеспечить обратную совместимость версий без изменения способа вызова таких функций, неизбежного, например, при изменении числа аргументов. Это позволяет вводить в действие новые версии без единовременного обновлениявсех приложений. При этом расширение возможностей общих функцийобеспечивается путем добавления новых полей к существующим структурам и инкапсуляции выбора сценария, соответствующего конкретной версии, в библиотечную функцию.1867Труды II научной конференции «Проектирование инженерных и научных приложений в среде MATLAB»3.
Подготовка графического выводаДля ускорения отклика веб сервера на запрос веб клиента на сайтеMATLAB.tutornet.ru используется кэширование сгенерированных рисунков на жесткий диск компьютера, на котором установлен веб сервер. Послепроверки входных параметров производится вызов функции getGS.
Онаопределяет, имеется ли в КЭШе (т. е. на диске компьютера) файл с графическим изображением, соответствующим набору входным параметров.Функция getGS возвращает структуру gs:gs = getGS( ins );Возвращаемая структура содержит имя графического файла с расширением (gs.filename) и без расширения (gs.name), его тип (gs.type), признак наличия файла в КЭШе (gs.isexist) и еще ряд полей. Имя файла(gs.filename) вычисляется на основе входной структуры путем конкатенации имен полей и их значений, после чего базисная часть имени (т. е. имяфайла без расширения) шифруется по алгоритму MD5:% Вычисляем имя файла из входной структуры.names = fieldnames(ins);for k=1:length(names)field = names{k,1}(:)';value = getfield(in, field);switch field% Игнорируем параметры, не влияющие на рисунок.case {'mlmfile', 'mldir', 'mlid'}case {'format'}case {'userAgent', 'host', 'hash', 'search'}case {'availHeight', 'availWidth', 'bufferDepth'}case {'colorDepth', 'height', 'width'}case {'cpuClass', 'platform', 'mediabox'}otherwise% Добавляем параметр и значение к имени.name = [name '(' field value ')'];end % switchend % for% Шифруем имя файла.name=md5(name);Шифрование гарантирует, что имя файла не превышает заданное ограничение по длине имени (64 байта) при том, что два идентичных наборазначений параметров всегда отображаются на одну и ту же зашифрованную строку, используемую в качестве имени файла (gs.name).