/dev/shm
, т.е. для его работы без изменения
самого скрипта необходимо, чтобы в системе автоматически после загрузки
монтировался RAM-диск, если его нет, можно добавить в файл /etc/fstab
строчку:
none /dev/shm tmpfs defaults 0 0
list
, инициализируемую в начале скрипта, необходимо
занести другое расположение файла протокола.
Вопросы для каждого теста должны храниться в отдельных директориях. Удобно
хранить все эти директории в той же директории, в которой расположен файл
index.html
, являющийся, по-сути, интерфейсом к тестовой системе.
Для запуска теста с ученического компьютера, необходимо выполнить следующее:
<Enter>
;
Параллельно с прохождением учащимся теста в директории /dev/shm
создается файл, test-var.IP
, где IP
-- IP-адрес компьютера, на
котором учащийся проходит тест. В этот файл заносится следующая информация:
+
, если
ответ был верным, и -
в случае неверного ответа;
Подготовка тестов
Каждый вопрос теста должен иметь четыре варианта ответов, из которых лишь один
является верным. Количество вопросов может быть произвольным, кроме того, для
разнообразия вопросов одного и того же теста, предусмотрена подготовка
нескольких вариантов теста.
Для подготовки новых тестов необходимо выполнить следующие действия:
brkfl
,
предназначенный для разбиения заготовки на отдельные вопросы; скрипт имеет
следующий синтаксис:
brkfl NAME NUMQ NUMVAR
,
NAME
- имя файла-заготовки, NUMQ
- количество вопросов в
тесте, NUMVAR
- количество вариантов;
maxvar
следует занести количество вариантов теста (даже если вариант
один, следует записать туда единицу), а в файл total
-- количество
вопросов в данном тесте.
Для возможности запуска данного теста необходимо в корневой файл с
названием index.html
внести информацию о нем. Примеры тестов сопровож
даются соответствующим файлом. Обратите внимание на строку
<form name="choose" action=/cgi-bin/test-var method=post">Она сообщает серверу, что данные формы будут обрабатываться cgi-
test-var
, расположенным в директории /cgi-bin
сервера, а для
передачи данных формы используется метод post
. Для преобразования данных
в понятный для скрипта вид используется скрипт convert
(тексты скриптов и
образец файла index.html
приведены в приложении).
Если тест является единственным в своем роде, ему может соответствовать запись:
<input type=radio name="file" value="DIR"> Название теста<p>Вместо записи DIR необходимо занести название директории, в которую помещены вопросы соответствующего теста (желательно называть эти директории, не используя пробелов и русских букв). В поле Название теста можно поместить, при желании, количество вопросов в данном тесте.
Если же возникает необходимость сгруппировать тесты (например, несколько тем
одного предмета), в файл index.html
следует поместить следующую
информацию:
<input type=radio name="file" value="PREF"> <big><b>Предмет</b></big><p> <select name="fil"> <option value="SUF1">Тема 1 <option value="SUF2">Тема 2 .......................... <option value="SUFn">Тема n </select><p>В данном случае, когда учащийся отмечает «галочкой» нужный предмет и выбирает из выпадающего списка какую-либо тему (допустим, тему 1), название директории, из которой будут браться тестовые вопросы, формируется в виде
PREFSUF1
.
Т.е., если вместо PREF
Вы написали info
, а вместо SUF1
--
01algo
, тестовые вопросы будут извлекаться из директории
info01algo
. Следует иметь в виду такое именование директорий при
подготовке групп тестов.
Тесты с вариантами
Если учащиеся проходят тесты большой группой, не исключено, что они будут
подсказывать друг другу номера правильных ответов. Для того, чтобы это
усложнить, предусмотрена вариация вопросов внутри теста.
Выше уже говорилось, что если Вы подготавливаете несколько вариантов одного и
того же теста, вопросы будут иметь нумерацию вида Q-V
. При прохождении
учащимся теста с вариантами, для выбора очередного вопроса скрипт генерирует
случайное число V в диапазоне от 1 до числа, занесенного в файл
maxvar
. Число Q соответствует текущему номеру вопроса.
В результате, несмотря на то, что все учащиеся проходят один и тот же тест, вопросы с одинаковыми номерами у них будут разными.
Если же вариант теста один, скрипт просто перебирает по-очереди номера вопросов
от 1 до числа, занесенного в файл total
.
Ручная подготовка файлов
Если Вы желаете подготовить файлы вопросов теста вручную (без помощи скрипта
brkfl
), имейте в виду следующее.
maxvar
и total
, в которые заносится количество вариантов и количество вопросов
теста, соответственно, (см. п. на стр. ).
index.html
web-интерфейса тестов должны соответствовать описанию,
приведенному на стр. .
#!/bin/sh addr=$REMOTE_ADDR list=/dev/shm/test-var.$addr eval `./convert` echo -e "Content-type: text/html\n" cat header.txt if [ "$name" = "" ]; then echo "<a href=/Tests/index.html><h1 align=center>Введите ваше имя!</h1></a>" exit fi if [ "$file" = "" ]; then echo "<a href=/Tests/index.html><h1 align=center>Выберите тест!</h1></a>" exit fi [ "$num" = "" ] && num=1 total=`cat ../Tests/$file/total` maxvar=`cat ../Tests/$file/maxvar` if [ $num = 1 ]; then echo -e "\n\n\n" >> $list date >> $list echo -e "\n$name\t---\t$file\n" >> $list else echo -e "$[num-1]\t\c" >> $list fi [ "$last" != "" ] && last=$[$last % 11] if [ "$last" = "$a1" -a "$last" != "" ]; then echo "+" >> $list right=$[right+1] else [ "$last" != "" ] && echo "-" >> $list fi if [ $maxvar -gt 1 ]; then rnd_num=-$[`./rand $maxvar` + 1] else rnd_num="" fi if [ "$num" -le "$total" ]; then echo -e "<FORM NAME=\"Test\" action=\"/cgi-bin/test-var\" method=\"POST\">" i=0 echo -e "<h1 align=center>Вопрос $num из $total</h1>" CHKD="checked" while read Qwest do if [ $i = 0 ]; then echo -e "<h2 align=center>$Qwest</h2>" elif [ $i -lt 5 ]; then echo -e "<P><INPUT TYPE=RADIO NAME=\"a1\" $CHKD VALUE=\"$i\">$Qwest</P>" CHKD="" fi i=$[i+1] Answ=$Qwest done <../Tests/$file/$num$rnd_num num=$[num+1] val=$[`./rand` * 11 + $Answ] echo -e "<input type=hidden name=\"file\" value=\"$file\">\ <input type=hidden name=\"num\" value=\"$num\">\ <input type=hidden name=\"last\" value=\"$val\">\ <input type=hidden name=\"name\" value=\"$name\">\ <input type=hidden name=\"right\" value=\"$right\">" echo -e "<input type=submit value=\"Ответить\"></FORM>" else echo -e "<h1 align=center><font color=blue>$name!</font><p><p><p>\ Вы дали $right правильных ответов</h1>" BAL=`echo -e "scale=3\n oz=$right/$total\n if (oz<.5) 2 else if (oz<.7) 3 \ else if (oz<.9) 4 else 5"|bc` echo -e "<h1 align=center>Ваша оценка: \ <font color=red>$BAL</font></h1><p><p><p>\n" echo -e "<h3 align=center><a href=/Tests/index.html>Вернуться</a></h3>\n" echo -e "\n\n\t\tИтоговая оценка:\t$BAL\n\n\n\n\n" >> $list fi echo "</body></html>"Скрипт convert
#!/bin/sh #Converts Data sent by method Post or Get #into stdout like param1 name1 param2 name2 etc. if [ "$REQUEST_METHOD" = "POST" ] ; then QUERY_STRING=`sed "s/\\\`/_/g"` fi line=`echo $QUERY_STRING|sed 's/&/ /g'` for pair in $line do name=`echo $pair|sed 's/=/ /g'|awk '{print $1}'` type=`echo $pair|sed 's/=/ /g'|awk '{print $2}'|\ sed -e 's/%\(\)/\\\x/g'|sed 's/+/ /g'` printf "${name}=\"${type}\"\n" doneОбразец файла index.html
<html> <meta http-equiv="Content-Type" content="text/html; charset=koi8-r"> <title>Электронные тесты</title> <body alink="#000099" vlink="#993300" link="#006600" style="color: rgb(0,0,0); background-color: rgb(153,153,153);" text="#000000" bgcolor="#999999"> <form name="choose" action=/cgi-bin/test-var method=post"> <h3 align=left>Введите ваше имя: <input type=text size=100 name=name></h3> <hr> <h1 align=center>Выберите, какой из тестов вы хотите пройти:</h1> <h3 align=left>Астрономия</h3> <input type=radio name="file" checked value=astro1> Астромия (сферическая астрономия), 20<p> <input type=radio name="file" value=astro2>Астрономия (основы космологии), 20<p> <h3 align=left>Математика</h3> <input type=radio name="file" value=math2>Входной срез по математике, 14<p> <input type=radio name="file" value=math1>Итоговый тест по высшей математике, 27<p> <input type=radio name="file" value=it><big><b>Информационные технологии</b></big><p> <select name="fil"> <option value=01>Информационные технологии (информация), 8 <option value=02>Информационные технологии (файловые и операционные системы), 12 <option value=03>Информационные технологии (обработка текстовой информации), 11 <option value=04>Информационные технологии (электронные таблицы), 9 <option value=05>Информационные технологии (редактирование изображений), 8 <option value=06>Информационные технологии (специализированные приложения), 10 <option value=07>Информационные технологии (алгоритмы и основы программирования), 13 <option value=08>Информационные технологии (язык С), 14 <option value=09>Информационные технологии (АСУ), 8 <option value=10>Информационные технологии (Элементы АСУ), 10 <option value=11>Информационные технологии (Сетевые технологии), 12 <option value=12>Информационные технологии (Моделирование и прогнозирование), 12 <option value=end>Информационные технологии (итоговый тест), 20 </select><p> <h3 align=left>Информатика</h3> <input type=radio name="file" value=inform2>Информатика (итоговый тест), 12<p> <h3 align=left>Спецтехнология</h3> <input type=radio name="file" value=automatisation> Автоматизация деревообрабатывающего производства, 17<p> <input type=submit value="Пройти тест!"> </form> </body> </html>Скрипт brkfl
#!/bin/sh # Разбивает сложный файл с большим количеством вопросов и # ответов на маленькие # ./brkfl <файл> <кол-во вопросов> <кол-во вариантов> # # во входном файле вопросы располагать последовательно: # все вопросы первого варианта, ... , # все вопросы последнего варианта NUMEROFLINES=6 # Количество строк на вопрос cntr1=1 # счетчик var=$3 # Количество вариантов num=$2 # Количество вопросов file=$1 # Название файла mysplit(){ cntr=1 if [ "$1" != "" ]; then pref=$[ $[ $1 - 1 ] * $NUMEROFLINES * $num ] # postf="-$1" else pref=0 postf="" fi while [ "$cntr" -le "$num" ] do echo -e "\t\tВопрос $cntr" head -n $[ $cntr * $NUMEROFLINES + $pref ] $file|\ tail -n $NUMEROFLINES > $cntr$postf cntr=$[ $cntr + 1 ] done } if [ "$var" = "" ]; then mysplit else while [ "$cntr1" -le "$var" ] do echo "Вариант $cntr1" mysplit $cntr1 cntr1=$[ $cntr1 + 1 ] done fi