Moodle

Moodleとは

CompEdu:e-Learning の Moodle の項に移動。

以下はMoodle 1.5の時代の情報。 今は Moodle 1.6 または Moodle 1.9 以降をお薦めする。

インストール

[2006-05-19] 三重大学版Moodleが ここ でダウンロードできるようになった。

EUC-JPからUTF-8への変換については Moodle/UTF-8 に書いた。

もうすぐMoode 1.6が出る。 これはUTF-8がデフォルト。 ただしMySQL 4.1.16以降を要する。

以下は若干古いもの。


熊本大の喜多先生のrpmが http://t-kita.net/rpm/moodle/ にある。 これを使えば以下のようなややこしいことは不要。

FreeBSDでのインストールについては辰己先生のブログの Moodle on FreeBSD-5.4 参照。

PHP と,MySQL または PostgreSQL が必要。 うちは Apache 2 + PHP5 の環境で PostgreSQL と MySQL を両方試している。 開発者のほとんどはMySQLらしい。 PostgreSQLでも見掛け上支障なく動いているが,バックエンドでエラーがたくさん出た(今はどうかわからない)。

httpd.conf には AcceptPathInfo on を入れる。

php.ini は次のようにする。

magic_quotes_gpc = 1      (推奨??)
magic_quotes_runtime = 0  (必ず)
file_uploads = 1
session.auto_start = 0
session.bug_compat_warn = 0

ただし magic_quotes_gpc を on にすると TeXWiki:TeXをWebで で支障が出るので off にしておくのがよさそう。 そうでなくても magic_quotes に頼るのは良くない。

PostgreSQL を使う場合,特に tcpip_socket = true を忘れないように。 設定例:

su - postgres
psql -c "create user moodleuser createdb with password 'hoge';" template1
psql -c "create database moodle;" -U moodleuser template1
psql -c "alter user moodleuser nocreatedb;" template1

