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

hig3.hatenadiary.com

4年経過し,ディスクの大きいサーバに移ったが,管理者の即応力が落ちたため,$moodledata=/var/lib/moodledata ディレクトリのあるdiskがfullになった後の挙動を観察することができた.ディスク使用量増加の主な原因は,学生による課題へのファイル提出.Moodle 4.4.

このときログインしようとすると,ログイン前ページが「エラー:セッションパーティションが満杯です。現在ログインできません。サーバ管理者にご連絡ください。」となる*1*2.$moodledata/sessions にセッション情報が保存できなくなるためと思われる.

この状態になると,管理者ロールのユーザもログインできない.したがって,

のうち,Webインターフェース経由の対処案は却下で,サーバへのSSHログインで対処する必要がある.df で100%に見えても,rootはreserveされたdiskを使って作業できるはず.

対処1

この状態でも,Apacheや,Moodleのスケジュールタスクはログファイル等を生み出して,開けたdiskを食い潰していく.そこで次の対応.

systemctl apache stop
EDITOR=vi crontab -u www-data -e #でcron.php をコメントアウト

cron.php を止めるのは,この停止に伴って課題の締め切りを延長しようと思っているので,変更前のスケジュールに従って通知メールが送られないようにするという意図もある.

対処2

Moodleをmaintenance modeに置きたい.下の Moodle admin cli を使う.ログインを防ぐ以外に,"メンテナンス中です"というアナウンスに切り替えたかったのだが,結果としては,すぐApacheがディスク不足のために(?)responseを返せなくなって,ログイン前ページ自体が表示されなくなった.

対処3

本当にディスクに余裕を作る必要がある

手段

サーバのコマンドラインへでの操作による * シェルやmysqlでファイルを直に操作する * Moodle admin cli 管理者が実行できる Moodleの低レベルのphp-cli * moosh 管理者が実行できる Moodleの高レベルのcli

消去対象

  • 採用 Moodleに限らない一時ファイルやログファイルをシェルの操作で消す
  • 不採用 $moodledata 内の課題提出ファイルをシェルで消去する
    • 可読なファイル名でないので不要な提出物やリソースかわからない
    • 手動で消去するとデータベースの記録と不整合になるだろう
  • 採用 Moodle admin cli
    • purge_cache.php
    • kill_all_sessions.php
    • maintenance.php
    • delete_course.php
  • 採用 Moosh
    • シェルとmysqlのラッパー.特定のコースを消す,特定のコースの特定の課題を,データベース的一貫性を保って消す,ことができる,ので有力な候補になる.しかし,ディスクが実際に開くのは,ゴミ箱に移された後,数日後に本当にcronで消去される*3
    • activity-delete
    • course-delete
    • cache-clear
  • 不採用 Mooshと同等のことをシェルとmysqlで行うこともできるだろう

対処3の失敗

Moodle admin cli, moosh の大部分は,一時的に追加のディスクを使うものと思われる.sudo -u root なら余分のディスクを使えるのだろうが,安全のためには sudo -u www-data でやりたいと思うと,使えるものがなかった.

対処?4

このMoodleサーバーは仮想マシン上にあったので,仮想マシン管理者に頼んでディスクを増やしてもらう.今回はこれを採用.そんな記事ありか?

対処5

  • Apache起動
systemctl apache start
  • 動作チェック
  • Web インターフェースから課題の締め切り変更
  • maintenance mode 解除
  • 動作チェック
EDITOR=vi crontab -u www-data -e #でcron.php を有効化
  • 停止していた旨の連絡

いつもどおりの教訓

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

*1:これが学生からレポートされたことにより管理者は初めて気づいた

*2:ログイン中のユーザに起きる事象は不明

*3:今回の対処タイムスケールとしては遅すぎる

Moodle 5.0 から 5.1 へのアップグレードは怖くなかった(今のところ)

最近のMoodle *1では,Router, Composer の導入など,管理者にしか影響しない,しかし大きい(?)変更が多い.かなり先までロードマップが描かれているのだろう.

Moodle 5.1へのアップグレードで,ディレクトリ構成の変更というのが来た.いくつか3rd partyプラグインも導入しているので,下手にアップグレードするより遷宮*2した方がましかと思っっていたが,アップグレードしてみたらできた.

