Google+

Tuesday, April 22, 2014

Баба ЕГЭ. Версия 1.1

Честно говоря, не столько из-за недостатка инструментов тестирования, сколько из любопытства подхватила я идею Бориса Ярмахова создать гибкий инструмент тестирования на основе Google-таблиц и Google Apps Script. Если говорить об удобных инструментах для тестирования, то в этот список можно внести NetTest  Константина Полякова и инструментарий Moodle, например. Но создать свое собственное детище,  во-первых, интересно, а во-вторых, это  возможность преодолеть те ограничения и недостатки, которые есть в готовых продуктах. А у имеющихся разработок можно позаимствовать удачные идеи и решения.
Дни с момента появления публикации Бориса Ярмахова были для меня днями "восстановления навыков вождения". JavaScript подзабыт, навыки профессионального программирования притупились. Так что не судите строго.

Какие изменения и дополнения внесены в версию Бориса Ярмахова?
  1. Вопросы можно сгруппировать в разделы. В тест попадут вопросы из каждого заданного раздела.
  2. Можно использовать вопросы с выбором ответа и с вводом короткого ответа
  3. Кроме формы с вопросами создается форма с правильными ответами для учителя. Эта форма затем поможет создать эталон для оценки теста с помощью Flubaroo
  4. Мелкие несущественные изменения, связанные с интерфейсом

Пока все. Для информатики (я учитель информатики), в принципе, этого достаточно. Именно в таком виде представлены части A и B в ЕГЭ. Для других предметов  надо думать и развивать идеи дальше.

Инструкция для создания теста:

1. Скопируйте таблицу Тест ЕГЭ Гибрид (Баба ЕГЭ), перейдя по ссылке. Скрипт для создания теста находится в таблице.
Слово "Гибрид" в название теста попало потому, что в одном разделе теста  вопросы по истории, в другом  по информатике, третий  вообще фиктивный. Извините, в режиме отладки жалко времени на не самую нужную работу. Вопросы по истории скопированы из таблицы.
2. Изучите структуру таблицы. Она проста: вопросы записываются в первый столбец (A), правильные ответы  в 6-й столбец (F). В столбец H во время работы скрипта будет записываться информация, этот столбец занимать не стоит. Для вопросов с выбором ответа в столбцы 2-5 (B-E) записываются ответы. Если в строке находится вопрос с вводом короткого ответа, то второй столбец (B) для этой строки обязательно должен остаться пустым. В таблице может быть несколько разделов. Не все разделы обязательно использовать в тесте, но разделы, из которых выбираются вопросы, должны идти подряд, начиная с первого. Это ограничение легко преодолеть, перемещая листы таблицы на момент формирования теста.
3. Замените вопросы на свои собственные.
4. Все дальнейшие шаги  в видеоинструкции.
5. После того, как скрипт отработает, ссылки на формы с тестом и ответами будут находиться на первом листе в ячейках H5 и H6 соответственно.


Удачи!

