Moodleモジュールを「コースページに表示せずに利用可能にする」と編集権限のない教師にも表示されない

Moodle 4 のモジュール共通設定>利用には3つの選択肢

  • コースページに表示する
  • コースページで秘匿する (=教師, 編集権限のない教師には表示される)
  • コースページに表示せずに利用可能にする

「コースページに表示せずに利用可能にする」は, デフォルトでは,

  • URLを直接指定すれば学生含め全員に利用可能
  • 学生には表示されない
  • 教師には表示される(もちろん)
  • 「編集権限のない教師」には表示されない (ので存在を知ることはできないが利用は可能)

編集権限のない教師は

  • この「表示されせずに利用可能」にされたモジュール は,フォーラムやフィードバックにモジュールのURLを書いたり, AutoLinkを使ったりして学生に示して利用させることが可能
  • 「秘匿」されたモジュールをコースページ上で見ることも,内容も見ることも可能

ので, 「コースページに表示せずに利用可能にする」の振る舞いは直観的でないと言えそう.ロールの再定義で何とかするのも難しい?

Moodle 4.1 LTSの課題フィードバックPDF注釈のための unoconv Document Converter の設定(含む日本語サポート)

オープンソースのLMSであるMoodleには, 学生がファイルを提出する課題 Assignment 活動がある. PDF注釈Annotate PDFによるフィードバックでは, そのファイルが一律にPDFに変換されて評定ページで教師に提示され, 教師はPDF注釈を加えて学生に返すことができる.

この過程にはいくつかの外部プログラム, ライブラリが介在しており, (特に日本語やHEICフォーマットをサポートする場合は)設定が複雑なのでこの記事で解説.

今まで, Moodle.org のフォーラムに記事を投稿してきた.

この記事は hig3.hatenadiary.com の,最近のバージョンに対する更新.主に MoodleUbuntu の改善により手順が簡単になっている.

バージョン

流れ

PDF注釈は次のように進む.

  • 学生が課題に提出したファイルがPDFならそのまま,PDF以外なら unoconv がPDFに変換する
  • PDFは評定ページで ghostscript や pdftopnm によって表示される
  • 評定ページで教師がPDFに書き込む操作をすると, tfpdf がPDF注釈が加える*1

この順で, 設定(手順)と確認(test)を示す.

PDFを表示する設定(PDF注釈を使用する設定)

Ghostscript のインストール

sudo apt install ghostscript

Moodle>Site Administration>Server>System paths>Path to ghostscript に /usr/bin/gsと設定.

test0

Moodle の課題でPDF注釈によるフィードバックを有効化できる

test1

Moodle > Site Administration >Plugins>Annotate PDF >Path to Ghostscript で, Test Ghostscript path でスタンプにより注釈された画像が表示される

test2

学生が課題にPDFをアップロードし,教師が評定を開くと,PDF注釈のページが表示される.この段階で日本語も表示される.

poppler-utils のインストール(optional)

PDFのWebページ上の表示(のみ,注釈とは無関係)が高速化される.

sudo apt install poppler-utils

Moodle>Site Administration>Server>System paths>Path to pdftoppm に /usr/bin/pdftoppmと設定*2.

提出ファイルのPDFへの変換を可能にする設定

unoconv のインストール

Universal Office Converter (unoconv) - MoodleDocsの手順の通り行う.

test

unoconv --version
echo hello > afo.txt
unoconv -f pdf afo.txt

Python 3.12でdeprecate…のような警告がでるが,放置してかまわないようだ.

Document Converter の有効化

Moodle>Site Administration>Plugin>Document converfters>Manage document converter で Unoconv を有効化, Google Drive など他のConverterより上位に置く.

test1

Moodle>Site Administration/Plugins/Unoconv で, Test unoconv path, Download the converted pdf test file でPDFファイルがダウンロードできるはず.

test2

PDF注釈を有効化した課題に afo.txt をアップロードすると,PDFに変換されたものが評定ページで表示される

提出ファイルのPDFへの変換を日本語対応にする設定

この段階で日本語テキストファイルを提出すると, PDFでは日本語部分が豆腐になる. そこで, unoconv に日本語フォントを与える.

Noto-CJK フォントの導入

sudo apt install fonts-noto-cjk fonts-noto-cjk-extra

unoconv を service にしている場合は service を再起動する

sudo systemctl restart unoconv

test1

echo 日本語 > foo.txt
unoconv -f pdf foo.txt

test2

