Posted at
kaggleDay 23

kaggleのkernelでオフラインジャッジ付き教材を作った


概要

kaggleのkernelやdatasetの機能を用いて、AtCoderのようなオンラインジャッジもどきを含む教材のようなものを作ってみました→AIMS_binary_search_ja

kernelの仕様と私の力不足で完璧なものを作ることはできませんでしたが、練習用として用いるならばおおよそ使えそうなものはできたと思うのでforkして遊んでみてください。ここから下では作った感想などを書いていきます。


作ったモチベーション

courseraの授業にはjupyter hubを用いたNotebook形式の課題が出ることがあります。Andrew先生の授業の深層学習モデルを実装する課題では細かなテストケースがついていて、デバッグの手間を減らしながら実装できたので感動しました。

これと同様のものをkaggleのkernelを使って作ることで、勉強会の資料を受講者に環境構築を強いることなく手を動かして学べる教材が作れると思ったので、私の所属する学生団体のAIMSの勉強会用にそれっぽい資料を作ってみました。


中身の解説


コードのインポート

教材でnotebook上に出したくないコード等は、pythonファイルにしてdataset内に入れました。pythonでは実行ファイル上の階層にあるファイルのimportはsys.pathにモジュールのあるパスを追加することでインポートできるようになります。※参考: https://chaika.hatenablog.com/entry/2018/08/24/090000


ビジュアライザの作成

二分探索は可視化しやすいアルゴリズムだったので、ipywidgetsのinteractを用いて動かしながら雰囲気を掴んでもらえるようなのを作りました。一回一回figureを書き直しているので動きは重めですが、参加者には好評でした。


ジャッジ部分の作成

初めは文字列を適当なファイルで実行した後、subprocess.POPENを用いて実行する予定だったのですが、subprocessからpython.exeを呼び出せなかったので断念しました。代わりに、組み込み関数のexecを用いて文字列を実行しようとしたのですが、そのままだとglobal変数が呼び出したいコードに混じってしまい、かといってexecの変数のglobalsとlocalsに空の辞書を与えると変数の定義が上手くいかなくなってしまいました。今回はmain関数を定義しその中に提出されたscriptを埋め込むことでそれっぽく見せましたが、あまりよくない方法なので他に方法があれば探したいです。


テストケースの作成

問題ごとに乱数を用いてテストケースを作り、入力用のファイルと模範解答のファイルを用意しました。zipファイルにまとめて入れて、kaggleのdatasetの中に加えました。


参加者から頂いた意見


文字列にそのままコーディングしようとしてバグらせてしまった。


コーディング用のテストケースをつけておき、動いたらテストケースでチェックするといった導線を貼った方が良かったかもしれません。


notebookはそれぞれのセルがjson形式みたいに保存されているので、そこからコードを読み取って提出できないか


これは面白そうなアイデアでした。提出用のセルの上部にコメントをつけておき、ジャッジ時に識別用のコメントの書いてあるセルを探し実行という形にすれば、参加者の負荷が減りそうな気がします。(実行中のnotebookを読み取ることができるのかは分かりませんが)


練習問題の難易度が高い


二分探索は典型だし、丁寧に誘導しているからやるだけレベルになっていると勘違いしていました。


まとめ(感想)

それっぽいものは作れましたが、まだまだ改善の余地が大きいです。今後は先人達の優れたkernelを読み、ブログ感覚でこまめにkernelを書いて精進しながらkernelのメダルも狙っていきたいです。