четверг, 30 октября 2014 г.

Мой учебник получил гриф УМО и другое прочее

Я в свободное от остальной деятельности время стал пописывать учебники. Началось все с того, что я когда был молодым и наивным преподавателем, и верил, что по каждой дисциплине должен быть готов УМК, который включает и конспект лекций. С этого и пошло... Потом я задумался, что зря пропадает. Выбрал, правда не с первого раза, электронное издательство. Сейчас работаю с издательством "Директ-Медиа" (www.bibioclub.ru). Вот список моих произведений (прошу прощения за дебильный "современный" дизайн).
Тут есть даже видео, которое получилось опять же случайно. Я вел дистанционно курс повышения квалификации. Лекции проходили в форме вебинаров. Но слушатели жаловались, что в рабочее время им неудобно - ходят посетители и пр. Пришлось продублировать - я записывал лекции отдельно, потом выкладывал. Потом опять стало жаль, что пропадает продукт. Оказалось издательство берет и видео.
Вот другой скриншот с сортировкой и информацией про ВУЗы, которые пользуются ресурсами.
Чемпион по просмотрам - учебник по базам данных. Он получился достаточно удачным. Недавно я представлял его для получения грифа от УМО. Эксперты тамошние мне выдали замечания, я исправлял. В принципе замечания мне понравились. Одно из требований было - расписать все по компетенциям. Я сделал как понимал. Теперь - после получения грифа, имею право посылать наш методический отдел ... Потому, что УМО одобрил. Вот историческая бумага.
Но это еще не все. В учебнике есть набор тестовых вопросов. Я решил применить навыки по созданию баз данных. Тестовые вопросы можно защитить не только авторским правом, но оформить их как интеллектуальную собственность. Получить свидетельство о регистрации базы данных. Очень модная тема сейчас. Требуется во всех отчетах и приравнивается к публикации. 


среда, 15 октября 2014 г.

Побеждаем планировщик задач

Я уже рассказывал про свои попытки настроить планировщик задач муцдле. Тогда так и смог решить проблему. Но есть хороший способ - отправить проблему в подсознание. Через какое-то время все равно оттуда всплывет. Главное, не забыть, что туда ее оправил ))) Забудешь - там и будет лежать... 
Я еще написал в форум мудла про проблему, получил от товарища следующий ответ

Это хостинг ?
Есть подозрение, что php.ini для веб-сервера и для php-cli разные. Это можно проверить сравнив вывод "php -i" с тем что показывает moodle в информации о php.
Есть другой способ - использовать wget/curl в cron 
 На всякий случай посмотрел, что такое wget. В википедии написано, что консольная программа для загрузки файлов по сети. Позволяет скачивать и загружать по сети любые файлы. После этого проблема и была отправлена в подсознание. Выдернуть ее оттуда пришлось, когда через пару дней стал получать сообщения на почту

/usr/local/cpanel/bin/jailshell: www.cp526266.cpanel.tech-logol.ru/public_html/moodle/admin/cron.php: No such file or directory
Во-первых удивился, что через несколько дней. Думал, изменились настройки хостинга. (Позже выяснилось, что письма попадали в спам и когда спам-корзина переполнилась, начали приходить в почту). Из сообщения видно, что скрипт пытается выполниться. Для начала проверил разрешения. Все оказалось правильно: везде стоит 755. Дальше попробовал запустить вручную, через браузер. Оказалось, запускается строка http://www.cp526266.cpanel.tech-logol.ru/moodle/admin/cron.php Исправил в кроме. Результат тот же.
Решил еще раз погуглить на тему /usr/local/cpanel/bin/jailshell: Оказывается, это оболочка для исполнения внешних команд. Пишут всякое разное. Еще раз попалась на глаза сообщение с командой wget. Интуитивно пишу в таблице крона строку
wget http://cp526266.cpanel.tech-logol.ru/moodle/admin/cron.php
В ответ получаю по почте сообщение
--2014-10-15 17:05:02--  http://cp526266.cpanel.tech-logol.ru/moodle/admin/cron.phpResolving cp526266.cpanel.tech-logol.ru... 91.195.124.142Connecting to cp526266.cpanel.tech-logol.ru|91.195.124.142|:80... connected.HTTP request sent, awaiting response... 200 OKLength: unspecified [text/plain]Saving to: “cron.php”
     0K .........                                              1.86K=5.3s
2014-10-15 17:05:19 (1.86 KB/s) - “cron.php” saved [10151]
Смысл примерно такой команда wget пытается соединиться с сервером хостинга, посылает ему запрос на скачивание файла admin/cron.php. данный скрипт запускается и выводит сообщения, которые команда пытается сохранить в файле "cron.php" Уже радует! Остается немного на всякий случай подавить вывод в файл, для чего в конце строки пишем -o null. И проверить в мудле (Раздел "Администррование"-> "Сервер" -> "Планировщик задач").
Видим отрадную картину.