課題にアップロードした日本語テキストファイルも変換される

変換されたPDFへの注釈を可能にする

PDF注釈

この状態でできるはず.

test1

Moodle > Site Administration >Plugins>Annotate PDF >Path to Ghostscript で, Test Ghostscript path でスタンプにより注釈された画像が表示される

test2

PDF注釈で, ツール群がPDF表示の上に現れ, テキストツールで英語を書き込み, Download feedback PDFで, その内容が書かれたPDFファイルがダウンロードできる.

日本語によるPDF注釈を可能にする設定

この段階では, 注釈でつけた日本語のノートはPDF注釈後に豆腐になる. これを防ぐには, Moodle, tfpdf に日本語フォントを与える必要がある.

sudo vi $(MOODLE)/config.php

で tfpdf の持っているフォントを指定する.

$CFG->directorypermissions = 0777;
$CFG->pdfexportfont='kozminproregular'; 
//$CFG->pdfexportfont='kozminpromedium'; // On Debian?

HEIC 形式のファイルもPDFに変換する設定

HEICはiOSバイスが使う高圧縮な画像フォーマット. この段階では, 拡張子.heicのHEIC形式ファイルを課題に提出すると, PDF注釈ページではPDFに変換されず, Some of the files can only be accessed through download.という注記が表示される.

そこで,HEICからjpegへの変換をサポートする ImageMagick または libheif で前処理する導入する

Imagemagick のインストール

sudo apt install imagemagick
type -a convert

libheif のインストール

sudo apt install libheif-examples
type -a heif-convert

test

scp somewhere:iPhone/photo.heic .
convert photo.heic photo.jpeg

converter.php の書き換え

  • $(MOODLE)/files/converter/unoconv/classes/converter.phpで定義される converter クラスのメソッド protected static function fetch_supported_formats() が返す拡張子の配列に, 要素 'heic' を追加する.
388c405
<             self::$formats = array_unique($formats);
---
>             self::$formats = array_unique(array_merge($formats,['heic']));
  • convertクラスのメソッド public function start_document_conversion(\core_files\conversion $conversion) で, 作業ディレクトリへの提出ファイルのコピーが終わった後, 拡張子が 'heic'である場合のみ, /usr/bin/convert でJPEG形式に変換する前処理を追加し, その後,JPEGをunoconvがPDFに変換するようにする
128c128,145
<             }
---
>             } else { // hig
>                 if( \core_text::strtolower($fromformat) == 'heic'){
>                     $jpgfilename=$uniqdir . '/' . $file->get_id() . '.jpg';
>                     $cmd=escapeshellcmd("/usr/bin/convert"). ' '.
>//                   $cmd=escapeshellcmd("/usr/bin/heif-convert"). ' '.
>                         escapeshellarg($filename) . ' '.
>                         escapeshellarg($jpgfilename);
>
>                     $output = null;
>                     $currentdir = getcwd();
>                     chdir($uniqdir);
>
>                     $result = exec($cmd, $output, $returncode);
>                     $filename=$jpgfilename;
>
>                     chdir($currentdir);
>                     touch($filename);
>                 }
>             } // hig

このファイル converter.php は,Moodle 4.0 から変わっていなかった.

test

課題に拡張子 .heic のHEIC形式ファイルを提出すると, PDFに変換され,評定ページで表示される.

この方法でよい理由

クラスメソッドpublic static function supports($from, $to) で, unoconv が拡張子$fromから$toへの変換をサポートしているかを判定している. このメソッドは結局, unoconv --show で出力される, 対応拡張子リストを参照している.

これにはHEICは含まれないので, Moodleは変換しようとしない. また, 実際 unoconvは HEIC形式ファイルを扱えない. Imagemagick (convert) は HEIC形式を JPEG形式などに変換できるので, unoconv の前に convert で前処理することにした.

さらにやってもいいHEIC対応

Moodle > Site administration > Server > File types でHEICを登録すると, 提出ファイル一覧などで, 画像ファイルのアイコンが表示される.

*1:Moodleについてくる tFPDF により行われる. PHPファイルとしては($MOODLE)/mod/assign/feedback/editpdf/fpdi/Tfpdf あたり

*2:なければghostscriptにfallbackする

Apache2のmod_authnz_ldapからmod_auth_openidcに移行する可能性

Apache2のmod_authnz_ldapで, .htaccessAuthBasicProvider ldap を指定して組織のLDAPサーバを引いてディレクトリごとに認可していた.

