Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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