Websoft

понедельник, октября 28, 2013

Online рейтинги обучающихся в курсах

На elearningpro.ru был задан вопрос: «Как создать рейтинг учащихся проходящих курс внутри самого курса?»
И Алексей Корольков и я уже неоднократно намекали на такую возможность в этом блоге!

Например (в хронологическом порядке):


Еще раз расписывать, зачем это надо не буду. Перечислю только что можно таким образом сделать:
  • Вывести рейтинг (выполнения отдельного упражнения или теста по разделу/курсу как в текущем модуле, так и в любом модуле/курсе);
  • Организовать «сбор идей» и обсуждение этих идей;
  • Организовать голосование.
Недавно прочел статью Елены Тихомировой «Чего не хватает в электронном курсе?». Так вот с помощью описанной ниже технологии к слайдам можно добавлять (и в последствии смотреть или печатать) комментарии, ставить лайки и выводить рейтинги слайдов с лайками. (есть рабочий прототип. Хотя в нем реализована более сложная задача – лайкаются варианты, написанные самими учащимися)

Итак, универсальный алгоритм в общем виде выглядит следующим образом:
  1. создаем таблицу в базе данных для хранения результатов.
  2. создаем 2 html-страницы (одна –для записи данных в таблицу, вторая – для выборки данных и манипуляции с ними).
  3. встраиваем эти страницы в курс.

Далее описание для связки WT 3 (c базой SQL) – CL2.7. Изначально конструкция делалась в WT2.7.

1. Создаем таблицу.
В разделе Дизайнер создаем новый Тип документов. Мы создали одну универсальную таблицу для всех курсов.
Примечание: чтобы в приведенном ниже примере вносить минимум изменений, делайте строго по инструкции. Не понравится – потом переделаете!
Имя объекта - course
Поля:
  • Поле: course. Название: course code. Тип поля: Строка. (сюда записываем код курса. Таблица используется для всех возможных курсов)
  • Поле: task. Название: task name. Тип поля: Строка. (идентификатор источника записи – любой текст идентифицирующий активность в курсе)
  • Поле: user. Название: user. Тип поля: Ссылка на объект. Объект: Сотрудник (идентификатор пользователя)
  • Поле: var_name. Название: var name. Тип поля: Строка (имя переменной, но уже сюда можно записывать некоторые результаты)
  • Поле: var_val. Название: var value. Тип поля: Строка (сама переменная)
  • Поле: date. Название: date. Тип поля: Дата (тоже переменная, но в формате даты)

В поля var_name и var_val можно записывать массивы переменных или текст неопределенной длинны.
Шести полей с указанными типами нам пока хватало!
Внимание! Чтоб система «увидела» таблицу потребуется перезагрузка сервера и перестройка каталогов (насколько я помню).



Результат выглядит вот так:

Главное что все данные доступны для редактирования администратором (цензура!).

2. Создаем html-страницу для сохранения результата (при условии что источник – упражнение/игра/тест уже созданы. Данные из них передаются в переменные).

В этой странице (к приведенному в конце статьи примеру) из курса передаются идентификатор сессии пользователя (sid – по которому определяется id пользователя) и переменная из курса (rez, который записывается в поле var_val).
Как передать значения см ниже.
Все остальное константы, которые вписываются непосредственно в стр и функция определения текущей даты.

3. Встраиваем страницу на слайд/кадр с помощью объекта Встроенное окно. Подробно механизм описан здесь.
Для сохранения данных Встроенное окно можно разместить за границами слайда.
Особенность: на кнопку, которая сохраняет результат, вешаем Действие JAVASCRIPT.


В последней строке Действие JAVASCRIPT: g_arSlideVars['url'] = window.location.protocol+'//sdo.voz.ru/webtutor/vb19/1/user/rez1.html?sid=' + g_sAiccSid+'&rez='+g_arSlideVars['rez_var'];
где:
sid=' + g_sAiccSid - идентификатор сессии пользователя
rez='+g_arSlideVars['rez_var'] – значение переменной на слайде rez_var.

Внимание! При первом импорте курса в WT на сервере создается папка с именем = код курса (в данном примере vb19. У нас эта папка создается здесь //sdo.voz.ru/webtutor! Как у вас – смотрите на сервере и меняйте в примере!!!

4. Создаем html-страницу для вывода данных.


Данные берутся из созданной таблицы и, в данном примере, выводятся в виде таблицы, а можно просто текстом, списком или графиком (о построении графиков я писал здесь).

5. Для вывода данных так же используем Встроенное окно. Наполняется окно точно как описано здесь на Действие JAVASCRIPT может выглядеть проще – g_arSlideVars['url'] = window.location.protocol+'//sdo.voz.ru/webtutor/vb19/1/user/rez2.html';



Вот и все!
Проект для примера здесь.

Предупреждения!
  1. Без достаточного опыта работы с КурсЛабом, WT и написания кода экспериментировать с данным примером не советую! (навряд ли что-то сломаете, но возможно разочарование).
  2. В примерах страниц для сохранения и вывода данных использован простейший код. Манипуляции с данными и их оформление – ваша ответственность.
  3. Страницы в примере настроены на кодировку utf-8 для WT 3.0.
  4. Аналогично можно настроить работу с системами отличными от WS (проверено), но создание таблицы и страниц будет подчиняться правилам уже тех систем.
Спасибо за внимание!
Вопросы и предложения в комментарии.

11 комментариев:

Павел Безяев (Webct) комментирует...

Спасибо! Отличная публикация! В ближайшее время надо попробовать :)