環境の変化により, LDAPが使えなくなるが, Google WorkspaceのOpenID Connectは使えるので, 3rd party module mod_auth_openidc を使ってそちらに移行することを検討.

以下の記事が詳しく, とても有用だった. qiita.com

複数のDirectoryの ~/.htaccess に別々のRequire claim email:user1@example.com email:user1@example.com を書こうという話なのだが, 設定ファイルauth_openidc.conf で設定される OIDCCookiePath は, 相対URLとして上位(一部分)でなければいけないという(文書化されていない)要求があるようだ. デフォルトの/ならそうなる. 上の記事では, LocationとOIDCCookiePathを同じにしている. Locationが1個なら, それも可能な設定.

HEIC対応のImageMagickをCentOS7.9にインストール

普通にyumでインストールするにはCentOS7.9 は古すぎる. 対応するrpmを置いているrepositoryを探した.

  • remi から ImageMagick6 ImageMagick6-heic (plugin)
  • remi から libheif (ImageMagick6-heicのdependency, heif は heicと類縁の画像形式)
  • rpmfusion から 足りない libde265 と x265-libs (libheifのdependency, codec)

を, なんとか dependency を満たして導入できた.

インストールできたのは 6.9.12-63 で, iPhoneで撮ってPreview.appで加工したHEICをJPEGPNGにできている.

CentOS7で, 他にHEICを扱える画像処理ソフトウェアとして, vips-heic, ImageMagick7-heic もリストされていたが, 結局は libheif が必要で, どちらかが導入容易ということはなさそうだった.

利用目的はこれ. hig3.hatenadiary.com

Moodleの課題のPDF注釈フィードバックで日本語,JPEG,HEICを扱う with unoconv Document Converter

オープンソースのLMSであるMoodleには, 学生がファイルを提出する課題 Assignment 活動がある. PDF注釈Annotate PDFによるフィードバックでは, そのファイルが一律にPDFに変換されて評定ページで教師に提示され, 教師はPDF注釈を加えて学生に返すことができる.

この過程にはいくつかの外部プログラム, ライブラリが介在しており, (特に日本語フォントを要する場合は)設定が複雑. 今まで, Moodle.org のフォーラムに記事を投稿してきた.

PDF注釈は次のように進む.

  • 学生が課題に提出したファイルを unoconv がPDFに変換する
  • PDFはページで pdftopnm によって表示される
  • 評定ページで教師がPDFに書き込む操作をすると, tfpdf が注釈が加える

この順で, Universal Office Converter (unoconv) - MoodleDocsを参考に, 設定(手順)と確認(test)を示す.

バージョン

提出ファイルのPDFへの変換を可能にする設定

unoconv のインストール

su
apt install 
apt install libreoffice
chmod 777 /run/user/1000

Moodle>Site Administration>Plugins>Document converters>Unoconv>Path to unoconv document converterに /usr/bin/unoconvと設定.

Document Converter の有効化

Moodle>Site Administration>Plugin>Document converfters>Manage document converter で Unoconv を有効化, Google Drive など他のConverterより上位に置く.

test

unoconv --version
echo hello > afo.txt
unoconv -f pdf afo.txt