Cron работает. Все мудловские задачи своевременно выполняются. Так-то!

понедельник, 13 октября 2014 г.

Лекция в Мудле.

Решил заполнить хотя бы один раздел курса. Посмотрел, какие элементы можно добавлять и увидел лекцию. Потыкался - потыкался... Понял, что своего рода мини-интернет: система страниц, тестовых вопросов, объединенная системой гиперссылок. Возник вопрос: зачем?
Почитал теорию.
ЛЕКЦИЯ преподносит учебный материал в интересной и гибкой форме. Состоит из набора страниц. Каждая страница может заканчиваться вопросом, на торый учащийся должен ответить. Последовательность переходов со страницы на страницу заранее определяется преподавателем и зависит от того, как студент отвечает на вопрос. В зависимости от правильности ответа учащийся переходит на следующую страницу или возвращается на предыдущую. На неправильные ответы преподаватель может дать соответствующий комментарий. 
Хорошо пройтись по этому элементу бритвой Оккама. По имени известного средневекового мозгоблуда схоласта Вильяма Оккама. В современном виде "бритву" формулируют так: "не умножай сущности без необходимости". Абсолютно все возможности, сами по себе, есть в самом мудле. Тогда в чем оригинальность? Только в том, что "в зависимости от правильности ответа учащийся переходит на следующую страницу"? Если это в директивной форме, то можно и поспорить, нужен ли такой жесткий контроль. Может он потом захочет вернуться. Если это не жестко закреплено - тогда возможностей и стандартного мудла хватит.

Оккам смотрит на тебя ...

четверг, 9 октября 2014 г.

Планировщик задач в мудле

Когда я в очередной раз установил, мудл, то обратил внимание на файл readme.txt, где содержались "рекомендации" по установке. Читаем
4) Set up a cron task to call the file admin/cron.php
   every five minutes or so.
Я знал, что cron - это планировщик задач в nix-овых системах. И что на него вешают все работы, которые должны выполняться периодически. Не думал, что в мудле есть такие. Кстати, возможность пользовательского доступа к планировщику задач - проверка качества хостинга. Далеко не все хостеры дают такую возможность.
Итак, надо в cron запускать скрипт admin/cron.php. Понятно, что его надо запускать через интерпретатор php. Служба тех.поддержки сказала, что запускать через строку
php - f путь доступа/cron.php
Хостер даже предоставляет интерфейс (есть такая функция crontab) для формирования заданий. Результат должен приходить мне на email.
Продуем. Вставляем в планировщик строчку
php -f /home/cp526266/public_html/moodle/admin/cron.php
В ответ получаем сообщение.
Web cron can not be executed as CLI script any more, please use admin/cli/cron.php instead
Оказывается, что CLI - Command Line Usage (Использование из командной строки) - специальный тип скриптов, который используется для системных задач. Немного гуглим. Как я понял CLI скрипты должны располагаться в специальной директории. Смотрим. Правильно, есть в мудле директория admin/cli. Меняем строку запуска в планировщике
php -f /home/cp526266/public_html/moodle/admin/cli/cron.php
Приходит сообщение
!!! <p>Error: Database connection failed</p><p>It is possible that the database is overloaded or otherwise not running properly.</p><p>The site administrator should also check that the database details have been correctly specified in config.php</p> !!!
 Не цепляет базу данных. Придется лазить по тексту. Залезаем в cron.php, видим строчку
require(dirname(dirname(dirname(__FILE__))).'/config.php');
Чтобы понять, что произошло, посмотрим описание функции dirname. "dirname — Возвращает имя родительского каталога из указанного пути". Авторы программы рассчитывали на то, что путь до родительского каталога будет состоять из трех уровней. Вроде правильно. Смотрим файл error_log.txt. Нам сообщают
09-Oct-2014 06:25:02 Europe/Moscow] PHP Warning:  mysqli::mysqli(): (HY000/2002): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) in /home/cp526266/public_html/moodle/lib/dml/mysqli_native_moodle_database.php on line 376
Ищем инфу по ошибке HY000/2002. Оказывается проблема в том, что MySQL не может соединиться с текущей базой потому, что занят сокет для сеанса. (Насколько я помню протокол TCP/IP для создания сеанса связи нужно устойчивое соединение - сокет). В доках рекомендуется либо очищать существующий сокет, либо создавать новый. Вообще написано, что MeSQL может работать либо через порт, либо через сокет. Через сокет создается безопасное соединение.
Смотрим программу mysqli_native_moodle_database.php. Строка 376
$this->mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbsocket);
Похоже. Откуда берется переменная dbsoket? Чуть выше находим строчки
// dbsocket is used ONLY if host is NULL or 'localhost',
// you can not disable it because it is always tried if dbhost is 'localhost'
if (!empty($this->dboptions['dbsocket'])
and (strpos($this->dboptions['dbsocket'], '/') !== false or strpos($this->dboptions['dbsocket'], '\\') !== false)) {
                       $dbsocket = $this->dboptions['dbsocket'];
            } else {
                       $dbsocket = ini_get('mysqli.default_socket');
}
Из которых следует, что в случае, если при название сервера первоначальное - "localhost", и название сокета пустое, то будет работать одна ветка оператора (которая работает сейчас), в противном случае другая. При том, что менять код очень бы не хотелось. Во-первых, судя по названию скрипт mysqli_native_moodle_database.php - основной драйвер базы данных, поэтому чревато. Во-вторых, это не системно: потом забудешь, никакие автоматические изменения использовать нельзя и пр. Надо придумать способ, как решить проблему, не меняя кода.
Другой вариант - переназвать  либо сервер, либо сокет. Вообще-то это делает при инсталляции мудла, но ведь в нашем распоряжении есть настроечный файл config.php. Изменяем название сокета. Не проканало. Увы.

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