MySQL の場合(こちらを推奨。Moodle 1.6以降ではMySQL 4.1.16以上が必須,ただし4.1.21はバグのため使わないほうがいい(→ http://moodle.org/mod/forum/discuss.php?d=51881)。

mysql -u root -p
create database moodle;
grant select,insert,update,delete,create,drop,index,alter on moodle.*
   to moodleuser@localhost identified by 'hoge';
quit

以上で,moodleuser,hoge,moodle は自由に変えてよい。

MySQL でDBホストが別の場合は moodleuser@localhost を moodleuser@'oku.edu.mie-u.ac.jp' のようにする。 ただし /etc/hosts にFQDNでないほうが先に書いてある場合は @ 以下をそれに合わせる。

データ用ディレクトリを htdocs の外に設定,www だけが書き込めるようにする。 アップロードされたバイナリ類はここに入る。 データベースにはテキスト情報だけ入る(BLOBは使わない)。

Moodle をダウンロードして htdocs 以下に展開。

http://サーバ名/moodle/install.php をアクセスする。 質問に答えていけば設定ファイル config.php が作られる(後で手で修正も可)。 このため,moodle ディレクトリは最初は www に書き込めるようにしておく(後で直す)。 質問は「続く」でたくさんのページがあるが必ず最後まで答える。 質問中でURLが http://.../moodle のようになるが最後に / を補わないこと。

細かいところは後で直せるが,言語は japanese (ja),localeは ja_JP.eucjp,timezoneは GMT+9,fullnamedisplayは姓+名,extendedusernamecharsはYesでいいだろう。

あとは http://サーバ名/moodle/ をアクセスするだけ。

動作確認したら cron を設定する。 まず http://サーバ名/moodle/admin/cron.php をブラウザで見てうまく働くことを確認。 よければ一般ユーザでいいから crontab -e で次のように設定。

*/5 * * * * wget -q -O /dev/null http://サーバ名/moodle/admin/cron.php

更新

次のようにして更新。

cd /usr/local/apache2/htdocs
mv moodle moodle-bak
tar xvzf moodle-latest-XXX.tgz
cp -a moodle-bak/config.php moodle/

config.php をコピーしたときのパーミッションに注意。 こうしてすぐにブラウザで http://サーバ名/admin/ にアクセスし,エラーがないことを確認しながら「続ける」をクリックしていくと設定が完了する。

バックアップとリストア

PostgreSQL のバックアップ

pg_dump moodle >moodle.out

PostgreSQL のリストア

psql moodle <moodle.out

データ用ディレクトリは別途バックアップ・リストアする。

MySQL のバックアップ(1.6以降では文字セットのオプションは不要のはず):

mysqldump --opt -u root -p --default-character-set=latin1 moodle >moodle.out

MySQL のリストアはあらかじめ上のようにしてデータベース moodle を作って grant もしてから

mysql moodle <moodle.out

すればいいのだろう。

日本語の文字化け対応

Moodle から自動で出されるメールが生 EUC-JP または生 UTF-8 の Quoted-Printable になり,学生のメーラで化ける。 http://moodle.org/mod/forum/discuss.php?d=11711 に対策が。 私はとりあえず moodle/lib/moodlelib.php の if ($attachment && $attachname) { ... } の前後を次のように改変。

   if ($attachment && $attachname) {
       中略
   }
   // 日本語化
   $tmp = mb_convert_encoding($mail->FromName, 'ISO-2022-JP');
   $mail->FromName = '=?ISO-2022-JP?B?' . base64_encode($tmp) . '?=';
   $tmp = mb_convert_encoding($mail->Subject, 'ISO-2022-JP');
   $mail->Subject = '=?ISO-2022-JP?B?' . base64_encode($tmp) . '?=';
   $mail->Body = mb_convert_encoding($mail->Body, 'ISO-2022-JP');
   $mail->AltBody = mb_convert_encoding($mail->AltBody, 'ISO-2022-JP');
   $mail->CharSet = 'ISO-2022-JP';
   $mail->Encoding = '7bit';
   foreach ($mail->to as $i => $a) {
      $tmp = mb_convert_encoding($a[1], 'ISO-2022-JP');
      $mail->to[$i][1] = '=?ISO-2022-JP?B?' . base64_encode($tmp) . '?=';
   }
   foreach ($mail->cc as $i => $a) {
      $tmp = mb_convert_encoding($a[1], 'ISO-2022-JP');
      $mail->cc[$i][1] = '=?ISO-2022-JP?B?' . base64_encode($tmp) . '?=';
   }
   foreach ($mail->bcc as $i => $a) {
      $tmp = mb_convert_encoding($a[1], 'ISO-2022-JP');
      $mail->bcc[$i][1] = '=?ISO-2022-JP?B?' . base64_encode($tmp) . '?=';
   }

この下の方の $user->mailformat = 1 を 0 に変える(HTMLメールでなくテキストにするため)。

初期値をテキストメールに変更するには次のようなコマンドでいいだろうか。

mysql -u ユーザ -h ホスト -p データベース名
alter table mdl_user alter mailformat set default 0;
update mdl_user set mailformat=0;

ついでにメールアドレス非公開をデフォルトにするには

alter table mdl_user alter maildisplay set default 0;

フォーラムのメールを購読しないをデフォルトにするには

alter table mdl_user alter autosubscribe set default 0;

あと,moodle/lib/weblib.php や filelib.php をはじめ,すべての htmlentities(x) を htmlentities(x, ENT_COMPAT, get_string('thischarset')) に一括置換。 これには喜多先生の replace-htmlentities.pl を使うのが便利。

moodle/mod/wiki/ の中は,以上に加え,iso-8859-1 または ISO-8859-1 となっているところも get_string('thischarset') に直す。

フォーラムのメールを早く配信するには

フォーラムに投稿してからメールが送られるのは,編集できる期間(maxeditingtime)経過後の最初のcron起動時(通常は5分の整数倍の時刻)になる。 maxeditingtimeを短くしたくないけれどもメールをもっと早く出したいなら, mod/forum/lib.php の204行目あたり $endtime = $timenow - $CFG->maxeditingtime; を $endtime = $timenow; にすればいいようだ。

姓名問題

設定で姓・名の順序を入れ替えられるが,それでもハードコードされたところで名・姓のままになる。 特にユーザ登録の画面が名・姓の順なので大勢の学生が間違って逆に入れる。 Moodleの firstname・lastname を given name・family name の意味で使っているところはなさそうなので,これはむしろ日本語の姓,名であると解釈して,lang/ja(_utf8)/*.php にある訳語で firstname を姓,lastname を名と入れ替えるのが確実かつ現実的である。 実際,繁体中文版もそうなっている。

「さん」付け

あちこちにありそうだ。 例えば login/confirm.php:

               echo "<center><h3>".get_string("thanks").", ". fullname($user) . "</h3>\n";

これはいちいち「さん」を挿入するのはたいへんなので,lang/ja(_utf8)/moodle.php に

$string['san'] = ' さん';

というのを入れて

               echo "<center><h3>".get_string("thanks").", ". fullname($user) . get_string("san") . "</h3>\n";

とするのがよさそうだ。

lang/ja/journal.php も3カ所に「さん」が必要。 なおこのファイルの $a->journal の中の変なところに空白が入ってしまっている?

24時間制

午前0時が〆切なのに午前12時と出るので正午と思った学生がいた。 そもそも12時間制がわかりにくい。 lang/ja(_utf8)/moodle.php の中の %%p%%I をすべて %%H に書き直したらわかりやすくなった。 これはすでに修正された。

TeXモジュール

TeX機能をオンにしておけば,$$ ... $$ のように2個のドル印で囲んでLaTeX表記(正確にはmimeTeX表記)が使える。 もしTeX表記以外で $ 印を二つ並べたいとき(あまりないだろうが)は &#36;&#36; のように実体参照すればいいだろう。 なお,日本語EUCでTeXで使うバックスラッシュ(または半角円印)をMacのSafariで入力すると化ける(ちっとも直らないSafariの有名なバグ)。

スケーラビリティ

当初メモリ256MのCeleronマシンで20人が同時にアクセスしたらメモリ不足で落ちた。 php.ini で memory_limit = 16M としてある。 デフォルトの 8M で Moodle はぎりぎり足りるらしいが,PukiWiki は足りないので,メモリ食いは PukiWiki のほうかもしれない。

現在は,メモリ1.25G積んで,しかもMySQLを別マシンで動かしている。 これなら何人でも大丈夫(といってもせいぜい80人くらいしか同時ログインしていない)。 もっとも,ProLiant ML110(Celeron 2.4G)なのでそれなりに遅い。

三重大学版MoodleではXeonマシン2台+バックエンド1台。

Vodafone問題

MoodleのフォーラムのメールがMessage-ID:を二つ持つためにVodafoneでエラーになる。 mod/forum/lib.php の Message-Id: を生成している行をコメントアウトする。 本家に報告済み(Bug 3681

wwwroot問題

config.php の $CFG->wwwroot を http:// で始めると,https でアクセスした際に,リンクをたどるうちに http に戻ってしまう。 そこで,これを /moodle のように省略した書き方にしたくなる。 ところがこうするとあちこちで不具合が生じる。 これを避ける簡単な方法は config.php を次のように直すことだ:

if (isset($_SERVER['HTTPS'])) {
  $CFG->wwwroot   = 'https://ホスト名/moodle';
} else {
  $CFG->wwwroot   = 'http://ホスト名/moodle';
}

さらに,内部で http を https に置換しているところが多数あるが,http: を https: に置換するようにしないと悲惨なことになる。lib/weblib.php の

   if (isset($_SERVER['HTTPS'])) {

以下の7行も何か変だぞ。次のように変更した。

   if (isset($_SERVER['HTTPS'])) {
       $protocol = 'https://';
   } else if (strncmp($CFG->wwwroot, 'https', 5) == 0) {
       $protocol = 'https://';
   } else {
       $protocol = 'http://';
   }

このあたりも本家に報告済み(Bug 5374)。 そもそも相対リンク(少なくとも protocol://domain 部分を省略したリンク)にすれば楽なのだが。

日本語ファイル名問題

日本語のファイル名が化けるのは lib/moodlelib.php の中の clean_filename() が問題。 この中身を

    $string = strtr($string, "/\\", "__");

くらいにすればよい。 ただ,UTF-8以外の環境ではこれだけではIEでダウンロードできないようだ。 とりあえず file.php を次のようにするといいらしい。

    // check that file exists
    if (!file_exists($pathname)) {
        $pathname = mb_convert_encoding($pathname, get_string('thischarset'), "UTF-8");
        if (!file_exists($pathname)) not_found($course->id);
    }

ダウンロードしたファイル名が文字化けする問題はもっとややこしい。 日本語ファイル名 のところで書いたように,次のようにすればいいのだろう(file.php):

    $filename = $args[count($args)-1];
    $ua = $_SERVER['HTTP_USER_AGENT'];
    if (strstr($ua, "MSIE") && !strstr($ua, 'Opera')) {
       $filename = mb_convert_encoding($filename, "SJIS", get_string('thischarset'));
    } elseif (strstr($ua, "Safari")) {
       if (get_string('thischarset') == "UTF-8") {
          $filename = "";
       } else {
          $filename = preg_replace('/[^\.a-zA-Z\d\_-]/', '_', $filename);
       }
    } else {
       $filename = mb_convert_encoding($filename, "UTF-8", get_string('thischarset'));
    }
    $filename = str_replace('#', '%23', $filename);

lib/filelib.php のほうは

    @header('Content-disposition: inline; filename="'.$filename.'"');

とする。

成績の並び順

course/grades.php で u.lastname を u.username にすれば番号順になる。 ついでに $course->shortname $strgrades を {$course->shortname}_grades とかにすればファイル名に日本語が入らない。 $student->idnumber も $student->username にする。

クッキー

lib/moodlelib.php の二つの setCookie() と,lib/setup.php でクッキーがセットされる。 PHPは関数の大文字・小文字を区別しないので setcookie() も setCookie() も同じことに注意。 setCookie() の最後の引数は '/' になっているが,実際のパス,例えば '/moodle/' に直せば,同一サイトの他のユーザによるクッキー盗難が防げる。 setup.php では @session_start(); の前にsession_set_cookie_params(0, '/moodle/'); を呼ぶ。

Moodle 1.5ではadmin/cron.phpやlogin/logout.phpにもsetcookie()があるぞ。 うーん,たくさんあって面倒だ。 Moodle 1.6では設定画面で設定できるようになるようだ。

課題などで日本語があると長い横スクロールになる

Bugs 5378 に書いたが lib/moodlelib.php の shorten_text() が日本語をまったく考えていないバグ。 UTF-8に依存するがとりあえず

                  if ($stopzone) {
                      if ($char == '.' or $char == ' ' or ord($char) >= 0xE0) {
                          $truncate = $i;  // not $i+1;
                          break 2;
                      }
                  }

とすればよかろう。

その他

http://moodle.org/mod/forum/discuss.php?d=28831 で https: な場合にIEでダウンロードできない問題についていろいろ書いてある。

file.php の $lifetime = 0; を 10 くらいにする。 grade/lib.php の /// Print header to force download のところの header("Content-Disposition: ...") の次に追加:

            header("Expires: 0");
            header("Cache-Control: must-revalidate,post-check=0,pre-check=0");
            header("Pragma: public");

その他,小さなバグがたくさんある。 例えばトップページが wood でコースが cornflower のテーマの場合にロゴが表示されない。 詳細はパッチをご覧いただきたい。

参考リンク




Last-modified: 2008-07-21 (月) 08:24:00 (4984d)