А сам скрипт такой:
//////////////////////////////////////////////////
// Тест с вопросами двух типов:
// выбор правильного ответа и ввод короткого ответа
// Основан на коде Б. Ярмахова "Баба ЕГЭ"
// Вопросы записываются в первый столбец таблицы
// Возможно формирование теста вопросами из нескольких разделов
// Ссылка на сгенерированную форму теста - в ячейке H5 первой таблицы
// Ссылка на форму с правильными ответами - в ячейке H6 первой таблицы
//////////////////////////////////////////////////////////
function onOpen() {
// Добавляем один пункт в меню теста
var ui = SpreadsheetApp.getUi();
ui.createMenu('Баба ЕГЭ_A_B')
.addItem('Задать параметры теста', 'setNumQuestions')
.addToUi();
}
function setNumQuestions() {
// Формируем и запоминаем введенные пользователем данные
var app = UiApp.createApplication();
var panel = app.createVerticalPanel();
app.setTitle("Создаем структуру теста");
var textBox1 = app.createTextBox();
textBox1.setName('myTextBox1').setId('myTextBox1');
var textBox2 = app.createTextBox();
textBox2.setName('myTextBox2').setId('myTextBox2');
var textBox3 = app.createTextBox();
textBox3.setName('myTextBox3').setId('myTextBox3');
var button = app.createButton('Отправить');
panel.add(app.createLabel("Количество разделов").setId("label1"));
panel.add(textBox1);
panel.add(app.createLabel("Количество вопросов в разделе").setId("label2"));
panel.add(textBox2);
panel.add(app.createLabel("Название теста").setId("label3"));
panel.add(textBox3);
panel.add(button);
var clickHandler1 = app.createServerClickHandler("respondToSubmit");
button.addClickHandler(clickHandler1);
clickHandler1.addCallbackElement(panel);
app.add(panel);
var doc = SpreadsheetApp.getActive();
doc.show(app);
}
function respondToSubmit(e) {
// Заносим в таблицу введенные данные - в H2, H3, H4
var app = UiApp.getActiveApplication();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var NumberOfSheets = e.parameter.myTextBox1;
var NumberOfQuestions = e.parameter.myTextBox2;
var NameTest = e.parameter.myTextBox3;
var numq = parseInt(NumberOfQuestions);
var numsh = parseInt(NumberOfSheets);
var s = ss.getSheets()[0];
s.getRange("H4").setValue(NameTest);
//Logger.log(numq);
//Logger.log(numsh);
for (k = 0; k < numsh; k++)
{
s = ss.getSheets()[k];
s.getRange("H2").setValue(numsh);
s.getRange("H3").setValue(numq);
}
// Вызываем функцию формирования теста
makeRandomTest(e);
return app.close();
}
////////////////////////////////////
function makeRandomTest(e) { // Основная функция - формирование теста
var day = new Date();
day.setDate(day.getDate())
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Берем данные о количестве разделов и вопросов из первой таблицы
var s = ss.getSheets()[0];
var num = s.getRange("H3").getValue();
var numsh = s.getRange("H2").getValue();
var NameTest = s.getRange("H4").getValue();
// Создаем две формы: с вопросами и контрольную - с ответами
var form = FormApp.create(NameTest).setDescription(day);
form.addTextItem().setTitle("Ваше имя?");
var FormAnswers = FormApp.create(NameTest + '. Ответы').setDescription(day);
////////////
for (k = 0; k < numsh; k++) // Цикл по количеству разделов
{
s = ss.getSheets()[k];
var rows = s.getLastRow();
var rowsNumbers = [];
for (j = 2; j <= rows; j++) {
rowsNumbers.push(j); //Формируем массив номеров строк с вопросами по порядку
}
Shuffle(rowsNumbers); // Перемешиваем номера строк (вопросы)
for (i = 0; i < num; i++) { // Выбираем первые num вопросов
var question = s.getRange(rowsNumbers[i],1).getValue(); // Вопрос
var answer = s.getRange(rowsNumbers[i],6).getValue(); // Правильный ответ
if ( s.getRange(rowsNumbers[i],2).getValue() == '') // Проверяем тип вопроса (A или B)
{
var item = form.addTextItem();
item.setTitle(question);
var itemAnswer = FormAnswers.addTextItem();
itemAnswer.setTitle(question).setHelpText(answer);
}
else {
var choice1 = s.getRange(rowsNumbers[i],2).getValue();
var choice2 = s.getRange(rowsNumbers[i],3).getValue();
var choice3 = s.getRange(rowsNumbers[i],4).getValue();
var choice4 = s.getRange(rowsNumbers[i],5).getValue();
var item = form.addMultipleChoiceItem();
item.setTitle(question).setChoiceValues([choice1,choice2,choice3,choice4]);
var itemAnswer = FormAnswers.addMultipleChoiceItem();
itemAnswer.setTitle(question).setChoiceValues([choice1,choice2,choice3,choice4]).setHelpText(answer);
}
}
}
var idForm = form.getId();
var idFormAnswers = FormAnswers.getId();
s = ss.getSheets()[0];
s.getRange('H5').setValue('https://docs.google.com/forms/d/' + idForm);
s.getRange('H6').setValue('https://docs.google.com/forms/d/' + idFormAnswers);
}
function Shuffle(o) {
for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
view raw BabaEge hosted with ❤ by GitHub

Friday, April 18, 2014

Готовимся к Единому Государственному Экзамену с Google и Бабой ЕГЭ

Главную в стране процедуру итоговой проверки знаний учащихся - Единый государственный экзамен особенно прозрачной не назовешь. Даже имена разработчиков большинства тестов остаются в строгой тайне, не говоря уже о возможности вступить с ними в диалог и получить какие-то разьяснения по наиболее сложным местам, касающихся тех или иных вопросов. О чем говорить, если за 12 лет проведения ЕГЭ не существовало даже официального списка уже “сыгравших” вопросов - их приходилось выуживать из не- и полуофициальных источников, что сплошь и рядом приводило к путанице и ошибкам. А ведь возможность работать с базой ранее использованных в предыдущих циклах ЕГЭ вопросов - это важнейший ресурс для подготовки школьников и инструмент для готовящих их преподавателей едва ли не во всех странах, где проводится стандартизированное тестирование! Не удивительно, что просьбы родителей и учителей создать такую базу звучали часто и настойчиво.




В феврале этого года наметился сдвиг - Федеральный институт педагогических измерений опубликовал вопросы, использованные в прошлые годы на ЕГЭ. Встает вопрос, как эти вопросы правильно использовать - ведь общее количество заданий в открытом банке насчитывает около 45 000 заданий - по всем предметам.


Для работы с банком как школы, так и отдельные преподаватели могут использовать проверенный инструмент - таблицы Google, которые можно использовать в качестве базы для создания неограниченного количества пробных тестов, а также Google скрипт “Баба ЕГЭ”, предназначенный для работы с вопросами такого типа.


С помощью таблиц мы можем скомпоновать любое количество вопросов из открытого банка, дополнить их вопросами, созданными по аналогии, скомпоновать их по типу сложности, по разделам и т.д. Рассмотрим, как это будет работать на примере вопросов из раздела A, где находятся задания на множественный выбор.


Итак, для создания системы проверочного тестирования нам понадобится таблица, в которую мы внесем формулировку вопроса, варианты ответов и указание на правильный ответ. 



Тестовый вариант такой таблицы с вопросами по истории можно скопировать перейдя по ссылке - скрипт находится уже в ней. Скопировав таблицу себе на диск, не забывайте авторизовать скрипт. Или же вы можете вставить программный код скрипта Баба ЕГЭ, скопировав его в самостоятельно созданную таблицу.



function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Баба ЕГЭ')
.addItem('Задать количество вопросов', 'setNumQuestions')
.addSeparator()
.addItem('Создать тест', 'makeRandomTest')
.addToUi();
}
function setNumQuestions() {
var app = UiApp.createApplication();
app.setTitle("Сколько вопросов должно быть в тесте?");
var panel = app.createVerticalPanel();
var textBox = app.createTextBox();
textBox.setName('myTextBox').setId('myTextBox');
var button = app.createButton('Отправить');
panel.add(textBox);
panel.add(button);
var clickHandler = app.createServerClickHandler("respondToSubmit");
button.addClickHandler(clickHandler);
clickHandler.addCallbackElement(panel);
app.add(panel);
var doc = SpreadsheetApp.getActive();
doc.show(app);
}
function respondToSubmit(e) {
var app = UiApp.getActiveApplication();
var textBoxValue = e.parameter.myTextBox;
var num = parseInt(textBoxValue);
Logger.log(num);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
ss.getRange("I2").setValue(num);
return app.close();
}
function makeRandomTest() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var headers = s.getRange(1, 1, 1, s.getLastColumn()).getValues()[0];
var rows = s.getRange(1, 1, s.getLastRow()).getValues();
var num = ss.getRange("I2").getValue()
var rowsNumbers = [];
for (j = 1; j < rows.length; j++) {
rowsNumbers.push(j);
}
Shuffle(rowsNumbers);
var day = new Date();
day.setDate(day.getDate())
var form = FormApp.create('Проверочный тест' + ' ' + day);
form.addTextItem()
.setTitle("Ваше имя?");
for (i = 1; i < num+1; i++) {
var question = s.getRange(rowsNumbers[i]+1,1).getValue();
var choice1 = s.getRange(rowsNumbers[i]+1,2).getValue();
var choice2 = s.getRange(rowsNumbers[i]+1,3).getValue();
var choice3 = s.getRange(rowsNumbers[i]+1,4).getValue();
var choice4 = s.getRange(rowsNumbers[i]+1,5).getValue();
var item = form.addMultipleChoiceItem();
item.setTitle(question)
.setChoiceValues([choice1,choice2,choice3,choice4]);
var idForm = form.getId();
ss.getRange('I3').setValue('https://docs.google.com/forms/d/' + idForm);
}
}
function Shuffle(o) {
for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
view raw BabaEge hosted with ❤ by GitHub

После того, как скрипт будет скопирован и авторизован, в интерфейсе таблицы появится новое меню - Баба ЕГЭ.


В этом меню две опции - Задать количество вопросов и Создать тест. Задавая количество вопросов, мы определяем какое количество вопросов будет в нашем пробном тесте. Опция Создать тест создает форму и случайным образом наполняет ее вопросами из нашей таблицы. Ссылка на созданную таким образом форму находится в столбце Количество вопросов, ссылка на форму.



Формой можно начинать пользоваться. Вот и все! Удачи на экзамене.


П.С.


Если у вас есть идеи и предложения по развитию и усовершенствованию этого инструмента - буду рад их услышать. Код открыт, добавлять к нему новый функционал может любой желающий.

Wednesday, April 16, 2014

Оценивание с Flubaroo - теперь по-русски!

Благодаря усилиям волонтеров-переводчиков сообщества “Учимся с Google” популярный скрипт для оценивания и подведения итогов проверочных работ Flubaroo теперь доступен и на русском языке. В настоящий момент локализованный скрипт доступен в старой версии таблиц, но мы надеемся, что после того, как будет произведено тестирование перевода, он появится и в приложении Flubaroo для новых таблиц Google. Скрипт Flubaroo - бесплатный и свободно распространяемый. Итак, чтобы установить локализованную версию Flubaroo, проделайте следующее:


1. В таблице с результатами оценивания, созданной в старой версии таблиц зайдите в Инструменты -> Коллекция скриптов и найдите Flubaroo.
Установите скрипт (в настоящее время актуальной является версия 3.11) и проведите его авторизацию.




2. Перейдите в Инструменты -> Редактор скриптов -> Flubaroo
В левой панели найдите файл langs.gas.gs и откройте его.




3. Полностью замените содержимое этого файла содержимым файла flubaroo-ru, который находится по этой ссылке и сохраните файл.


4. Вернитесь в таблицу с результатами оценивания. Из меню Flubaroo запустите опцию Выбрать язык и в выпадающем меню выберите Русский.




5. Скрипт локализован! Запустите его с помощью команды Произвести оценивание и пройдите все необходимые шаги настройки - все результаты будут видны в русском интерфейсе.






Редакция блога выражает глубокую благодарность Людмиле Рождественской и Александре Барышевой за участие в локализации Flubaroo на русский язык!

Wednesday, April 2, 2014

Автоматическая вставка изображения из блога в Google+


Тесная интеграция Blogger с социальной сетью Google+ привела к тому, что при публикации поста в блоггере система сама предлагает нам опубликовать ссылку на пост в Google+. В процессе публикации она пытается найти в нашей публикации какое-нибудь изображение, чтобы проиллюстрировать им наше сообщение в сети. Если она такое изображение находит - то у нас все хорошо. А если нет, то она берет ваш собственный юзерпик, увеличивает его в несколько десятков раз и вставляет в ленту.Поскольку юзерпики часто делаются в малом разрешении и просто не предназначены для масштабирования, результатом получается весьма размытая картинка. Если в вашем посте не предполагается никаких иллюстраций, то подберите картинку более или менее подходящую для вашего поста или опубликуйте в посте логотип вашего блога. 



Затем разместите ссылку на пост в Google+ и удалите картинку из поста. В Google+ пост появится с красивой картинкой, а в блоггере останется в том виде, в каком вы хотите его видеть.