タグ: Moodle

  • Moodleサイト移行

    ホスト名の変更を行う手順メモ

    1. メンテナンスモードにする
      sudo php moodle/admin/cli/maintenance.php --enable
    2. バックアップ
      • データベース
      • HTML
      • moodledata
    3. レガシーメンテナンスモードにする
      sudo php moodle/admin/cli/maintenance.php --disable
      sudo php moodle/admin/cli/maintenance.php --enableold
    4. サイト移行ツール(admin/tool/replace)へのアクセス
    5. メンテナンスモードを解除

    移行中「動作環境」「サーバチェック」で max_input_vars が足りないとワーニングが表示された。修正するために php.ini を編集したものの有効にならなかった。fpm を使用している場合には /etc/php-fpm/ 以下を設定すること。

  • Moodleのログを解析向けに出力するカスタマイズ:mod_quiz編

    mod_quizにこだわって分析したい場合のカスタマイズをまとめておく。端的にはこの記事の続編である。今回からはUNIX VMを準備するのはやめ、Ubuntu on Windows10で開発環境を構築している。XAMPとかVMWare Playerをインストールする必要がなくなり素晴らしい。対象は、mod/quiz/review.php, mod/quiz/report/{attemptsreport_table,attemptsreport}.phpである。
    前提として、もしPHPスクリプトでどのようなクエリを発行しているのか知りたければ、各スクリプト冒頭のrequire群の後に以下を追加すればよい(だいたい後悔するのがオチである)。相変わらずたいしたことはやっていない。

    [code]$DB->set_debug(true);[/code]

    (さらに…)

  • 「倫倫姫アップデート2015: 学認連携Moodleの利用拡大と運用の改善」が大学ICT推進協議会2015年度年次大会優秀論文賞を受賞しました

    情報倫理eラーニング教材の開発と運用における改善をまとめたものが評価されました。ありがとうございます。開発と運用にご尽力いただいている皆様、利用機関の皆様にこの場をお借りして深く感謝いたします。今後も継続的な改善を進めて行く所存です。

    1 題 目
    倫倫姫アップデート2015: 学認連携Moodleの利用拡大と運用の改善

    2 著 者
    上田浩(京都大学/国立情報学研究所),中村素典(国立情報学研究所)

    3 選考理由
    著者らは,情報倫理教育のためのコンテンツである「倫倫姫」を学認連携Moodle上で継続的に運用してきている。本論文では,コンテンツのアップデートと運用する際に問題となった点の改善点について報告している。コンテンツについては,教育の実効性を高めるため,Moodleの利用制限 (Conditional Activities) 機能を用いて総合テストのみ受講することを不可能とするよう改良した。また,教材構造を改良し,関責任者が受講記録を確認するときのシステム負荷の低減を実現した。教育の実効性と運用の効率性を高めるための有益な情報を提供しており,高く評価できる。

  • ibdata1肥大化解消

    学認連携Moodleのibdata1は11GBになっている。よく言われることだが、InnoDBはOSがどのていどのファイルを扱えるか認識できない。肥大化が困るのは、ファイルシステムを食い潰すことであり、最適化したとしても縮小することはない。一度ダンプからリストアするしかない。また、ファイルごとに.idbを作成する「innodb_file_per_table」が効果があるとされており、my.cnfに

    [code]
    innodb_data_file_path = ibdata1:1G
    innodb_file_per_table
    [/code]

    を記述するという2009年の記事が見られるが、MySQLマニュアルを見ると、MySQL 5.6からこれがデフォルトになるそうだ。つまり、自動的にテーブルごとの.ibdを作成してくれるということである。先日のシステムメンテナンスで学認連携MoodleはMySQL 5.7にバージョンアップした。学認連携Moodleのデータディレクトリを見てみると、

    [code]
    -rw-r—– 1 mysql mysql 8720 3月 8 04:19 mdl_workshop_aggregations.frm
    -rw-r—– 1 mysql mysql 147456 3月 8 04:20 mdl_workshop_aggregations.ibd
    -rw-r—– 1 mysql mysql 9260 3月 8 04:19 mdl_workshop_assessments.frm
    -rw-r—– 1 mysql mysql 147456 3月 8 04:20 mdl_workshop_assessments.ibd
    -rw-r—– 1 mysql mysql 9222 3月 8 04:19 mdl_workshop_assessments_old.frm
    -rw-r—– 1 mysql mysql 163840 3月 8 04:20 mdl_workshop_assessments_old.ibd
    [/code]

    のように、ダンプをリストアする作業を行っていないのもかかわらず、夜中のmysqlcheck時に自動的にこのようになっているようだ。つまりmy.cnfは一切変更する必要はない。

    「innodb_data_file_path = ibdata1:1G」について、このサイズを越えたらどうなるのか見当がつかないので、明示的な固定サイズは止めることにした。しかしながら今のままの肥大を続けるのは良くないので、データベースのダンプをリストアする作業は必要である。この結果、ibdata1は11Gから79Mとなり、消費メモリが劇的に減少した。

    security-learning のメモリ使用状況。メンテナンス後は空きメモリが劇的に増加している。
    security-learning のメモリ使用状況。メンテナンス後は空きメモリが劇的に増加している。

    作業手順は次の通り。この記事の流れが非常に参考になった。
    (さらに…)

  • Moodleのログを解析向けに出力するカスタマイズ

    と言っていいものか分からないが、行ったことをまとめておく。大したことはやっていない。SCORM受講ログの取得に十時間以上かかってしまったし、コースログの取得はPHPのmemory_limitとのたたかいであった。やはりPHPはパフォーマンスの問題がある。Try & Error の開発がしやすいこととのトレードオフなのだろうが…。

    1. ユーザ名を特定困難、識別可能な内部IDで出力する
      [code]— course/lib.php.20151020 2015-10-20 11:26:45.000000000 +0900
      +++ course/lib.php.20151016 2015-10-16 19:34:45.000000000 +0900
      @@ -424,7 +424,7 @@
      $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid");
      $row[] = $OUTPUT->action_link($link, $log->ip, new popup_action(‘click’, $link, ‘iplookup’, array(‘height’ => 440, ‘width’ => 700)));

      – $row[] = html_writer::link(new moodle_url("/user/view.php?id={$log->userid}&course={$log->course}"), $log->userid);
      + $row[] = html_writer::link(new moodle_url("/user/view.php?id={$log->userid}&course={$log->course}"), fullname($log, has_capability(‘moodle/site:viewfullnames’, context_course::instance($course->id))));

      $displayaction="$log->module $log->action";
      if ($brokenurl) {
      @@ -531,7 +531,7 @@
      $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid");
      echo $OUTPUT->action_link($link, $log->ip, new popup_action(‘click’, $link, ‘iplookup’, array(‘height’ => 400, ‘width’ => 700)));
      echo "</td>\n";
      – $fullname = $log->userid;
      + $fullname = fullname($log, has_capability(‘moodle/site:viewfullnames’, context_course::instance($course->id)));
      echo "<td class=\"r$row c3\" >\n";
      echo " <a href=\"$CFG->wwwroot/user/view.php?id={$log->userid}\">$fullname</a>\n";
      echo "</td>\n";
      @@ -619,7 +619,7 @@

      $coursecontext = context_course::instance($course->id);
      $firstField = format_string($courses[$log->course], true, array(‘context’ => $coursecontext));
      – $fullname = $log->userid;
      + $fullname = fullname($log, has_capability(‘moodle/site:viewfullnames’, $coursecontext));
      $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
      $row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.’ ‘.$log->action.’ (‘.$actionurl.’)’, $log->info);
      $csvexporter->add_data($row);
      @@ -730,7 +730,7 @@
      $myxls->write($row, 0, format_string($courses[$log->course], true, array(‘context’ => $coursecontext)), ”);
      $myxls->write_date($row, 1, $log->time, $formatDate); // write_date() does conversion/timezone support. MDL-14934
      $myxls->write($row, 2, $log->ip, ”);
      – $fullname = $log->userid;
      + $fullname = fullname($log, has_capability(‘moodle/site:viewfullnames’, $coursecontext));
      $myxls->write($row, 3, $fullname, ”);
      $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
      $myxls->write($row, 4, $log->module.’ ‘.$log->action.’ (‘.$actionurl.’)’, ”);
      @@ -844,7 +844,7 @@
      $myxls->write_string($row, 0, format_string($courses[$log->course], true, array(‘context’ => $coursecontext)));
      $myxls->write_date($row, 1, $log->time);
      $myxls->write_string($row, 2, $log->ip);
      – $fullname = $log->userid;
      + $fullname = fullname($log, has_capability(‘moodle/site:viewfullnames’, $coursecontext));
      $myxls->write_string($row, 3, $fullname);
      $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
      $myxls->write_string($row, 4, $log->module.’ ‘.$log->action.’ (‘.$actionurl.’)’);

      — mod/quiz/report/attemptsreport.php 2015-10-16 19:03:12.000000000 +0900
      +++ mod/quiz/report/attemptsreport.php.20151016 2015-10-16 19:04:44.000000000 +0900
      @@ -153,10 +153,10 @@
      $headers[] = ”;
      }
      if (!$table->is_downloading()) {
      – $columns[] = ‘userid’;
      + $columns[] = ‘username’;
      $headers[] = get_string(‘name’);
      } else {
      – $columns[] = ‘userid’;
      + $columns[] = ‘username’;
      $headers[] = get_string(‘name’);
      }

      — mod/scorm/report/interactions/report.php.20151020 2015-10-20 11:21:52.000000000 +0900
      +++ mod/scorm/report/interactions/report.php.20151016 2015-10-16 12:33:37.000000000 +0900
      @@ -418,9 +418,9 @@
      $row[] = $OUTPUT->user_picture($user, array(‘courseid’=>$course->id));
      }
      if (!$download) {
      – $row[] = ‘<a href="’.$CFG->wwwroot.’/user/view.php?id=’.$scouser->userid.’&amp;course=’.$course->id.’">’.$scouser->userid.'</a>’;
      + $row[] = ‘<a href="’.$CFG->wwwroot.’/user/view.php?id=’.$scouser->userid.’&amp;course=’.$course->id.’">’.$scouser->username.'</a>’;
      } else {
      – $row[] = $scouser->userid;
      + $row[] = $scouser->username;
      }
      if (empty($timetracks->start)) {
      $row[] = ‘-‘;

      — mod/scorm/report/basic/report.php.20151020 2015-10-20 11:04:48.000000000 +0900
      +++ mod/scorm/report/basic/report.php.20151016 2015-10-16 11:02:03.000000000 +0900
      @@ -121,7 +121,7 @@
      $columns[]= ‘picture’;
      $headers[]= ”;
      }
      – $columns[] = ‘userid’;
      + $columns[] = ‘username’;
      $headers[] = get_string(‘name’);

      $columns[]= ‘attempt’;
      @@ -383,9 +383,9 @@
      $row[] = $OUTPUT->user_picture($user, array(‘courseid’=>$course->id));
      }
      if (!$download) {
      – $row[] = ‘<a href="’.$CFG->wwwroot.’/user/view.php?id=’.$scouser->userid.’&amp;course=’.$course->id.’">’.$scouser->userid.'</a>’;
      + $row[] = ‘<a href="’.$CFG->wwwroot.’/user/view.php?id=’.$scouser->userid.’&amp;course=’.$course->id.’">’.$scouser->username.'</a>’;
      } else {
      – $row[] = $scouser->userid;
      + $row[] = $scouser->username;
      }
      if (empty($timetracks->start)) {
      $row[] = ‘-‘;

      — mod/scorm/report/objectives/report.php.20151020 2015-10-20 11:23:52.000000000 +0900
      +++ mod/scorm/report/objectives/report.php.20151016 2015-10-16 12:34:18.000000000 +0900
      @@ -422,9 +422,9 @@
      }
      if (!$download) {
      $row[] = ‘<a href="’.$CFG->wwwroot.’/user/view.php?id=’.$scouser->userid.
      – ‘&amp;course=’.$course->id.’">’.$scouser->userid.'</a>’;
      + ‘&amp;course=’.$course->id.’">’.$scouser->username.'</a>’;
      } else {
      – $row[] = $scouser->userid;
      + $row[] = $scouser->username;
      }
      if (empty($timetracks->start)) {
      $row[] = ‘-‘;
      [/code]

    2. 時刻処理に適したunixtime型で出力する
      [code]

      — course/lib.php 2015-10-20 11:46:28.000000000 +0900
      +++ course/lib.php.20151020 2015-10-20 11:26:45.000000000 +0900
      @@ -558,7 +558,6 @@
      $header = array();
      $header[] = get_string(‘course’);
      $header[] = get_string(‘time’);
      – $header[] = get_string(‘time’);
      $header[] = get_string(‘ip_address’);
      $header[] = get_string(‘fullnameuser’);
      $header[] = get_string(‘action’);
      @@ -622,7 +621,7 @@
      $firstField = format_string($courses[$log->course], true, array(‘context’ => $coursecontext));
      $fullname = $log->userid;
      $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
      – $row = array($firstField, userdate($log->time, $strftimedatetime), $log->time, $log->ip, $fullname, $log->module.’ ‘.$log->action.’ (‘.$actionurl.’)’, $log->info);
      + $row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.’ ‘.$log->action.’ (‘.$actionurl.’)’, $log->info);
      $csvexporter->add_data($row);
      }
      $csvexporter->download_file();

      — mod/quiz/report/attemptsreport_table.php 2015-10-20 11:20:12.000000000 +0900
      +++ mod/quiz/report/attemptsreport_table.php.20151020 2015-10-20 11:01:19.000000000 +0900
      @@ -163,7 +163,7 @@
      */
      public function col_timestart($attempt) {
      if ($attempt->attempt) {
      – return $attempt->timestart;
      + return userdate($attempt->timestart, $this->strtimeformat);
      } else {
      return ‘-‘;
      }
      @@ -176,7 +176,7 @@
      */
      public function col_timefinish($attempt) {
      if ($attempt->attempt && $attempt->timefinish) {
      – return $attempt->timefinish;
      + return userdate($attempt->timefinish, $this->strtimeformat);
      } else {
      return ‘-‘;
      }
      @@ -189,7 +189,7 @@
      */
      public function col_duration($attempt) {
      if ($attempt->timefinish) {
      – return $attempt->timefinish – $attempt->timestart;
      + return format_time($attempt->timefinish – $attempt->timestart);
      } else {
      return ‘-‘;
      }

      — mod/scorm/report/interactions/report.php 2015-10-20 11:23:34.000000000 +0900
      +++ mod/scorm/report/interactions/report.php.20151020 2015-10-20 11:21:52.000000000 +0900
      @@ -435,14 +435,14 @@
      $row[] = $scouser->attempt;
      }
      if ($download ==’ODS’ || $download ==’Excel’ ) {
      – $row[] = $timetracks->start;
      + $row[] = userdate($timetracks->start, get_string("strftimedatetime", "langconfig"));
      } else {
      – $row[] = $timetracks->start;
      + $row[] = userdate($timetracks->start);
      }
      if ($download ==’ODS’ || $download ==’Excel’ ) {
      – $row[] = $timetracks->finish;
      + $row[] = userdate($timetracks->finish, get_string(‘strftimedatetime’, ‘langconfig’));
      } else {
      – $row[] = $timetracks->finish;
      + $row[] = userdate($timetracks->finish);
      }
      $row[] = scorm_grade_user_attempt($scorm, $scouser->userid, $scouser->attempt);
      }

      — mod/scorm/report/basic/report.php 2015-10-20 11:12:59.000000000 +0900
      +++ mod/scorm/report/basic/report.php.20151020 2015-10-20 11:04:48.000000000 +0900
      @@ -399,14 +399,14 @@
      $row[] = $scouser->attempt;
      }
      if ($download ==’ODS’ || $download ==’Excel’ ) {
      – $row[] = $timetracks->start;
      + $row[] = userdate($timetracks->start, get_string("strftimedatetime", "langconfig"));
      } else {
      – $row[] = $timetracks->start;
      + $row[] = userdate($timetracks->start);
      }
      if ($download ==’ODS’ || $download ==’Excel’ ) {
      – $row[] = $timetracks->finish;
      + $row[] = userdate($timetracks->finish, get_string(‘strftimedatetime’, ‘langconfig’));
      } else {
      – $row[] = $timetracks->finish;
      + $row[] = userdate($timetracks->finish);
      }
      $row[] = scorm_grade_user_attempt($scorm, $scouser->userid, $scouser->attempt);
      }

      — mod/scorm/report/objectives/report.php 2015-10-20 11:24:46.000000000 +0900
      +++ mod/scorm/report/objectives/report.php.20151020 2015-10-20 11:23:52.000000000 +0900
      @@ -439,14 +439,14 @@
      $row[] = $scouser->attempt;
      }
      if ($download ==’ODS’ || $download ==’Excel’ ) {
      – $row[] = $timetracks->start;
      + $row[] = userdate($timetracks->start, get_string("strftimedatetime", "langconfig"));
      } else {
      – $row[] = $timetracks->start;
      + $row[] = userdate($timetracks->start);
      }
      if ($download ==’ODS’ || $download ==’Excel’ ) {
      – $row[] = $timetracks->finish;
      + $row[] = userdate($timetracks->finish, get_string(‘strftimedatetime’, ‘langconfig’));
      } else {
      – $row[] = $timetracks->finish;
      + $row[] = userdate($timetracks->finish);
      }
      $row[] = scorm_grade_user_attempt($scorm, $scouser->userid, $scouser->attempt);
      }
      [/code]

  • Moodle + BigBluebutton で遠隔会議

    研究室メンバーで遠隔会議をしたいとき、Skype IDとかを教え合えば済むのかもしれないがちょっと違うような気がする。そこで、Moodleと親和性の高いオープンソースのWeb会議システムBigBluebuttonを試してみた。BigBluebuttonはOSをUbuntuに限定している。BigBluebuttonは様々なソフトウェア(Red5、nginx、ffmpegなどなど)の集合で、全てのディストリに対応するのは難しいのだろう。

    BigBluebuttonそのもののインストールは三重大学の三島先生の記事を参考にさせていただいた。三島先生ありがとうございます。Requirementには「物理サーバ」とあるが、今回は仮想環境にインストールした。既存のMoodle側についてはプラグインを解凍し、認証キーの設定をするだけである。

    この後はMoodleの「アクティビティ」に現れるBigBluebuttonを選択し追加すれば遠隔会議へのリンクが作成され、拍子抜けするくらい簡単。つまり、会議に参加する際にMoodleにログインしていれば追加の認証はなく、Moodleのユーザ名が自動で引き継がれる。つまり、MoodleのアカウントがあればBigBluebuttonで遠隔会議が可能となる。

    早速、テストを兼ねて本日の研究室ゼミに東北大学からの遠隔参加を試してみたが、接続そのものとWebCamの映像の確認はできたものの、PCのデバイスの関係か、マイクが使えずNGとなってしまった。次回はMacで試してみよう。

    2015/10/09追記:KUINS側で必要なポートが学外に開放されていないことが分かったので開放を申請中。
    2015/10/23追記:開放が完了し、WebRTCも問題なく使えるようになった。チェックするにはbbbサーバ以下の check/ にアクセスすれば良い。
    2015/12/01追記:問題なく利用できており、遠隔ミーティング、ゼミの遠隔参加など時間の有効活用ができるようになった。

  • 2013年を振り返る2:Sakai

    Sakaiとは著名なオープンソースLMSである。本学はSakaiを採用した学習支援サービスを提供しているが、正直なところ、この運用には様々な問題があり、振り回されているとしか言いようがない。

    まず、採用経緯が全く不明である。仕様書もなし、スケジュールもなし、採用理由もなし。Sakaiの導入ありきで進めたため、全てが後付けになってしまっている。このような進め方で人の心が動くはずがない(重要)。

    次に、構築に様々なボトルネックが存在し、現在に至るまで今だに正式運用となるはずのシステムが動作していない(ホスト名がclspilot.iimcとなっていることから分かる)。

    加えて、Sakaiそのものの機能不足とバグがある。バグについてはソフトウェアにつきものであるから余り追求しても仕方がない。次の深刻な機能不足がある。何と数式表示ができないし(Sakai 2.9.3 ではMathMLがサポートされたのでそれなりの表示はできる)、ロールの変更ができないのである。詳しくはMoodle.orgのフォーラムを参照されたい。また、某大学で問題になったプライバシー関連のマスク機能やShibboleth認証プラグインが存在せず、それぞれに開発が必要となる。つまりお金が必要になるのである。

    このような機能不足について、先日 @nagai_www 先生とお話しする機会がありかなりクリアになった。端的に言えば、Sakaiはコミュニティで開発を分担したLMSであり(だから「Sakaiプロジェクト」と言う)、(まだなのか永久か私の知るところではないが)全体の思想というものが無い。その無さが良さでもある。つまり完成品として見てはいけないのである。Sakaiにかかわってもうすぐ2年になるのに、このことに気付くことができなかったのは痛恨の極みである。

    Moodleが良いと言うつもりはない。しかしSakaiはないだろう。Moodleの方がユーザー数とコミュティの大きさに裏打ちされた良さがあるというのが私の結論である。客観的に一つ言えることは、MoodleだけでなくSakaiを知ることができたのは良かったと思う。それにしてもSakaiの人達はなぜ他を見ようとしないのか本当に不思議でならない。自分にバウンダリをかけて良いことがあったらぜひ教えてもらいたいものである。

  • Moodleで手書きレポートを提出 (pdf2submission + Moodle 2.5 on RHEL6)

    喜多研Moodlepdf2submission をインストールし、動作確認に成功したので備忘録を兼ねて。全て「タダ」でできました。

    これは何?

    紙で提出された手書きレポートをMoodleで提出したことにできるソリューションです。

    1. Moodleで「課題」を作成し、pdf2submission ブロックでQRコードを含むレポートのカバーシートを印刷
    2. 学生がカバーシートを含んだレポートを提出
    3. レポートをスキャンしPDF化
    4. PDFをFTPでMoodleサーバにアップロード
    5. MoodleがQRコードの情報をもとに自動でPDFを分割し対応する課題、学生の領域にアップロード

    必要なもの

    • Moodle(笑)
    • PDF出力可能なドキュメントスキャナ(Canon DR-150で動作確認)

    Moodleの設定

    Moodle 2.5+ (Build: 20130524) を RHEL6 で運用。

    バックアップ

    MySQLのダンプを保存。ソースコード, moodledata ディレクトリはコピーしておく。

    convert, ghostscript のインストール

    [code]yum install ImageMagick ImageMagick-devel ghostscript[/code]

    rpmforge リポジトリの追加と pdftk のインストール

    [code]sudo rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
    yum install pdftk[/code]

    EPELリポジトリの追加と zbarimg のインストール

    [code]sudo rpm -ivh epel-release-6-8.noarch.rpm
    yum install zbar[/code]

    pdf2submission のインストール

    block_pdf2submission_moodle23_2012091400.zip を blocks/ に解凍し、「通知」をクリック。必要なテーブルが自動で生成される。pdfscan.php を編集。
    [code][uep@kvm420 pdf2submission]$ diff pdfscan.php.dist pdfscan.php
    14,17c14,17
    < $zbarimg_command= "/usr/local/bin/zbarimg ";
    < $convert_command= "convert";
    < $gs_command= "gs";
    < $pdftk_command= "pdftk";

    > $zbarimg_command= "/usr/bin/zbarimg";
    > $convert_command= "/usr/bin/convert";
    > $gs_command= "/usr/bin/gs";
    > $pdftk_command= "/usr/bin/pdftk";
    [/code]

    pdfアップロード先ディレクトリの作成

    デフォルトに従い /home/pdf2moodle/pdfs を作成する。当然のことながら、このディレクトリが apache から読めなければ何も始まらない。
    [code]
    adduser pdf2moodle
    mkdir -p /home/pdf2moodle/pdfs
    chmod 755 /home/pdf2moodle
    chgrp apache /home/pdf2moodle/pdfs
    chmod g+w /home/pdf2moodle/pdfs
    [/code]

    動作確認

    /home/pdf2moodle/pdfsにQRコードを含むPDFをアップロードすると、その中にさらにディレクトリが掘られ、pdftkでページ分割がなされているか確認する。分割されていなければ、apache のログを確認する。分割されていれば、そこからMoodleの課題にアップロードするところまでの障害は無いと思われる。

    謝辞

    本ブロックを開発された喜多 敏博教授ならびに Moodle.org 各位に厚く御礼申し上げます。

  • Mahoodle (Mahara Moodle Integration) の構築

    要領が分かっていれば正味1時間でした。ここまで無償で、色々な仕事や講義の間を縫って、こんなに早くできました。さて、あなたの選択は?

    概要: Moodle の認証は Shibboleth、Mahara の IdP を Moodle にすることでSSOとMoodleへのポートフォリオ機能を追加。

    • MaharaMoodle は同じ apache httpd で共存し、VirtualHost を切る
    • ただし HTTPS 化するのは Moodle だけ (IPアドレスを追加すると課金されるため)

    目的

    • Mahara で Secure Login を実現
    • ID管理が不要

    手法

    環境

    • RHEL 6.4
    • PHP 5.3
    • Apache httpd 2.2.15
    • MySQL 5.1.69

    結果

    • まずは Moodle にログイン
      mahoodle1
    • その後「ネットワークサーバ Home – Mahara」をクリックすると…
      mahoodle2
    • ちゃんとSSOできています。
  • Moodle の Shibboleth 化 (京都大学版その3)

    京大 IdP から送信している uid をマッピングする設定を行う。これで完了である。統合認証センター各位、色々とありがとうございました。

    /etc/shibboleth/attribute-map.xml

    [code]
    [uep@kvm420 shibboleth]$ diff attribute-map.xml attribute-map.xml.dist
    3,11d2
    < <Attribute name="urn:mace:dir:attribute-def:uid" id="uid"/>
    < <Attribute name="urn:oid:0.9.2342.19200300.100.1.1" id="uid"/>
    < <Attribute name="urn:oid:2.5.4.4" id="surname"/>
    < <Attribute name="urn:oid:2.5.4.42" id="givenName"/>
    < <Attribute name="urn:oid:1.3.6.1.4.1.32264.1.1.3" id="jaDisplayName"/>
    < <Attribute name="urn:oid:2.5.4.3" id="commonName"/>
    < <Attribute name="urn:oid:0.9.2342.19200300.100.1.3" id="email"/>
    < <Attribute name="urn:oid:1.3.6.1.4.1.32264.1.1.5" id="jaOrganizationalUnit"/>
    <[/code]