Эдуард Бабушкин комментирует...

Сергей, добавь еще в курс возможность участникам оценить курс по параметрам)
и мы решим ту задачку)
ну уж извини за приставания)

Эдуард Бабушкин комментирует...

а вообще идея то в воздухе витает:
можно ли предсказать успешность обучения по тому, как ученик курс проходит
Сергей, Павел, не слабо нам мозговой устроить?
мы же можем (вы можете, а я только могу думать) вытащить различные показатели деятельности ученика из курслаба, а по ним предсказать успешность / неуспешность
следовательно создать образ успешного ученика: что он должен делать при прохождении курса
задачка не слабая....

Виталий Фуфаев комментирует...

За статью огромное спасибо. Жаль только что пока подобное не будет встроено в коробку, такие рейтинги будут практически эксклюзивными среди компаний... Думаю с популяцией tin can подобное будет реализоваться массово.

Sergey Snegirev комментирует...

Сергей, спасибо большое за пример (тот ещё, с именем-фамилией). Основываясь на нем, мы только реализовали примерно то, что описано в этой статье. Даже туториал сделали (для заказчика).

У меня есть несколько вопросов по вашему алгоритму. То, что сделали мы, работает без нескольких шагов (и у нас, и у заказчика в живой системе). Поэтому я несколько волнуюсь - не упустили ли мы что-то очень важное?

Сейчас добавлю комментарий со сравнением алгоритма.

Сергей Колков комментирует...

Эдуард, а наши курсы пользователи и так оценивают по параметрам - Отзыв - это стандартный функционал WT. Правда оценка не в самом учебном модуле, а на портале.


Виталий, уже много говорилось, что технологии в СДО не главное! Ну ТинКан, ну и что?! Тем более, судя по описанию, эта технология позволяет собрать данные где-то. И вопросы остаются: как создать активность достойную сохранения информации о ней и как эти данные использовать - методические вопросы!

Sergey Snegirev комментирует...

Ок, по алгоритму.

Сначала про КурсЛаб. Вот что делает Сергей Колков:
- парсит текущий window.location, выделяет оттуда userID и sessionID
- сохраняет их в переменную
- формирует URL внешней страницы
- заменяет iframe src на сформированный урл

Вопрос: зачем нам userid и sessionid, если страница всегда лежит в одном месте?

Мы просто сделали iframe с готовым относительным адресом, который подгружается и страница выполняется. Без userid и без sessionid. Что мы упустили? Чем нам это грозит?

Спасибо!

Sergey Snegirev комментирует...

Что касается кода на внешней странице. Вот что у Сергея Колкова:
1. _session_id = Request.QueryString.sid;
2. cide = Session.cur_user_id;
3. ls20 = ArrayFirstElem(XQuery('for $elem in collaborators where $elem/id='+cide+' return $elem'));
4. Response.Write('...')

Зачем первая строка? sessionID нигде далее не используется. Или мы что-то упустили?

Заранее спасибо за ответы. Очень не хочется налететь на неожиданные грабли.

Сергей Колков комментирует...

М–да, Сергей, не в бровь, а в глаз!!!

Мне трудно, ответить на эти вопросы… первоначальная версия была собрана пару лет назад … почему и как – не помню… программист я никакой! Есть пара шаблонов их и минимально модифицирую под задачу…

По поводу относительной ссылки – у нас пользователи ходят по разным протоколам. Просто относительная ссылка не работала.
По поводу лишней строки – возможно атавизм. Проверю! Если сработает, будем считать оптимизацией кода ;)

Sergey Snegirev комментирует...

В итоге проект сдан. Из полезных для сообщества выводов:

1. Самое удобное - не пустые iframe, а подгружать страницу через AJAX ($.load или $.get).

2. Если вебсервер с WT кэширует контент, до базы можем не достучаться (получим страницу из кэша, xquery код в ней не выполнится) -- обязательно нужно добавлять timestamp к URL.

3. С точки зрения программиста, сохранять в базу StudentID вполне достаточно. С точки зрения менеджера, читать такую таблицу нереально. Сохраняйте заодно и установочные данные (ФИО, должность и т.п.) студента.

Сергей Колков комментирует...

Сергей, спасибо за ценные указания!

По поводу пп3. В WT тип поля user – «Ссылка на объект в базе». В результате хранится ID, а в WT видим ФИО.
Для не WT, конечно, надо добавлять ФИО и тп.