クラスがブラウザーで実行する Python の演習課題を出す
コーディング課題は、ファイルと、何をすべきかを説明する文章、そして必要に応じて動作を確かめるテストでできています。一度書けば、いくつのクラスにでも配布でき、生徒は全員、自由に壊せる自分用のコピーを受け取ります。ここで述べることは、Java、Go、Node(JavaScript)、Node(TypeScript)、Bash の課題にも当てはまります。違いは言語のページにあります。
演習を書く
モジュールで「新しい課題」を押して Python のカードを選ぶと、片側に最初のコード、もう片側に説明文のあるエディターが開きます。説明文には見出し、リスト、コードを使えるので、例を例として読みやすく示せます。
ファイルに残しておいたものが、各生徒の出発点になります。docstring だけのひな形でも、書きかけの関数でも、空のファイルでもかまいません。
- 課題を追加する. モジュールの「課題」タブで「新しい課題」を押すと、そのすぐ下にカードが開きます。種類ごとにカードがあり、コード・図・クイズ・ラボに分かれているので、グループを選べばクイズやラボも1回押すだけで作れます。Esc キーか「閉じる」で閉じられます。課題がまだ1つもないモジュールでは、最初からカードが表示されています。Python のカードを押すと、課題は untitled-python という名前で開きます。名前はいつでも、エディター上部の名前の横にある鉛筆アイコンから変更できます。「課題」ページにも同じカードがあり、そこでは先にコースとモジュールを選びます。どのモジュールに入れるか決める前に、書きたい内容が決まっているときに便利です。
- 最初のコードを書く. 生徒全員が最初に開くコードです。
- 説明文を書く. 何をすればよいかを、配布プリントではなくコードの横に書きます。
- 配布する. 生徒を選ぶか、クラス全員を選びます。一人ひとりが自分用のコピーを受け取ります。

