« LiveCapture2, Stsrec, 午後のこ〜だ で収録装置を作ってみた | トップページ | Moodle 1.5/EUC-JP/Postgres をバージョンアップする方法(作業内容編) »

2009年1月19日 (月)

Moodle 1.5/EUC-JP/Postgres をバージョンアップする方法(経緯と奮闘編)

●きっかけ

現在、僕が管理している moodle をおいてあるサーバーですが、個人情報の管理についても「サーバー室にあるので、他のサーバーと同じ程度に安全」なのですが、実はディスク溢れ(ログ領域)を数回やってまして、また、データベースファイルにも一部不整合がある…ということで、moodleのバージョンアップをすることにしました。

しかし、これが全然簡単ではない。まず、自分が管理しているmoodleのDBファイルのエンコーディングがどうなっているか、設定した自分でも完全に把握できでなかったのです。というのも、このmoodleを構築したのは、Moodle 1.5 がでた直後のこと。当時は Moodle の非ヨーロッパ系言語対応は活発でなく、DBのエンコーディングについても、あちこち調べないと情報をまとめられないという状況でした。また、世界的にはメジャーな組合せは Linux, Apache, MySQL, PHP ですが、我がサーバーは FreeBSD, Apache, Postgresql, PHP の組合せ。他に、WiKiも一緒のサーバーで動かす必要もありました。当時utf-8の編集環境が整っていなかったこともあり、Moodle, DBともに EUC-JP で統一して作ってあったのでした。時代はあれから4年が過ぎ、Moodleも 1.5→1.6→1.7→1.8→1.9と上がっていきました。1.6のときに、標準はUTFとなり、1.7でロールやフォーラムの構成が大きく変わり、1.8ではAJAXっぽい動作もはいり、現在の1.9は安定性が重視されています。

●調査

ということで、作業をする立場になっていろいろ調べ始めました。最初に構築したときの構成をまとめておきます。

  • FreeBSD-5STABLE
  • Apache 2.0
  • Postgresql-7.4
    • DBは、psql -l でみると、SQL_ASCII で構築されている。
  • PHP-5.x
  • Moodle 1.5.x (EUC-JP)

で、これで動かしていたのですが、僕があるときに誤って Apache 2.2 にしてしまいました。このときに Moodle がしばらく動作しなくなりました。原因は PHPのバージョン不整合でした。php5-extensions を再構築で、再び動き始めました。で、さらに僕が誤って Postgres を 8.2 にしてしまいました。7.4 の DB を 8.2 にするときに、適切な移行作業をしなかった(pg_dumpしたあといい加減な作業で 8.2 に読ませている)ことが原因で DB がエラーをたくさん出すようになりました。

●最初は通常作業→破綻

で、まず最初に試みたのは「通常のバージョンアップ作業」でした。ですが、7.4のDBを8.2で動かしているので、これを Postgres のどのバージョンに食わせても駄目。駄目な理由がテーブルやコラムの相違、文字コードの違いでした。それで困り果ててしまいました。

●コースバックアップの利用

いろいろ調べると Moodle には、通常のバージョンアップ以外に「バックアップ・リストア」(backup, restore)もあることに気がつきました。幸い、新しいmoodleは別のホストで動かすことになっていたので、先に別ホストに 1.9 を入れて、そこに 1.5 のバックアップをレストアすれば、うまくいくだろう…と思ったのですが、甘い話でした。コース名からして思いっきり文字化け。全然駄目でした。

●文字コード問題

そこで、悩んだ挙げ句の果て、、漢字1文字だけの名前のコースを作って、そのバックアップファイルを解凍して文字コードを調べようとしました。とはいうものの僕は文字コードの知識が不足していて判別できず、最終的に三重大学の奥村先生から「EUC-JPをlatin1のバイト列と見て,それをutf-8に変換したもの」と助けて頂きました。これで解決の道筋が見えてきました。 iconv の2段重ね( iconv -f UTF-8 -t latin1 | iconv -f EUC-JP -t UTF-8)です。これで試しに作ったコースは完璧にリストアできました。

バンザーイと思いながら他のコースを変換してみたところ、こんどはiconvが止まりました。なぜだろう?と od で dump をとって調べてみると、利用者が無理矢理テキスト領域に入れた制御コードでした。そこで、これを止めるために "nkf -x -I -m0 -e" を挟み込むことにしました。これで基本的にはめでたし…です。

●次はファイル名

ところが次なる問題発生。こんどは添付ファイルの名前に非ASCII文字を使用したフォーラムへの投稿があると、そこでファイル名が化けてリストアされるのです。そうか…ファイル名も変更しないとということで convmv の登場です。そして次の壁です。ファイル名も上記と同じように2段の変換が必要ですが convmv は安全指向で作られているので、解釈できない場合は絶対に動作してくれません。今回のファイル名は間違ったエンコーディングで付けられているので、convmvではなおらないということになってしまいました。

ただ、不思議なことに「作業内容編」に記した方法を使うと、ファイル名こそ化けるものの、ちゃんと添付ファイルをダウンロードできるのです。

●教師用フォーラムの消滅

ということで、無事移行できるかと思っていたのですが、さらなる壁がありました。Moodle 1.5, 1.6 には教師用フォーラムというモジュールがあったのですが、 1.7以降にはありません。しかも、バックアップ・リストアをすると教師用フォーラムは消えてしまいます。教師用フォーラムの内容を残すには、通常のバージョンアップ 作業を必要とするのです。(ロールの設定で学生には見えないようにできるので、帰納的には何ら問題ない。)

●三重大バージョンは Postgresql では動かない

ということで1.6まではコースバックアップとリストアを使用し、1.6→1.9は通常のバージョンアップ作業で教師用フォーラムの自動変更をするということで作業をしたのですが、こんどはクイズモジュールのバージョンアップのところで無現ループに入ります。で、これまた奥村先生に見て頂いたのですが、どうも原因不明。ただ「MySQL固有のところでつまづいているかも」というヒントのあと「三重大バージョンは MySQL を前提にしているので、もしかしたらそれが原因かも」というメッセージを頂きました。そこで、公式サイトから 1.9 をとってきて作業をしたら、こんどは最後までバージョンアップできました。僕は尊敬する奥村先生(三重大学)が配布されている「Moodle 三重大バージョン」を使おうとしていたのですが、結果としてそれは Postgresql では無理ということがわかったのでした。

ということで、いままでの作業を、次の記事にまとめます。

|

« LiveCapture2, Stsrec, 午後のこ〜だ で収録装置を作ってみた | トップページ | Moodle 1.5/EUC-JP/Postgres をバージョンアップする方法(作業内容編) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Moodle 1.5/EUC-JP/Postgres をバージョンアップする方法(経緯と奮闘編):

« LiveCapture2, Stsrec, 午後のこ〜だ で収録装置を作ってみた | トップページ | Moodle 1.5/EUC-JP/Postgres をバージョンアップする方法(作業内容編) »