Вечером читаю еще раз документацию. Оказывается есть версия для веб-запуска. В каталоге moodle/admin (Именно ее я пытался запустить через интерпретатор php в начале). Пробуем запустить скрипт через браузер. Как ни удивительно - Работает!!!

НО, я не могу повесить это задание на планировщик, потому, для автоматического режима надо скрипт гонять через интерпретатор php, см. начало и все повторится снова. Пока пусть так будет. Потом еще поразбираюсь.

понедельник, 6 октября 2014 г.

Дурная голова рукам покоя не дает.

Это я про свой гениальный план по экспорту вопросов, который излагал раньше. Напомню на всякий случай. Есть проблема: ввести в Мудл 200 вопросов для проведения итогового тестирования.
Вручную ввести не получилось. Человек занимался этим четыре дня. В итоге вопросов получилось 270. Так мало того, еще и номера дублируются.
Решил, что нельзя ждать милостей от природы. Надо подготовить вопросы отдельно и их импортировать. В результате экспериментов оказалось, что самым удобным форматом является формат GIFT. Он проще, чем всякие разновидности xml форматов. Проблема в том, что за каждый вопрос надо по инструкции начислять 2 балла. Я долго ползал по экспортированному файлу и докам - так и не нашел, где это ставится в формате. Придется все равно руками поправлять.
Файл для импорта я сделал довольно быстро и даже импортировал его. Задача оказалась в том, что мудле вопросы с одинаковыми номерами не пишутся поверх, они добавляются. В результате у меня получилось 500 с лишним вопросов. Разобраться в этой каше не было никакой возможности и я, как старый хакер, решил почистить вопросы руками, через систему управления базой данных мудла phpMyAdmin. Довольно легко нашел, где хранятся все вопросы, это таблицы mdl_questions и mdl_answers. Почистил их. Потом стал разбираться с долбанными 2 баллами - где они хранятся. В итоге вычистил одну лишнюю таблицу, и мудл перестал работать в той части где требовалось показать детально данные по каждому отдельному вопросу.
В результате выхода не осталось и я стал переустанавливать мудл. Тут я еще огреб себе проблем. Почему-то никак не выставлялся русский язык. Я пытался поэкспериментировать с версиями, подключить нашего системщика. Думал, что может, что-то не то с правами доступа. В итоге совсем озверел, залез в установочный файл install.php и программным образом насильно поставил русский язык. Попутно освоил как делать все остальные настройки: менять файл php.ini, чтобы быстрей работало, как привинчивать дополнительные библиотеки.
Сейчас во вновь установленную версию импортировал первые 30 подготовленных вопросов. Опять не без проблем, но все прошло удачно.  

суббота, 4 октября 2014 г.

Нам не дано предугадать, как наше слово отзовется.

Помнится, я раньше писал про то, что получил необычный заказ на репетиторство. Вот этот пост.  Суть состояла в том, что надо было студенткам-первокурсницам объяснить достаточно сложную тему. Я тогда еще возмущался по этому поводу.
Сейчас эта история закончилась. Получит от репетиторской компании следующее письмо 

Здравствуйте, Александр Николаевич!
В ходе телефонного разговора с клиентом (заказ №287189) мы получили следующий отзыв:Оценка: Отлично (5)Текст отзыва: Высшая математика,дискретная математика,1 курс 18 лет: Студентке оказалось достаточно одного занятия. Репетитор доступно объяснила нужный материал. Благодарим Вас за отличную работу! Желаем дальнейших успехов и профессионального роста!
Оно конечно, неплохо. Но так и не понял, что я ей объяснил )))

Лицензия Creative Commons
Произведение «Блог "Эффективное дистанционное образование"» созданное автором по имени А.Н.Гущин, публикуется на условиях лицензии Creative Commons «Attribution» («Атрибуция») 3.0 Непортированная.
Основано на произведении с an1954.blogspot.ru. на следующий (также выделен полужирным шрифтом):