この投稿は 「Django Advent Calendar 2017 - Qiita」 の 19日目の記事です。
こんにちは、akiyoko です。
「Django Advent Calendar」は 2年連続 4度目の参加になります。昨年は最後まで枠が空いていたので、調子に乗って3日分も担当してしまいました。 *1, *2, *3
あと、2年前に Python製 CMS「Mezzanine」を紹介したときの流れで、煽りタイトルを付けてしまいました。重ね重ね申し訳ございません。
《過去記事》
akiyoko.hatenablog.jp
はじめに
オープンソースの LMS(学習管理システム)と言えば、
などがまず真っ先に挙げられますが、今回紹介するのは、Python 製で Webフレームワークの代表格「Django」をベースに開発されたオープンソースの LMS、その名も「RELATE」です。 *4
例えば、Pythonista なあなたが LMS を開発することになったとしましょう。
良さげな候補が Moodle しか見つからず、「仕方ない、Moodle をカスタマイズするか。はぁ、PHP か・・」というのは精神衛生上よろしくないですよね?(すいません、個人の意見です。)
そんなとき、Moodle じゃない Python製の LMS があればワクワクしてきませんか? ・・しませんか、そうですか。
あとよく聞くのは、Moodle は要らない機能が多すぎるという問題。ちょっとしたテキストと動画、小テスト(クイズ)が受講できる講座をオンラインで実施したいだけなら、もっとシンプルなものが求められるケースもありますよね。
しかも、Moodle は GPLライセンス のため、Moodle をカスタマイズしてオンライン学習サービスをリリースした場合にはソースコードの公開が求められることになります。
Moodleはコピー・利用・修正してかまいませんが,条件として,ソースコードを公開し,元のライセンスや著作権表示を修正したり削除したりせず,同じライセンスをMoodleから派生したソフトにも与えなければなりません。
そのため、BtoB 向けに Moodle をカスタマイズして提供するというのはライセンス上どうしても困難な面があるかと思います。その点、RELATE は MITライセンス なのでソースコードの公開義務はありません。機能追加し放題、思う存分カスタマイズすることができます。
RELATE の特徴
まず、RELATE には、
- Python 製、Django ベース
- コースコンテンツを Markdown 形式で記述(プログラマ向け!)
- コースコンテンツは1講座ごとに Git 管理(管理画面でバージョンの切り替えも可能)
- VideoJS による動画埋め込みを標準サポート
- 日本語にも翻訳可能 *5
といった特徴があります。中でも、コースコンテンツを Markdown で書くという特徴はオンリーワンじゃないでしょうか(私の知る限りで)。
画面はトップ画面、テキスト(動画)画面、クイズ画面、成績画面、管理側画面などで構成され、LMS としてひと通りの機能が揃っています。機能はさほど多くないですが、実用的でしっかりと作り込まれており、Moodle や Canvas の2000オーバーには及びませんが、GitHub スターは現時点で120ほど付いています。また、Python 3、Django 1.11 にも対応しています。
ところで Django 1.11 なら、この「Two Scoops of Django」シリーズの最新版が絶対オススメです。英語ですが(と言っても難しい感じの本ではないです)、現場で役立つこと間違いなしのナンバーワン Django本です。
GitHub の履歴を覗いてみると、2014年5月から inducer がコツコツとプロトタイプを作り始め、dzhuang が途中で加わり、現在は主に二人で開発を続けていますが、最近も頻繁にコミットがされています(今日も何件かコミットされていました)。
inducler(Andreas Klöckner)はプロフィールを公開していて、ドイツ出身で現在はイリノイ州立大学のコンピュータサイエンスの助教授をしているとのこと。自身(?)の オンラインクラス にこの RELATE を使っているようです。なので、ちゃんと Python や Django のバージョンアップに追随しているのですね。
全部を一個人が作ったのではなく(一応)複数人が開発していて、Issue や PR をオープンに受け入れているのでサポートもある程度期待できそうです。何よりも、ベースが Django なのでコードが理解しやすくカスタマイズしやすいのが嬉しいところです。
これで SPA だったら最高なのになぁ、と思ったあなた。・・そんなあなたのために、「Web Expedition」(webexp)という「Django + Angular」なイケてる LMS を見つけておきました(*6)。一応オープンソースなのですが開発者が最新版のソースコードを push してないのか、昔触ったときにうまく動かなかった記憶がありますのでご注意を。
Ubuntu 16.04 on Docker for Mac で構築してみる
Ubuntu 16.04 on Docker for Mac 上に RELATE のサイトを構築してみます。
もちろん、以下の構築手順は本番向けではありませんのでくれぐれもご注意を。
環境
$ sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G1114 $ docker --version Docker version 17.09.1-ce, build 19e2cf6
Docker コンテナを起動
$ docker run -it -p 80:8000 --name relate ubuntu:16.04 # cat /etc/issue Ubuntu 16.04.3 LTS \n \l # apt-get update # apt-get install -y python3-dev python3-pip # pip3 install -U pip # apt-get install -y vim git curl # python3 -V Python 3.5.2 # pip3 -V pip 9.0.1 from /usr/local/lib/python3.5/dist-packages (python 3.5) ### Bower をインストール # apt-get install -y nodejs npm # nodejs -v v4.2.6 # npm -v 3.5.2 # npm install -g bower
以降は、Installation — RELATE 2015.1 documentation を参考にして RELATE のインストールを進めていきます。
なお、検証時の RELATE のバージョンは、66d3d38 です(2017/12/19 時点の最新版)。
# cd /opt/ # git clone https://github.com/inducer/relate.git ### 事前にコースコンテンツも配置しておく # git clone https://github.com/inducer/relate-sample.git # cd relate # pip3 install -r requirements.txt
ここで、
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-uh2f9ekj/django-select2/
というエラーが出る場合がありますが、「django-select2」6.0.0 のバグの可能性があります。
diff --git a/requirements.txt b/requirements.txt index 3a5dbd3..e39372f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -94,7 +94,7 @@ git+https://github.com/celery/django-celery.git@6232c79557517afa74967fcb980c0db2 # }}} # For searchable select widgets -django_select2>=5.5.0 +django_select2<6 # To sanitize HTML generated by user code bleach>=2.0,<3
と修正して
# pip3 install -r requirements.txt
をやり直せば、うまくインストールできました。
# cp local_settings.example.py local_settings.py # vi local_settings.py
で、
ALLOWED_HOSTS = ["*"]
に変更。
# python3 manage.py migrate # python3 manage.py createsuperuser ### (admin/admin@example.com/pass) # python3 manage.py bower_install --allow-root
ここで、Ubuntu 16 は "node" ではなくて "nodejs" として認識するため、ここで以下のようなエラーが出てしまう場合があります。
/usr/bin/env: 'node': No such file or directory
この場合は、以下のコマンドを実行すれば OK です。
# ln -s /usr/bin/nodejs /usr/bin/node
改めて、
# python3 manage.py bower_install --allow-root
を実行。
最後に、runserver を起動します。
# python3 manage.py runserver 0.0.0.0:8000
ブラウザで、
http://localhost/login/
にアクセスします。
コースコンテンツの登録
「Sign in」のリンクを辿り、superuser でログインします。
ログインできたら、「Set up new course」ボタンをクリックします。
以下のようにサンプル講座の設定をおこない、「Validate and create」ボタンを押下。
Course identifier: t-001 Course name: Test Course Number: T001 Time period: March 2018 Start date: End date: Only visible to course staff: チェック Listed on main page: チェック Accepts enrollment: チェック Git source: /opt/relate-sample SSH private key: Course root in repository: Course file: course.yml(デフォルト) Events file: events.yml(デフォルト) Enrollment approval required: Enrollment required email suffix: From emai: admin@example.com Notify email: admin@example.com
サンプル講座のトップ画面が表示されます。
講座を受講してみる
本来は受講者を作成してログインし直すべきですが(成りすましモードもあります)、このまま進めていきます。
トップ画面から以下のリンクをクリックするか、「http://localhost/course/t-001/flow/001-linalg-recap/start/」にアクセスすると、テキストページのフローに進むことができます。
ここに動画やテキストを配置します。ページ移動は上部のナビゲーションから可能です。
次に、クイズ(小テスト)です。
トップ画面から、「sample quiz」というリンクをクリックするか、「http://localhost/course/t-001/flow/quiz-test/start/」にアクセスします。
クイズが横に並んでいます。
いろんな形式のクイズを出すことができます。
クイズの形式はこの他にも多数用意されています。
クイズを提出する場合は、右側のボタンをクリック。
確認画面が表示されます。
結果画面も用意されています。
完了したクイズは、後で振り返りをすることもできます。
管理者側の画面で成績の一覧をチェックすることも可能です。
まとめ
2年前に Python製で Django ベースの CMS「Mezzanine」を紹介しましたが、今回は同じく Python 製で Django ベースの LMS「RELATE」を紹介してみました。
Django ベースで開発されているため、Django に慣れている Pythonista であれば容易にカスタマイズができますし、既存の様々なライブラリを利用することができるため、思うがままの LMS を創り上げることができます。
これを機にオリジナルのオンライン学習サービスをリリースしてみてはいかがでしょうか。
明日は、kzkamago0721 さんの「Django Advent Calendar 2017 - Qiita」 20日目の記事です。よろしくお願いします。
*1:昨年は最後まで枠が空いていたので、調子に乗って3日分も担当してしまいました。《過去記事》akiyoko.hatenablog.jp
*2:《過去記事》akiyoko.hatenablog.jp
*3:《過去記事》akiyoko.hatenablog.jp
*4:検索に引っかかりにくい名前つけやがって、こんちくしょう!!
*5:ただし、コースコンテンツの翻訳は難しいかも。
*6:Quiz Web App with Django + Angular and deployment on pythonanywhere | Bhargav Patel