#author("2024-04-17T11:26:38+00:00","default:iseki","iseki")
#author("2024-04-17T11:27:48+00:00","default:iseki","iseki")
* mod_lticontainer [#vc2f0b1e]
- サポート対象の MDLDockerSpawner が [[LTIDockerSpawner>JupyterHub/LTIDockerSpawner]] に名称を変更したので,このモジュールも mod_mdlds から mod_lticontainer へ名称を変更.(2021 9/17)
- さらに変更.[[LTIDockerSpawner>JupyterHub/LTIDockerSpawner]] は [[LTIContainerSpawner>JupyterHub/LTIContainerSpawner]] の一部になる (2021 10/3).迷路は続くよ何処までも.
-- 当然 [[LTIPodmanSpawner>JupyterHub/LTIPodmanSpawner]] でも使用可能.


** [[Moodle]] Module for Moodle & [[JupyterHub]] Integration [#s675b15a]
- gitlab: https://gitlab.nsl.tuis.ac.jp/iseki/mod_lticontainer

- [[LTIDockerSpawner>JupyterHub/LTIDockerSpawner]],  [[LTIPodmanSpawner>JupyterHub/LTIPodmanSpawner]] をサポートする,Moodle用モジュール
- see also. [[Moodle+JupyterHub]]

** GitHub
*** mod_lticontainer [#mdf183de]
- https://github.com/moodle-fumihax/mod_lticontainer
- https://github.com/moodle-fumihax/mod_lticontainer/wiki
- 日本語: https://github.com/moodle-fumihax/mod_lticontainer/wiki/mod_lticontainer-(J)
** 機能(Tab) [#d7fb0b70]

*** Over View [#tad57f26]
- 表紙
- 設定表示


*** Lti Connections [#h22de680]
- コース内にある LTI接続の一覧 -> Lti Edit へのリンク
- 表示設定へのリンク


*** Lti Settings [#z3069e1d]
- Lti Connections での,表示・非表示設定


*** Lti Edit [#ae39bec4]
- [[LTI]](外部サービス)インスタンスのカスタムパラメータを書き換える.
-- 通常は DB上のデータを書き換えるだけ.
-- カスタムパラメータ自体は,JupyterHubに実際に接続(ログイン)した時に送られる.
- データを更新したタイミングで Dockerのボリュームを作成するように設定することも可能.


**** カスタムパラメータ一覧 [#zb17a132]
- lms_users=
- lms_teachers=
- lms_image=
- lms_defurl=
- lms_cpulimit=
- lms_memlimit=
- lms_vol_表示名=
- lms_prs_表示名=
- lms_sub_表示名=
- lms_prs_表示名=
- lms_sub_表示名_close=
- lms_sessionifo=
- lms_iframe=

- カスタムパラメータ名は snake_case で記述


**** Accessible users [#l4e19364]
- LTIのカスタムパラメータの ''lms_users'' に対応 
- Volume セクションで記述したボリュームをマウントできるユーザを指定する.
- ユーザはMoodleのユーザ名を,カンマ(,)または空白で区切って記述する.
- デフォルト(空欄)では全てのユーザがボリュームをマウントできない.
- アスタリスク(*)は全てのユーザがボリュームをマウントできることを表す.


**** Teachers [#zc5de450]
- LTIカスタムパラメータの ''lms_teachers'' に対応
- コースの教師を指定する.指定の仕方は,lms_user と同じ.* も使えるが,使う意味がない.(全員教師って何?)
- 途中で教師のメンバを変更した場合は,Task volume および Submit volume のオーナが教師グループから外れる可能性があるので,注意が必要.
-'' 教師の特権''
-- Task volume に書き込みができる.
-- Submit volume にあるファイルの読み込み,コピー,削除ができる.
-- ボリュームのアクセス名の先頭に マイナス(-) を付けた場合,教師に対してのみアクセス用のリンクが張られる(-は削除されてリンクが張られる)
--- 学生にリンクによるアクセスをさせたくない場合に使用(セキュリティ的な意味ではなく,操作上の学生の混乱を少なくさせるためのもの)
--- ''Personal volume を使うときに,Task volumeにマイナス付きのリンク名を指定すると便利.''と言うか,そのために作った. 


**** Container image [#h616d693]
- LTIのカスタムパラメータの ''lms_image'' に対応
- 起動するコンテイメージを指定する.デフォルトの場合は,設定ファイルで指定したイメージ.
- Jupyter Lab/Notebook 以外のイメージを選択した場合は,漏れなくシステムが死にます.
-- じゃあ,Jupyter Lab/Notebook のイメージだけ表示すればと言われても,%%私の現時点でのスキルでは無理です%%.
-- 一応イメージ名に含まれる文字列に対して,フィルターを掛けることができるようにしました.


**** Default URL [#b8add38d]
- LTIのカスタムパラメータの ''lms_defurl'' に対応
- Lab か Notebook のどちらにアクセスするかのURLを指定する.デフォルトは設定ファイルで指定したURL.
- Lab を指定した場合は,起動するコンテイメージが Labをサポートしていないと 404 not found になる.


**** CPU Limit [#nd4baaa6]
- ''lms_cpulimit'' に対応.
- Docker コンテナ内での CPU数の上限


**** Memory Limit [#d46eb1f0]
- ''lms_memlimit'' に対応.
- Docker コンテナ内での メモリの上限
- CPU Limit は 0.1 でも結構動くが,メモリ 120Mぐらいだと JupyterHub/singleuser のコンテナは起動しない.
-- 140M くらいだと何とかコンテナは起動するが,ほぼ使えない.
-- 180M くらいで何とか使用できるようになる.
-- mod_lticontainer では,余裕を考えてきりのいい 200M から表示.


**** Volume セクション [#m11ddd29]
- Task volume, Submit volume はユーザが JupyterHubにアクセスしたときに(許可があれば)マウントされる.
-- 許可ユーザの書き方は lms_user(Accessible users) と同じ.ただしデフォルト(空欄)では,全てのユーザが許可される.
-- lms_user(Accessible users)よりも,ここで指定される個々の許可ユーザの方が優先される.
-- * も使用できるが意味はない. 空欄にしておけば良いので.
-- 通常は誰かが jupyterHubにアクセスしてログインした瞬間に(ボリュームが存在しなければ)ボリュームが作成され,マウントされる.
-- マウントポイントは,ボリュームを外した場合もそのまま残るので見た目が良くない.ドット(.) ディレクトリの下に隠すと良い.
- コースの LTIインスタンス毎にユーザに見せるディレクトリを変更できる.
- マウントしたボリュームには,アクセス名によるシンボリックリンクでアクセス可能.
-- ボリュームの再利用に便利.
-- マウントポイントだけ存在して,実際にはマウントされてないボリュームとの識別に便利
-- マウントポイントをドット(.) ディレクトリの下に隠すことができるので,見た目もすっきり.

- Volume のマウントコマンドをカスタムパラメータから削除するには,アクセス名の無いエントリを作成する.
-- Personal Volume については,カスタムパラメータから削除すると,存在自体を忘れてしまう可能性があるので注意(自分のディレクトリを見て確認可能)

- 表示名の指定について
-- アルファベット小文字,及び数字のみ使用可能
-- 三種類のボリューム(vol, sub, prs)について,同じ表示名が指定できる.

- アクセス名について
-- 漢字指定可能
-- ドット(.)を指定すると,ボリュームのフルネームでリンクが作られる.(ln -s ボリューム名 .  が実行されるため)
-- アクセス名の無いエントリを作成すると,カスタムパラメータから削除される.
-- ボリュームのアクセス名の先頭に マイナス(-) を付けた場合,教師に対してのみアクセス用のリンクが張られる(-は削除されてリンクが張られる)


***** Task volume [#j8ff684d]
- LTIのカスタムパラメータの ''lms_vol_表示名=アクセス名: 許可ユーザ'' に対応
- 課題提示用ボリューム.教師は書き込み可能だが,学生は読み出しのみ可能
-  Volumes タブで削除可能
- パーミッション:rwxrwsr-x,  オーナ:一番最初にアクセスした教師,グループ:教師
- 教師 UMASK 0033, 学生 UMASK 0037


***** Submit volume [#h71a48b0]
- LTIのカスタムパラメータの ''lms_sub_表示名=アクセス名: 許可ユーザ'' に対応
- 課題回収用ボリューム.教師は読み出し(書き込み,削除:これはオーナのみ)が可能だが,学生は課題の提出(書き込み)と自分の提出した課題にのみアクセス(読み出し,削除)可能
-  Volumes タブで削除可能
- パーミッション:rwxrwsrwt,オーナ:一番最初にアクセスした教師,グループ:教師
- 教師 UMASK 0033, 学生 UMASK 0037


***** Personal volume [#xde7793d]
- LTIのカスタムパラメータの ''lms_prs_表示名=アクセス名: 許可ユーザ'' に対応
- これはユーザの専用ボリュームに''恒久的に作成されるディレクトリ''である.
- ユーザ本人しかアクセスできない.(コンテナ起動時の管理プロセスを除く)
- Task volume, Submit volume は Volumes タブで削除可能だが,これは一度作成するとシステムの管理者またはユーザ本人しか削除できない
-- このモジュールからの削除は,やってやれないこともないが,現時点ではその機能は実装されていない.
- ''Task volume と同じ名前(表示名)で作成すると,コンテナ起動時に Task volume の内容がここにコピーされる.''
-- 課題配布に使用するのが主な目的.
-- 取り扱いが面倒だが,上手く使えば強力.

- 許可ユーザに名前がない場合は,ディレクトリに対して何の操作も行われない.(ディレクトリ自体は存在)
-- アクセス名からのリンクは行われない.
-- Task volume と同じ名前(表示名)にしても,コピーは行われない.


**** その他のカスタムパラメータ [#w8e77374]
- ''lms_sessionifo'' : このモジュールのインスタンスIDと対応する LTIインスタンスのIDが自動的に設定される.
-- ユーザが気にすることは何もない.このデータは実際には feserver の feplg_nbwsモジュールに送られてる.
- ''lms_iframe'' : iframeサポート.自動的に設定される.
-- %%ただし正常に動かすためには,jupyterhub_config.py の host_url を設定しなければならない.%%
-- host_url を設定しなくとも動きますが,デフォルトの host_url はセキュリティ的にちと甘いです.可能なら設定してください. 
-- ホストの Python のバージョンが 3.7以下の場合は使用できない(jupyterhubのエラーになる).tornado が cookie の samesite を処理できないため.
--- jupyterhub のエラーメッセージ:http.cookies.CookieError: Invalid attribute 'samesite' 

- 現時点で(実装しているけど)使用していないカスタムパラメータ.
-- lms_options :コマンドオプション.そのうち使うかも.

- このモジュールが使用するもの以外の カスタムパラメータには一切影響を及ぼさない.


*** Volumes [#v8f11413]
- 関連する Dockerボリュームの表示名の一覧とその削除.
- Personal volume は操作対象外.
- 表示されるボリューム名(表示名)は,省略された名前.
- ボリュームのフルネーム(正式名): ''lms_[ vol | sub | prs ]_表示名_コースID_MoodleホストのFQDN''
-- 例:''lms_vol_xyz_98_el.mml.tuis.ac.jp''


** Trouble Shooting [#cb048806]
**** Call to undefined function posix_getpwuid() [#hafc01be]
- php-process をインストールする
 yum -y install php-process

**** The web server process does not have write access to its own home directory. Please check the permissions. [#ja22db7c]
- Webサーバの実効ユーザのホームディレクトリを調べて,そのディレクトリを実効ユーザの持ち物にする.
 vipw /etc/passwd
 cd /usr/share/httpd/
 chown apache.apache .


** 課題の配布と回収例 [#z4207c5c]

*** lms_vol と lms_sub を使用する. [#c7ce7bf8]
**** 課題作成 [#k47c555f]
+ 設定
-- lms_user : 空欄
-- lms_teacher : 自分のユーザ名
-- lms_image : 課題で使用するイメージ
-- lms_vol : 適当なアクセス名,許可ユーザに自分のユーザ名
+ JupyterHub にログイン.
+ lms_vol 内で教材を作成.他の適当なディレクトリで作業しても良い.
+ ipynb_deploy コマンドでファイルを変換・コピー.
++ ipynb_deploy コマンドは,後で採点や統計作業を行い易いようにするために,ファイル内のコードセルに通し番号を付ける.
++ lms_vol 内で作業していて,作業場所をそのまま公開する場合は,''ipynb_deploy . ''と入力する.
++ ipynb_deploy コマンドを実行する前に,必ずファイルのバックアップを取ること.もし ipynb_deploy の実行によりファイルが破損しても,当方は一切責任は持てません.


**** 課題公開 [#f395156f]
+ 設定
-- lms_user : *
-- lms_teacher : 自分のユーザ名
-- lms_image : 課題で使用するイメージ
-- lms_vol : 課題提示用ボリューム.適当なアクセス名を指定.許可ユーザは空欄
-- lms_sub : 課題収集用ボリューム.適当なアクセス名を指定.許可ユーザは空欄.


**** 課題の実施(学生) [#dc3f3da2]
+ ''学生は,lms_vol 内から,自分の作業用場所(~/jupyter または ~/jupyter/works 下など)に課題ファイルをコピー''
+ 課題を行う.
+ 提出は,課題ファイルを指定された提出用 lms_sub ボリュームにコピーする.この際,ファイル名に自分の学籍番号,名前を追加する.
++ ファイル提出の際には ''ipynb_submit'' コマンドが使用できる.ipynb_submi はファイル名にユーザ名を自動的に付け加えて,指定されたフォルダにコピーする.
++ 例)''ipynb_submit kadai-1.ipynb  課題1提出用'' 


*** 加えて lms_prs を使用する. [#f2ab0290]
**** 課題作成 [#u9ae551e]
+ 設定
-- lms_user : 空欄
-- lms_teacher : 自分のユーザ名
-- lms_image : 課題で使用するイメージ
-- lms_vol : ''先頭にマイナス(-)を付けたアクセス名''.許可ユーザに自分のユーザ名
+ JupyterHub にログイン.
+ lms_vol 内で教材を作成.以前作成した教材ファイルとファイル名が被らないように注意する.他の適当なディレクトリで作業しても良い.
+ ipynb_deploy コマンドで課題ファイルを変換・コピー.
++ ipynb_deploy コマンドは,後で採点や統計作業を行い易いようにするために,ファイル内のコードセルに通し番号を付ける.
++ lms_vol 内で作業していて,作業場所をそのまま公開する場合は,''ipynb_deploy .  ''と入力する.
++ 注)ipynb_deploy コマンドを実行する前に,必ずファイルのバックアップを取ること.もし ipynb_deploy の実行によりファイルが破損しても,当方は一切責任は持てません. 


**** 課題公開 [#leb1cb54]
+ 設定
-- lms_user : *
-- lms_teacher : 自分のユーザ名
-- lms_image : 課題で使用するイメージ
-- lms_vol : 先頭にマイナス(-)を付けたアクセス名,許可ユーザは空欄.学生にはリンク名は表示されない.
-- lms_prs : 表示名はlms_vol と同じにする.アクセス名は適当な名前.許可ユーザは空欄.
-- lms_sub : 課題収集用ボリューム.適当なアクセス名.許可ユーザは空欄.


**** 課題の実施(学生) [#g9c148c0]
+ ''学生は lms_prs 内にあるファイルを使って,そのまま課題を行う.''
+ 提出は,課題ファイルを指定された提出用 lms_sub ボリュームにコピーする.この際,ファイル名に自分の学籍番号,名前を追加する.
++ ファイル提出の際には ''ipynb_submit'' コマンドが使用できる.ipynb_submi はファイル名にユーザ名を自動的に付け加えて,指定されたフォルダにコピーする.
++ 例)''ipynb_submit kadai-1.ipynb 課題1提出用'' 
- 強制的に教師側で課題を回収する方法も検討中.


** オプション [#td7f849a]
*** Moodle [#qfea410a]
**** XML-RPC [#w4125370]
- feserver の feplg_nbws モジュールからの XML-PRC を受信し,データをデータベースに格納可能.
- オプションだから,やらなくても良い(feserver を使用しなくても良い)


** Install, 設定 [#h55d9c51]

*** Install [#cb55e0da]
 # cd {moodle_dir}/mod
 # git clone https://gitlab.nsl.tuis.ac.jp/iseki/mod_lticontainer.git
 # mv mod_lticontainer ltids
 # chown -R apache.apache ltids
 access to moodle by admin

*** container_rsock.sh [#b8408faf]
- Docker/Podman のリモートコントロール用シェルスクリプト
- ssh のポートフォワーディングを使って,UNIXのソケットファイルを繋げる.
- Docker/Podman ホスト側に,sshでログイン可能な(ログイン)ユーザが必要.


**** LMS 側について [#x2ea61d9]
- docker クライアント(/usr/bin/docker)が必要


**** docker/podman 側のログインユーザについて [#u03a87eb]
+ ユーザのホームディレクトリについて,ユーザが書き込み可能であること.
++ CentOS8 で嵌った.ユーザを dockerにしたんだが,docker/podmanのホームディレクトリなのに,docker/podmanが書き込み可能でなかった.
+ ユーザが docker/podman のグループに属していること(UNIXソケットファイルにアクセスするため).
+ ユーザのログインシェルは不要



*** ipynb_deploy [#r5db573e]
- ipynb ファイル内のコードセルに通し番号を付ける.
- 学習記録分析などの,後処理用


** System [#hc13caeb]

*** [[DB>./DB]] [#df5455f9]
- [[mdl_lticontainer>./DB/mdl_lticontainer]] 
- [[mdl_lticontainer_client_data>./DB/mdl_lticontainer_client_data]]
- [[mdl_lticontainer_server_data>./DB/mdl_lticontainer_server_data]]
- [[mdl_lticontainer_session  >./DB/mdl_lticontainer_session]]
- [[mdl_lticontainer_tags>./DB/mdl_lticontainer_tags]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 ページ一覧 検索 最終更新   ヘルプ   最終更新のRSS