自動で採点するテストを付ける
プログラムを実行する課題には、どれにもテストを付けられます。Python は pytest、Java は JUnit 5、Go は go test、JavaScript と TypeScript は Node 標準のテストランナーを使います。Bash のテストは、エラーなく終了すれば合格になるスクリプトです。生徒は「テストを実行」を押して、どれが合格したかを確認します。あなたも、生徒に聞かなくてもその生徒のページで同じ結果を見られます。
テストは非表示にして生徒から隠せます。評価ではこれが肝心で、生徒に見えるのは6件中4件が合格したということだけで、失敗したアサーションは見えません。だから演習が演習のままでいられます。
テストを非表示にしても、生徒が自分の作業を確かめる手段がなくなるわけではありません。その場合の「テスト」タブは、生徒自身の空の入力欄で、生徒のコピーと一緒に保存されます。ボタンは2つあります。「自分のテストを実行」は生徒のプログラムをその欄に対して実行し、何も記録しません。「非表示のテストを実行」は教員のテストを実行し、課題一覧の合否はこちらから決まります。生徒自身のテストがその結果を変えることはなく、課題のパッケージはどちらの実行でもインストールされます。あとで教員のテストを表示すると、生徒が次にその課題を開いたときに、生徒の入力欄は教員のテストに置き換わります。
必要ならデータファイルを渡す
課題には、プログラムが読み込むデータファイルを付けられます。測定値の CSV や、単語を数えるためのテキストファイルなどです。実行時にはコードと同じ場所に置かれるので、`open('data.csv')` は書いてあるとおりに動きます。
データファイルはテキストである必要があります。プラットフォームは名前を信用せず、ファイルの中身を読んで判断します。そのため data.csv に名前を変えた画像は拒否され、拡張子のないテキストファイルは受け付けられます。Excel が書き出す CSV の先頭に付くバイト順マーク(BOM)は取り除かれるので、1行目が正しく読めます。生徒は自分のコピーで、教員のファイルの横に自分のデータファイルを添付できます。添付できるのは1つだけで、別のファイルを添付すると置き換わり、名前は教員のファイルと違うものにする必要があります。データファイルは最大 64 KB です。
複数のファイルを持たせる
コーディング課題は1つのファイルである必要はありません。課題のファイルはエディターの横にツリーとして表示されます。「新しいファイル」と「新しいフォルダー」で作成し、「アップロード」でコンピューターからテキストファイルを取り込み、「名前の変更・移動」ではパス全体を指定します。たとえば lib/helpers.py とすると lib フォルダーにファイルが入り、プログラムはそこからインポートします。1つの課題に置けるのは最大50個、1ファイル64 KB まで、合計1 MB までのテキストファイルです。アップロードしたファイルは中身を読んで確認するため、data.csv と名前を変えた画像は受け付けられません。各ファイルはそれぞれの言語で開くので、README.md は Markdown、.csv はプレーンテキストになります。
プログラムは「実行の起点」と表示されたファイルで、これも名前を変えたりフォルダーに移したりできます。拡張子は言語のものから変えられず、Java、C#、Haskell、Kotlin のプログラムはどこに置いても名前は変わりません。「削除」を押すとすぐにファイルが消え、数秒間は横の「元に戻す」で戻せます。フォルダーはファイルが入っている間だけ存在するため、新しいフォルダーは最初のファイルと一緒に作ります。ツリーでは矢印キーでファイル間を移動してフォルダーを開閉し、Enter でファイルを開き、F2 で名前を変更し、Delete で削除します。
課題を配布すると、すべてのファイルが各生徒にコピーされます。生徒には同じツリーが表示され、自分のコピーではどのファイルも編集できます。生徒が自分でファイルを追加できるのは課題が複数のファイルを許可している場合だけで、あなたが渡したファイルの名前は変わりません。練習用ファイルとプレイグラウンドにも同じツリーがあります。テストのファイルとパッケージリストは、これまでどおり1つずつです。パッケージリストはツリーの最上位にある「パッケージ」の印が付いたファイルで、「課題で使えるプログラミング言語の一覧」で説明しています。Web ページと SQL の課題には追加のファイルを持たせられません。ペインそのものがそれらの構成だからです。1つのファイルのままにしたい演習では、課題の設定で「複数のファイル」のチェックを外してください。すでにあるファイルはそのまま残り、名前の変更や移動もできます。
フォルダーを使ったプロジェクト、そこで使う本物のパッケージファイル、Git リポジトリから課題全体を読み込む方法には、このマニュアルにそれぞれ専用のページがあります。
データサイエンス向けのノートブック
課題を作るときに「ノートブック」を選ぶと、Jupyter ノートブックになります。テキストのセルと Python のセルでできていて、Jupyter、VS Code、Colab で開けるファイルです。セルの追加、移動、削除ができ、テキストセルは Markdown で編集します。
実行すると、すべてのコードセルを先頭から順に、まっさらなプロセスで実行し、各セルの出力をそのセルの下に表示します。表示されたテキスト、最後の行の値、pandas の表、matplotlib の図です。セルは Jupyter と同じように変数を共有しますが、実行と実行のあいだには何も残らないので、生徒が見るのはノートブックが実際に行うことそのものです。セルが失敗するとそこで止まり、セルと行を示し、後続のセルは実行されなかったと伝えます。
保存されるのはセルだけで、出力は保存されません。そのため、コードがもう出さない結果をノートブックが見せ続けることはありません。新しいノートブックでは、ファイルツリーの最上位にある requirements.txt に pandas、numpy、matplotlib が宣言されています。課題で使わないものは削除してください。パッケージが増えるほど最初の実行は遅くなります。パッケージを使う課題は、制限時間を自分で設定しない限り、少なくとも 30 秒与えられます。
非公開テストはプログラムと同じように動きます。コードセルが 1 つの Python ファイルにまとめられ、テストはノートブック自身の関数を名前で呼び出します。提出、採点、グループ、制限時間などは他のプログラムと同じです。
セルを 1 つずつ実行することもできます。各コードセルに専用の実行ボタンがあり、Shift+Enter でセルを実行して次のセルへ進みます。常駐のカーネルがセル間で変数を保持するので、あるセルで読み込んだデータを、読み込み直さずに次のセルで使えます。「すべて実行」は全コードセルを順に実行し、「カーネルを再起動」はすべてを忘れてまっさらな状態から始めます。ページの実行ボタンは別物で、常に何もない状態から始めてノートブック全体を実行し、先頭から再現できることを確かめます。カーネルは 15 分使われないとき、または 1 つのセルが 1 分を超えて実行されたりメモリを使いすぎたりしたときに停止し、そのセルがその旨を表示して、次のセルはまっさらなカーネルで始まります。セル内の `input()` はそのセルで失敗し、`%` や `!` で始まるほかの行は省かれ、その旨が表示されます。ただし `%pip install 名前==1.2.3` は、承認済みの一覧にあるパッケージの正確なバージョンを 1 つインストールします。実行中のカーネルにはパッケージを追加できないため、カーネルが再起動され、前のセルの変数は再実行するまで失われます。全員が必要とするパッケージは、requirements.txt に書くほうが適切です。「中断」は実行中のセルを止め、カーネルとその変数は残します。pandas の表は表として表示されます。
既にあるノートブックを使うには「.ipynb を読み込む」を押してファイルを選びます。ファイルのセルがページのセルと置き換わり(履歴で以前のバージョンに戻せます)、保存されていた出力は読み込まれません。別の言語向けのノートブックや、出力を除いて 200 セルまたは 60 KB を超えるノートブックは、理由を示して拒否されます。「.ipynb として書き出す」は、その時点でセルが表示している内容を含めて、Jupyter、VS Code、Colab 向けのノートブックをダウンロードします。
グループ向けに出す
課題は、個人ではなくグループ向けに出せます。各グループには1つのコピーが渡され、グループの誰でも編集でき、誰でも提出でき、点数はグループのものになります。グループは課題の「メンバー」タブの「グループ」で作ります。モジュールの全員、またはその時点でオンラインの生徒から自動で分けることも、各生徒をグループの見出しの下に移して手動で分けることもできます。変更するたびに保存されます。
グループ課題は、グループを通してしか持てません。どのグループにも入っていない生徒に配布しようとすると拒否され、メッセージにその生徒の名前が出ます。すでに個別に配布した課題は、その生徒を外すまでグループ課題にできず、チェックボックスにもそう表示されます。クイズはグループ課題にできません。
ファイルを同時に入力できるのは1人だけです。ほかのメンバーには、そのファイルが入力中の人の名前付きで読み取り専用として表示され、課題のほかのファイルは編集できます。ノートパソコンを閉じると、約1分後にそのファイルが解放されます。グループ課題では生徒ごとの記録は残らず、個別のコピーも点数も、誰が開いたかの記録もありません。1人のメンバーに認めた延長は、グループ全体のものになります。
必要なら制限時間を付ける
どの課題にも制限時間を付けられます。課題の設定で「時間制限を設ける」にチェックを入れて分数を入力します。上限は4時間です。時計は各生徒が初めて課題を開いたときに始まり、プラットフォームが管理するので、再読み込みやクッキーの削除では始まりに戻りません。また、教員が採点のために作業を開いても時計は始まりません。
時間切れになったときにどうするかを選べます。超過したことを記録に残すだけか、実際に作業を止めるかです。チェックを外しておくと、超過は生徒と教員に表示されるだけで何も拒否されません。「時間切れになったら作業を止める」にチェックを入れると、その時点で保存と提出が止まります。ただしクイズは、どれだけ遅れても必ず受け付けて採点します。どちらの場合も入力した内容は失われません。エディターは最後のキー入力の1秒後に保存するからです。
作業を差し戻すと、生徒の時計は新しくなります。課題の一覧は、生徒自身のものも教員のモジュールのものも、誰かが開く前から「制限時間」バッジに分数を表示します。開くことが時計を始めるからです。
1回の実行にかけられる時間
これは制限時間とは別のもので、「実行」を1回押す、またはテストを1回実行するとき、プログラムが止められるまでに使える時間です。何も設定しなければ、Python、Bash、Node、SQL は10秒、先にコンパイルが必要な Java、Go、Node(TypeScript)は20秒です。パッケージを宣言した Go、Java、Node(TypeScript)の課題は45秒になり、最初の実行でパッケージの取得とビルドをする時間が取れます。
変えるには、課題の設定の「実行時間の上限」に秒数を入力します。上限は60秒で、0ならば上記の初期値のままです。初期値より短くすることもできるので、「2秒以内に終わらせる」といった演習も成り立ちます。60秒を超える値は、黙って下げられるのではなく拒否されます。生徒が課題の許す時間を1秒でも超えて要求することはできません。
時間切れで止められた実行は、そのことを表示し、それまでに出力した内容は残します。標準入力はコードの下の入力欄で、16 KB までです。出力が多すぎるプログラムの出力は途中で切られ、その旨が表示されます。
課題に関することはどこにあるか
課題には4つのタブがあります。「課題エディター」は課題を書く場所です。「課題の設定」には、生徒が見られるもの・変更できるもの、実行時間の上限、「AI に質問」、制限時間、締め切り、点数があります。「状況」は誰が課題を持っていて進み具合がどうかを示し、「メンバー」は課題の対象者、オーナー、グループ課題ならグループを示します。
ここには「保存」ボタンがありません
設定はどれも、変更した少し後に自動で保存され、その項目の横に「保存しました」と表示されます。これはこのページだけでなくプラットフォーム全体に共通です。課題の設定、モジュールの設定、学校の情報と料金、クイズのビルダー、相談を受ける担当者の空き状況表もそうです。
プラットフォームが受け付けない値は、入力中にその欄の横で受け付けられない旨が示され、保存できる値になるまでは何も送信されません。文字数などに上限がある欄では、上限に近づくと残りがどれだけかが表示され、次の文字を黙って受け付けない、ということはありません。
ボタンを押す操作が今も残っているのは、押すとほかの誰かに届く場所だけです。案件を保存すると、新たにチェックを入れた顧客に招待が送られ、取り消せないため、入力の合間の保存ではなく、判断として押すものになっています。
よくある質問
- 生徒はテストを見られますか?
- 許可した場合だけです。課題の設定の「テストを生徒に表示」で切り替えます。非表示のテストは件数しか伝えないので、評価にはこちらが向いており、生徒は「テスト」タブに自分用のテストを書くこともできます。練習には見えるテストのほうが適しています。失敗したテストを読むこともひとつのスキルだからです。
- 生徒のパソコンに Python をインストールする必要はありますか?
- いいえ。コードは当社のマシン上で、毎回新しいコンテナーで実行されます。
- 演習を来年のクラスでも使い回せますか?
- はい。課題はモジュールではなく書いた人のものなので、同じ課題をもう一度配布することも、ほかの教員に提供することもできます。
- プログラムは何秒まで実行できますか?
- 初期値は10秒で、Java、Go、Node(TypeScript)は20秒です。課題の設定で最大60秒まで延ばせます。