afo.pdfが生成できるはず((apt install unoconvだけだと, dependency でlibreoffice-core-noguiがインストールされるが, それだけだと, RuntimeException になる.libreofficeをインストールするとlibreoffice-core-nogui`はアンインストールされる)).

Apache HTTP Server が unoconv を使えるようにする設定

Directory permission

su
mkdir /var/www/.config
chmod 777 /var/www/.config

*1.

test

Moodle>Site Administration/Plugins/Unoconv で, Test unoconv path, Download the converted pdf test file でPDFファイルがダウンロードできるはず.

Moodle でPDFの表示を可能にする設定

Ghostscript のインストールが必要十分.

poppler のインストール

su
apt install poppler-utils

Moodle>Site Administration>Server>System paths>Path to pdftoppm に /usr/bin/pdftoppmと設定*2.

Moodle の課題でPDF注釈を有効化

そのためには, 事前にシステムパスに ghostscript を指定する必要がある.

Ghostscript のインストール

su
apt install ghostscript

Moodle>Site Administration>Server>System paths>Path to ghostscript に /usr/bin/gsと設定.

test1

Moodle > Site Administration >Plugins>Annotate PDF >Path to Ghostscript で, Test Ghostscript path でスタンプにより注釈された画像が表示される

test2

PDF注釈にチェックした課題で, 学生が英語テキストファイルを提出すると, 教師は評定ページで, PDFに変換されたものが見られるはず.

test3

PDF注釈で, ツール群がPDF表示の上に現れ, テキストツールで英語を書き込み, Download feedback PDFで, その内容が書かれたPDFファイルがダウンロードできる.

変換を日本語対応にする設定

この段階で日本語テキストファイルを提出すると, PDFでは日本語部分が豆腐になる. そこで, unoconv に日本語フォントを与える.

Noto-CJK フォントの導入

su
apt install fonts-noto-cjk

unoconv を service にしている場合は service の再起動

su
systemctl restart unoconv

test1

echo 日本語 > foo.txt
unoconv -f pdf foo.txt

test2

日本語テキストファイルも変換されるはず

変換されたPDFへの注釈を可能にする

注釈は, Moodleについてくる tFPDF により行われる. PHPファイルとしては($MOODLE)/mod/assign/feedback/editpdf/fpdi/Tfpdf あたり.

日本語による注釈を可能にする設定

この段階では, 注釈でつけた日本語のノートはPDF変換後に豆腐になる. これを防ぐには, Moodle, tfpdf に日本語フォントを与える必要がある.

su
vi $(MOODLE)/config.php

で tfpdf の持っているフォントを指定する.

$CFG->directorypermissions = 0777;
$CFG->pdfexportfont='kozminpromedium';
//$CFG->pdfexportfont='kozminproregular'; // On Ubuntu Server 22.04.3 LTS

拡張子jpegのファイルもunoconvで変換する設定

この段階で, 拡張子 jpg のJPEG形式ファイルはPDFに変換されるが, 拡張子が jpeg だと変換されない.

unoconv の書き換え

su
vi /usr/bin/unoconv

末尾に次を追加

fmts.add('graphics', 'jpg', 'jpg', 'Joint Photographic Experts Group', 'draw_jpg_Export') ### 3
fmts.add('graphics', 'jpg', 'jpeg', 'Joint Photographic Experts Group', 'draw_jpg_Export') ### 3 追加
fmts.add('presentation', 'jpg', 'jpg', 'Joint Photographic Experts Group', 'impress_jpg_Export') ### 19
fmts.add('presentation', 'jpg', 'jpeg', 'Joint Photographic Experts Group', 'impress_jpg_Export') ### 19 追加

test1

unoconv --show

test2

拡張子 jpeg のファイルを課題に提出するとPDFに変換され, 評定ページに表示される.

この方法でよい理由

$(MOODLE)/files/converter/unoconv/classes/converter.phpで定義される converter クラスのメソッドpublic static function supports($from, $to) で, unoconv が拡張子$fromから$toへの変換をサポートしているかを判定している. このメソッドは結局, unoconv --show で出力される, 対応拡張子リストを参照している.

unoconvは

unoconv -f pdf afo.jpeg

を正しく扱うが, 対応拡張子リストには [.jpeg]が表示されないので, それを追加している.

HEIC 形式のファイルを前処理で JPEG に変換する設定

HEICはiOSバイスが使う高圧縮な画像フォーマット. この段階では, 拡張子.heicのHEIC形式ファイルを課題に提出すると, PDF注釈ページではPDFに変換されず, Some of the files can only be accessed through download.という注記が表示される.

Imagemagick のインストール

su
apt install imagemagick
type -a convert

converter.php の書き換え

  • convert クラスのメソッド protected static function fetch_supported_formats() が返す拡張子の配列に, 要素 'heic' を追加する.
388c405
<             self::$formats = array_unique($formats);
---
>             self::$formats = array_unique(array_merge($formats,['heic']));
  • convertクラスのメソッド public function start_document_conversion(\core_files\conversion $conversion) で, 作業ディレクトリへの提出ファイルのコピーが終わった後, 拡張子が 'heic'である場合のみ, /usr/bin/convert でJPEG形式に変換する処理を追加し, 以下, 変換されたJPEG形式ファイルをunoconvで変換する.
128c128,145
<             }
---
>             } else { // hig
>                 if( \core_text::strtolower($fromformat) == 'heic'){
>                     $jpgfilename=$uniqdir . '/' . $file->get_id() . '.jpg';
>                     $cmd=escapeshellcmd("/usr/bin/convert"). ' '.
>                         escapeshellarg($filename) . ' '.
>                         escapeshellarg($jpgfilename);
>
>                     $output = null;
>                     $currentdir = getcwd();
>                     chdir($uniqdir);
>
>                     $result = exec($cmd, $output, $returncode);
>                     $filename=$jpgfilename;
>
>                     chdir($currentdir);
>                     touch($filename);
>                 }
>             } // hig

test

課題に拡張子 .heic のHEIC形式ファイルを提出すると, PDFに変換され表示される.

この方法でよい理由

heic はunoconv --showで表示されないので, Moodleは変換しようとしない. また, 実際 unoconvは HEIC形式ファイルを扱えない.

Imagemagick (convert) は HEIC形式を JPEG形式などに変換できるので, この問題に対処する方法として,

  • unoconv のwrapperを書いて, convert を前処理として呼び出す
  • $(MOODLE)/files/converter/unoconv/classes/converter.php を書き替えて unoconv の前に convert を呼び出すようにする.

の2つが考えられる. ここでは後者を採用した.

他のありうる方法

libheif-examples に含まれる heif-convert も heic を扱えるという.

さらにやってもいいこと

Moodle > Site administration > Server > File types で, JPEGやHEICを登録すると, 提出ファイル一覧などで, 画像ファイルのアイコンが表示される.

*1:Universal Office Converter (unoconv) - MoodleDocsには, Ubuntuの例で別のディレクトリ名が書いてあるが, Debianならたぶんこうだと思う

*2:なければghostscriptにfallbackするらしい

Disk full に近くなったときMoodleに起きること, してはいけない対処

UNIX/Linuxがdisk full になったときの振る舞いは root としてよく遭遇してきた.

今回は, CentOS6上のMoodle 3.11で, /var/lib/moodledata や MySQL が置かれた disk が full に近くなったとき, どのような振る舞いが見られるか観察する機会があった.

ページのAJAX UIを操作するだけでも, 「データベースに書けない」という警告のモーダルが出る, GETやページ遷移しようとすると, データベースと接続できないというPHPの(Moodleの?)エラーメッセージに飛ばされる*1.

この場合の想定される原因

課題に提出された多数の大きい画像ファイルで, 消去してもさしつかえないもの

考えられた対処と採用した対処と結果

  • 不採用 /var/lib/moodledata 内のファイルを手動で消去する
    • 可読なファイル名でないので不要な提出物やリソースかわからない
    • 手動で消去するとデータベースの記録と不整合になるだろう
  • 不採用 不要なコースをバックアップして消去する
    • バックアップファイルは(いったん?) /var/lib/moodledata 内に作られるから, 一時的であれディスク使用率をさらに高めるだろう, または完了しないおそれがある
  • 不採用 課題はそのままで提出ファイルをWebインターフェースから消去する
    • 教師に提出物の編集を許す設定なら, 1個ずつ手動で消去することはできるが, ファイルの個数が多すぎる
  • 採用 多数の不要な提出ファイルと紐付いた活動(課題)を消去し, ゴミ箱からも消去する
    • 課題を消去すれば, 紐付いた提出ファイルも cron で近々消去されるはず.
    • 結果 1つの課題は問題なく消去できた. 別の課題では, かえってディスク消費量が増して「データベースと接続できない」というエラーメッセージしか出なくなった. ゴミ箱に移す過程でも一時ファイルが作られるものと思われる

いつもどおりの教訓

ディスクに空きがあるうちに, コースや提出ファイルをバックアップや消去する作業をする. Moodle自身が管理者に警告を出してくれると助かるのが.

DSC_2833

*1:ファイルのアップロードも試行してみればよかった

Problems in upgrading from Moodle 3.10.3 to 3.11.3+

  • ひとつのコースが, invalidcoursemoduleid で使えなくなった. fix が進行中らしいので次の release を待つ. ちょうど開講終了したばかりのコースだが, 復習には必要. なお, 問題のコースから全インポート, や, 3.10 のときのバックアップをリストア, して作ったコースでは問題は生じない.
  • assignment に提出され unoconv で変換されたPDFが grading tool で表示されない… convert じゃなくて表示の話だろうと思って, cache, theme あたりをあたったが違っていた(?). 3.11 で導入された poppler-util の pdftopnm によるPDF to PNG変換を有効化したら直った. このシステムパスを管理者が手で書かない限りは, 従来機能していた gs に fallback するはずなのだが.
    • あらたに poppler-utils をインストールした(Debian).
  • なんか, すべての活動の日付と完了条件をはっきりしろって言われてる圧が強い. オンライン授業下で全授業Moodleでやる学生さんにはそういうのは大事でしょう.