変更

Moodle 5.0でのアップグレード前の設定

#Apache2 
DocumentRoot /var/www/html
/* Moodle's config.php */
$CFG->wwwroot   = 'https://www.example.com/moodle';
$CFG->dirroot   = '/var/www/html/moodle'; /* config.php に書く必要なし.config.php が置かれているディレクトリ */
$CFG->dataroot  = '/var/lib/moodledata';

Moodle 5.1へのアップグレードでの変更

$CFG->dirroot_new   = '/var/www/moodle';
/* config.php をこう書き換えるという意味ではない.Moodleの配布ファイル全体をここにmvしたという意味. */

手順

  • Moodle admin で maintenance mode にする
  • git fetch, pull, and switch
    • $CFG->dirroot/public が作られる
  • 後知恵としては,自分で導入したものが5.1で動くプラグインばかりなら,あらかじめ$CFG->dirroot/public 下に移動しておいたら簡単だった.
  • sudo mv $CFG->dirroot $CFG->dirroot_new
  • ln -s $CFG->dirroot/public $CFG->dirroot_new
  • Moodle admin でWebからアップグレード
    • いくつかのプラグインが missing on disk になる
      • データベースの記録では導入されているのに,public 下にそのプラグインがないという警告
    • それでもアップグレードは完了する
  • missing on disk なプラグインのファイルは,$CFG->dirroot_new に移動されて,local, mod/* question/type question/behaviour などに残っている.これらは5.1では $CFG->dirroot_new/public 下に置かれるべきもの.Coreはそうなっている.そこで,手動で $CFG->dirroot_new/public 下にmvする
  • Moodle adminでWebからアップグレードを完了する
    • この過程で,長く使ってきたlocal プラグイン CSV Enrols & Groups が,Moodle全体にエラーを引き起こすらしいことに気づく.確かに5.* はサポート対象でない.mvせず前に,プラグイン概要から削除する.
    • どのプラグインが原因か突き止めるのにちょっと時間がかかった,サポートされていないプラグインは1個ずつmvした方が楽かも

*1:オープンソースのLMS

*2:新規サーバにクリーンインストールとも言う

Webブラウザ内のOverleafエディタに適用されるスペルチェック

アプリ上のスペルチェックは様々なレイヤーで行われる.

macOSで,Webブラウザ内のOverleafエディタで意図しないスペルチェックが行われるとき,スペルチェックを設定変更したり,止めたりするときにチェックするところ.

Overleaf integration

ex. Writefull integration

Overleaf Account > Integrations > Language Feedback

Writefull integration - Overleaf, Online LaTeX Editor

Overleaf

Menu > Spell Check, Dictionary

Chrome Extension

ex. Grammerly for Desktop, Writefull for Overleaf

その他… > 拡張機能 >

Chrome

その他… > 設定 > 言語 > スペルチェック

テキスト入力

ex. ATOK

環境設定 >[入力・変換]シート > [英語-スペルチェック]>[スペルチェック候補を表示する]

英語のスペルをチェックする

macOS

設定>キーボード>テキスト入力

Macで入力候補を表示する/誤りを修正する - Apple サポート (日本)

iPhone7+povo2のLINEアカウントをAndroid+no SIMに移す

目的

LINE bot 検証用に,古い私物iPhone(コンテンツあり)と前払格安SIM povo で運用していたLINEアカウントを, コンテンツ空の専用新品SIM-free でAndroidに移して,検証者さんに課したい.

  • bot対ユーザの1対1のbotでは,私用LINEアカウントで実験すれば十分だが,1対多のbot(例:マッチングアプリ)では複数のLINEアカウントで実験したい
  • LINEには1電話番号1アカウントしか作れない
  • 月額料金は払いたくない(実験予算では払いにくい)
  • 着信のみ料金無料に近いSIMで電話番号だけ確保したい
  • 検証者には,私物iPhoneでなく専用のAndroidを渡したい

材料

作業手順案1(失敗)

  • 両者の電源を切る
  • nanoSIMのハードウェアを差し直す
  • Android起動,povoのモバイル回線有効化
  • PlayストアからLINEアプリをインストール
  • LINEアカウントを新規登録(旧アカウントは消える?)

モバイル回線とLINEアカウントがiPhoneからAndroidに移るはず

結果1(失敗)

  • 調べてなかったけど,FLAT 1C は nanoSIMに対応してた!
  • Android では nanoSIM が認識され,電波強度マーク4Gがでる
  • SMS送受信, 通話発着信いずれもできない
    • 通話発信では「ネットワークがビジー状態です」と言われる
    • nanoSIMをiPhoneに戻すと,着信履歴が記録されている
  • LINEアカウントを新規登録では,電話番号を入力してSMSで送られてくる認証コードを一定時間内に入力するか,通話して認証コードを聞き取らなくてはいけないがそれができない
  • LINEアカウント移行しようとしても,SIMのない状態ではiPhoneのLINEアプリは起動しない

分析1

AndroidスマートフォンでSIMカードの開通手続きの設定を行っても通信ができません。 – povoサポート

作業手順案2

  • iPhoneにSIMを挿した状態で,両者の電源をいれる
  • iPhoneのLINEアプリを起動し移行用QRコードを表示
    • 60秒ごとに更新されるが問題ない
  • AndroidWi-FI接続
  • AndroidのLINEアプリのインストール過程で,iPhoneに表示された移行用QRコードをスキャン
  • SIMはiPhoneに挿したまま

結果2

  • SIMなし,Wi-FiのみのAndroidのLINEアプリが,元のLINEアカウントで使える
  • SIMありiPhoneのLINEアプリは使えなくなる
    • もちろん通話SMSは元のまま使える

これでいいじゃん?

LaTeXだけで様々な分布関数の値を求める・グラフを描くには

LaTeX では,graphicx パッケージで関数のグラフの画像を貼ることができる.しかし,外部で*1画像ファイルを用意しておくのでなく,LaTeX内だけでグラフを描けないか?次のようなパッケージで,初等関数・三角関数・指数関数・対数関数くらいなら描ける.

グラフが描けるくらいだから,これらの関数の値を求めて,文字列としてタイプセットすることもることもできる.

統計学に現れる正規分布ガウス分布関数は四則演算と指数関数の組合せなのでこの方法で書けるが,その累積分布関数(誤差関数)やその逆関数(分位数関数)は明示的な形では書けないし,専用の関数は用意されていない.さらに,カイ二乗分布,t分布,F分布なども用意されていない*2

では,LuaTeXの一部である lulalatex から呼び出せるスクリプト言語Lua*3ではこれらの関数があるのではと期待するが,実はない.そこで,多くの方がこれを補うLuaの非公式のパッケージを開発している.これらを LuaLaTeX から使うことができる.

Lua-Stats の LuaLaTeX での使用例

\begin{luacode}
  stats = require("stats")
  local result = stats.dChisq(0.5,5)
  --  tex.print(result)
\end{luacode}test

The quantile at $p=0.5$ of the chi-square distribution with df$=5$ 
is \directlua{tex.print(stats.qChisq(0.5,5))}.

https://github.com/hig3r/Lua-Stats/tree/lualatex

https://github.com/hig3r/Lua-Stats/blob/lualatex/lualatex-stats-sample.pdf

tikzpicture 環境ではグラフが描けたが,pgfplots の高レベルの axis 環境では描けていない.

LuaSF の LuaLaTeX での使用例

gist.github.com

Notes

  • Lua-Stats と LuaSF の混在も問題ない.
  • LuaでないLaTeXで,PSTrickを使う方法もある*4

*1:gnuplotMathematicaやLLMで

*2:もちろん特定の母数に対して多項式近似をして値を求めたりグラフを描いたりすることはできる.例 https://tex.stackexchange.com/questions/40908/plotting-the-chi-square-distribution-with-tikz

*3:ゲームや組み込み用途で使われている.ヤマハのルータなど https://www.rtpro.yamaha.co.jp/RT/docs/lua/

*4:pst-func https://tex.stackexchange.com/questions/40908/plotting-the-chi-square-distribution-with-tikz

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する