* Moodle [#h51db5d0]

** Moodleとは [#pa8963dd]

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

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

** インストール [#z3040e9c]

[2006-05-19]
三重大学版Moodleが [[ここ:http://portal.mie-u.ac.jp/src/]] でダウンロードできるようになった。
三重大学版Moodleが [[ここ:http://oku.edu.mie-u.ac.jp/miemoodle/]] でダウンロードできるようになった。

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:http://ttmtko.air-nifty.com/a/2006/02/moodle_on_freeb.html]]
参照。

-[[現在までの三重大学版パッチ:http://oku.edu.mie-u.ac.jp/~okumura/moodle.diff.txt]]
(2005-10-08版Moodle 1.5.2+と最新の日本語言語パックに対するパッチ)
(上記喜多先生のパッチを含む)
(admin/user.phpとauth/ldap/lib.phpへのパッチはあまりにも三重大固有なので省いた)
(lang/jaもかなり三重大固有なので要注意)

[[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

** 更新 [#gc37fbf3]

次のようにして更新。

 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/ にアクセスし,エラーがないことを確認しながら「続ける」をクリックしていくと設定が完了する。

** バックアップとリストア [#h22a338d]

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

すればいいのだろう。

** 日本語の文字化け対応 [#e665c9be]

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:http://t-kita.net/rpm/moodle/scripts/replace-htmlentities.pl]]
を使うのが便利。

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

** フォーラムのメールを早く配信するには [#g5daa6bd]

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

** 姓名問題 [#n75f10aa]

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

** 「さん」付け [#y0cb8051]

あちこちにありそうだ。
例えば 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時間制 [#cb5917f4]

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

** TeXモジュール [#oa6f6cc9]

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

** スケーラビリティ [#h0b62e86]

当初メモリ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問題 [#b5880c7d]

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

** wwwroot問題 [#c86d0ace]

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:http://moodle.org/bugs/bug.php?op=show&bugid=5374]])。
そもそも相対リンク(少なくとも protocol://domain 部分を省略したリンク)にすれば楽なのだが。

** 日本語ファイル名問題 [#q15d3d82]

日本語のファイル名が化けるのは 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);
     }

ダウンロードしたファイル名が文字化けする問題はもっとややこしい。
[[日本語ファイル名:http://oku.edu.mie-u.ac.jp/~okumura/php/filename.php]]
のところで書いたように,次のようにすればいいのだろう(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.'"');
 
とする。

** 成績の並び順 [#jdab416a]

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

** クッキー [#c016010b]

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では設定画面で設定できるようになるようだ。

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

[[Bugs 5378:http://moodle.org/bugs/bug.php?op=show&bugid=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;
                       }
                   }

とすればよかろう。

** その他 [#w0a7418e]

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 のテーマの場合にロゴが表示されない。
詳細はパッチをご覧いただきたい。

** 参考リンク [#g0c571de]

-[[Japanese Moodle:http://moodle.org/course/view.php?id=14]]
-[[柏木さんのパッチ:http://www.supertak.com/down/sample.htm]]

-----
-いつも御世話になります。 リンクを http://t-kita.net/rpm/moodle/ へ張り替えていただけると嬉しいです。 -- 喜多 &new{2005-09-25 (日) 13:36:53};
-rpmどうもありがとうございます。リンクを直すのを忘れていました -- 奥村 &new{2005-09-25 (日) 14:01:14};
- いつの間にかmoodle 1.6なんですねぇ.それにBBとWebCT合併もびっくり -- 渥美 &new{2006-04-02 (日) 21:05:37};
- 合併というかWebCTがBBに食われたんでしょう -- 奥村 &new{2006-04-02 (日) 21:22:37};

#comment