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 の中の変なところに空白が入ってしまっている?
午前0時が〆切なのに午前12時と出るので正午と思った学生がいた。 そもそも12時間制がわかりにくい。 lang/ja(_utf8)/moodle.php の中の %%p%%I をすべて %%H に書き直したらわかりやすくなった。 これはすでに修正された。
TeX機能をオンにしておけば,$$ ... $$ のように2個のドル印で囲んでLaTeX表記(正確にはmimeTeX表記)が使える。 もしTeX表記以外で $ 印を二つ並べたいとき(あまりないだろうが)は $$ のように実体参照すればいいだろう。 なお,日本語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台。
MoodleのフォーラムのメールがMessage-ID:を二つ持つためにVodafoneでエラーになる。 mod/forum/lib.php の Message-Id: を生成している行をコメントアウトする。 本家に報告済み(Bug 3681。
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 のテーマの場合にロゴが表示されない。 詳細はパッチをご覧いただきたい。