/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