Slide 1

Slide 1 text

オンラインコンパイラ 「Amadeus」の開発 OSC 前夜祭 @mrtc0

Slide 2

Slide 2 text

> whoami もりたこ(@mrtc0) 広島工業大学 B3 #seccamp'15,16 #ctf4b NW/Forensics WebApp Pentenster (好きな||嫌いな)脆弱性: DOM Based XSS 2

Slide 3

Slide 3 text

Amadeusとは? 3

Slide 4

Slide 4 text

Aiming to the most accessible development environment for university students 学生のための開発環境(オンラインコンパイラ) 4

Slide 5

Slide 5 text

牧瀬紅莉栖とは関係ないです 5

Slide 6

Slide 6 text

> 背景 プログラミング初学者がどこで躓くのか テスト(試験)だけではわからない コーディングの様子を監視したい 環境構築に時間を取らせたくない VisualStudio, MSYS, Cygwin... オンラインコンパイルつくるか!! 6

Slide 7

Slide 7 text

> 構成 バックエンド Django REST Framework, NodeJS フロントエンド VueJS, ReactJS, Electron コンテナ LXD 7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

> 特徴 多言語 C(gcc,clang), Java, Scala, Python, Ruby... RESTful API 補完可能なエディタ AceEditorをfork 入力を1文字ずつロギング Online Judge機能 9

Slide 10

Slide 10 text

> 特徴 ユーザーのリアルタイム監視 コピペの検知, 正解までのdiffなど 変数トレーサー GDBのPythonAPIを利用 Terminal gottyをfork etc チャットなど 10

Slide 11

Slide 11 text

> DEMO 11

Slide 12

Slide 12 text

> コンテナ ユーザーのコードを安全に実行 コード実行環境を隔離/仮想化 コンテナ技術の利用 cgroupsやNamespaceによるホストとの分離 ホスト側/他コンテナに影響を及ぼさない できるだけ速く,オーバーヘッドが小さいもの 12

Slide 13

Slide 13 text

> どのコンテナ使うか問題 Docker? FreeBSD Jail? LXC? Dockerはオーバーヘッドが大きい印象があった 速度, スケーラビリティでLXDを採用 LXCをより柔軟に扱うための機構 (OpenStackプラグインもあるので遊びたい... 13

Slide 14

Slide 14 text

> Security 各種リソース制限 LXC cgroupsでCPUやメモリ使用量, プロセス 数を制限 ディスク領域の制限 特に設けていない(!w) LXDはZFS, btrfsでのみ制限可能 Quotaで制限をかけるか検討中 14

Slide 15

Slide 15 text

> Restful API Django REST Frameworkで実装 $.ajax({ 'type': 'POST', 'url': '/api/compiler/', 'data' : { 'post_code': '#include \nint main()...', 'stdin': '1 2 3', 'language': 'c-gcc', ... }, 'dataType' : 'json', ... 15

Slide 16

Slide 16 text

> ユーザーの監視 担当講師が1人ずつ見て回るのは大変 全員のコーディング状況を把握 チャットによるアドバイス Server Sent EventとWebSocket 16

Slide 17

Slide 17 text

> DjangoでWebSocket しんどい Nginx + uwsgiで苦戦 NodeJS(Express)で実装することに DjangoのセッションをNodeJSから利用する Redisにセッション情報を保存 NginxのリバースプロキシでCookieのSOP制限 回避 17

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

> その他 無限ループ対策 SIGALRMをPythonから叩く @timeout(5) def execute_code(): # コンテナでコードを実行する関数 ... except TimeoutError: container.execute('kill -9 a.out') ... 19

Slide 20

Slide 20 text

> 作ってみて/運用してみて 型... UI構成が難しい ここが一番しんどかった どこに何のボタンを配置すればいいか DB, モデル設計大事... 「SQLアンチパターン」をもっと早く読んでお くべきだった... 20

Slide 21

Slide 21 text

> 作ってみて/運用してみて 学習から試験まで使える上に全てのログが取れる ので重点的に教える箇所が分かる ユーザー(学生)から好評 やはりこれが一番うれしかった 21

Slide 22

Slide 22 text

> 今後の展望 取得したデータの分析 対応言語などの拡張 教師の自動化とプログラムの評価 できればOSS化していきたい 22