-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
282 lines (271 loc) · 15.7 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="教學用線上評測系統">
<title>Judge Girl 批改娘 | Judge Girl 批改娘</title>
<link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.6.0/pure-min.css">
<link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.6.0/grids-responsive-min.css">
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css">
<link rel="stylesheet" href="stylesheets/layouts/marketing.css">
</head>
<body>
<div class="header">
<div class="home-menu pure-menu pure-menu-horizontal pure-menu-fixed">
<a class="pure-menu-heading" href="">Judge Girl 批改娘</a>
<ul class="pure-menu-list">
<li class="pure-menu-item pure-menu-selected"><a href="https://github.com/JudgeGirl/JudgeNode" class="pure-menu-link">Home</a></li>
</ul>
</div>
</div>
<div class="splash-container">
<div class="splash">
<h1 class="splash-head">Judge Girl 批改娘</h1>
<p class="splash-subhead">教學用線上評測系統</p>
<p>
<a href="https://github.com/JudgeGirl/JudgeNode" class="pure-button pure-button-primary">Get Started</a>
</p>
<p>
<!-- GitHub Star -->
<iframe src="https://ghbtns.com/github-btn.html?user=JudgeGirl&repo=JudgeNode&type=star&count=true" frameborder="0" scrolling="0" width="110px" height="20px"></iframe>
<!-- GitHub fork -->
<iframe src="https://ghbtns.com/github-btn.html?user=JudgeGirl&repo=JudgeNode&type=fork&count=true" frameborder="0" scrolling="0" width="110px" height="20px"></iframe>
<!-- Tweet button -->
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://hexo.io/" data-text="Hexo - A fast, simple & powerful blog framework powered by Node.js." data-hashtags="hexo,nodejs">Tweet</a>
<script>
window.twttr=(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return;js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);t._e=[];t.ready=function(f){t._e.push(f);};return t;}(document,"script","twitter-wjs"));
</script>
</p>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<h1 id="judge-girl-批改娘簡易安裝手冊">Judge Girl 批改娘簡易安裝手冊</h1>
<h2 id="準備工作">準備工作</h2>
<p>一台 Linux 作業系統,最好是 Ubuntu。(CentOS 和 Debian 可能會沒有建立沙盒所需要的新版套件)</p>
<h2 id="起步">起步</h2>
<p>假定現在給一台 Ubuntu 14.04 的主機,先增加兩個使用者帳號。</p>
<pre><code># adduser judgesister
# adduser butler
</code></pre><p><code>judgesister</code> 作為前端網頁和發送測試工作,<code>butler</code> 作為運行測試工作。從關係上來看,<code>butler</code> 允許在不同主機上運行。</p>
<h2 id="安裝套件">安裝套件</h2>
<pre><code># apt-get install cgroup-tools // Debian
# apt-get install cgroup-bin cgroup-lite libcgroup1 // Ubuntu
# apt-get install build-essential nodejs npm
# apt-get install mysql-server
</code></pre><ul>
<li><code>cgroup-tools</code> 為 Ubuntu 上 cgroup 的相關套件,沙盒需要 <code>/sys/fs/cgroup/memory/</code>。</li>
<li><code>build-essential nodejs npm</code> 評測系統後台需使用 gcc 編譯器、前端使用 nodejs 和 npm 套件管理。</li>
<li><code>mysql-server</code> 資料庫系統使用 MySQL。</li>
</ul>
<h2 id="安裝模組">安裝模組</h2>
<pre><code>$ cd /home/judgesister/
$ git clone https://github.com/JudgeGirl/JudgeNode
$ git clone https://github.com/JudgeGirl/Judge-receiver
$ git clone https://github.com/JudgeGirl/Judge-sender
$ git clone https://github.com/JudgeGirl/Judge-MySQL
$ git clone https://github.com/JudgeGirl/Judge-template
</code></pre><p>系統大致上分成四個部份 </p>
<ul>
<li>JudgeNode (前端網頁)</li>
<li>Judge-sender (發送測試工作)</li>
<li>Judge-receiver (運行測試工作)</li>
<li>Judge-MySQL (網站資料庫系統)</li>
</ul>
<h3 id="judge-mysql">Judge-MySQL</h3>
<h4 id="安裝">安裝</h4>
<p>記得一開始安裝 <code>mysql-server</code> 的 root 密碼,皆下來創立專屬於 Judge Girl 專用的 database。建立一個 <code>deploy_mysql.sh</code>,檔案內容如下:</p>
<pre><code>$ cat deploy_mysql.sh
#!/bin/bash
EXPECTED_ARGS=3
E_BADARGS=65
MYSQL=`which mysql`
Q1="CREATE DATABASE IF NOT EXISTS $1;"
Q2="GRANT USAGE ON *.* TO $2@localhost IDENTIFIED BY '$3';"
Q3="GRANT ALL PRIVILEGES ON $1.* TO $2@localhost;"
Q4="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}${Q4}"
if [ $# -ne $EXPECTED_ARGS ]
then
echo "Usage: $0 dbname dbuser dbpass"
exit $E_BADARGS
fi
$MYSQL -uroot -p -e "$SQL"
</code></pre><p>接著,將其變成執行檔後,輸入資料庫名稱、使用者帳號和密碼。</p>
<pre><code>$ chmod +x deploy_mysql.sh
$ ./deploy_mysql.sh <database> <user> <password>
</code></pre><p>接著進入 MySQL,貼上 <code>./Judge-MySQL/CREATE_TABLE.sql</code> 的內容,</p>
<pre><code>$ mysql -u root -p
mysql >> use judgegirl
mysql >> <copy Judge-MySQL/CREATE_TABLE.sql>
</code></pre><p>建立約 11 個 Table,可以利用下述指令確定是否完成。</p>
<pre><code>mysql >> use judgegirl
mysql >> show tables
</code></pre><h3 id="judge-sender">Judge-sender</h3>
<h4 id="安裝">安裝</h4>
<p>定時偵測資料庫中還沒有測試的原始碼,抓取後將測資和原始碼一同丟到遠端機器上進行測試,遠端機器也可以是自身,遠端機器需按照 Judge-receiver 的步驟構造。</p>
<p>由於 MySQL 不支援 python 3,但支持 python 2,安裝額外套件使得 MySQL 得以在 python 3 上運行。首先,安裝 <code>python3-dev</code>,等下 python3 安裝過程中會需要相關的套件。</p>
<pre><code># apt-get install python3-dev
</code></pre><p>接著,按照網路提供的<a href="http://stackoverflow.com/questions/12031151/how-to-install-mysqldb-with-python-3-2">方案</a> 解決。安裝時特別小心 python3 的 working directory,務必到該目錄下進行安裝。</p>
<pre><code>$ cd install_tutorial
$ python distribute_setup.py
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-0.6 | tar xz
$ cd PyMySQL-PyMySQL-7c86923/
$ python3 setup.py install
</code></pre><ul>
<li>如果出現 <code>setuptools not found</code> <a href="https://github.com/JudgeGirl/Judge-sender/issues/5">issue</a><pre><code>wget https://bootstrap.pypa.io/ez_setup.py -O - | python3
</code></pre></li>
<li>如果出現 <code>mysql_config not found</code> <a href="https://github.com/JudgeGirl/Judge-sender/issues/4">issue</a> <pre><code>apt-get install libmysqlclient-dev
</code></pre></li>
</ul>
<p>由於是遠端遙控,目前採用 ssh 遠端登入,要使用不需要密碼的方式登入遠端,假設從 <code>root@a.a.a.a</code> 登入到遠端的 <code>butler@b.b.b.b</code> 上 (意即用 root 身分執行 <code>./Judge-sender/start</code> 運行),如果在同一台主機,直接 <code>root$ cp ~/.ssh/id_rsa.pub /home/butler/.ssh/authorized_keys</code> 即可。</p>
<pre><code>root@a.a.a.a# ssh-keygen -t rsa
root@a.a.a.a# scp ~/.ssh/id_rsa.pub butler@b.b.b.b:~/.ssh/
root@a.a.a.a# ssh butler@b.b.b.b
butler@b.b.b.b$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
</code></pre><h3 id="judge-receiver">Judge-receiver</h3>
<p>若使用同一台電腦,將剛剛安裝的 Judge-receiver 下的檔案編譯後,丟到 butler 的家目錄,並且確定檔案權限。</p>
<pre><code>$ make -C /home/judgesister/Judge-receiver/slave/ clean
$ make -C /home/judgesister/Judge-receiver/slave/
$ cp -r /home/judgesister/Judge-receiver/slave/* /home/butler
# chown butler:butler /home/butler/butler
# chown butler:butler /home/butler/tiger
# chmod +s /home/butler/sandbox
</code></pre><p>例如要遠端連到 <code>butler@a.a.a.a</code>,在 butler 的家目錄配置如下,權限部份請特別小心 sandbox 的執行檔,必須 <code>chmod +s sandbox</code>。</p>
<pre><code>root@supermicro:/home/butler# ls -l
total 832
-rwxr-xr-x 1 butler butler 770 Jan 23 16:06 butler
-rw-r--r-- 1 root root 305 Jan 23 16:06 config.h
-rw-r--r-- 1 root root 274 Jan 23 16:06 GNUmakefile
-rw-rw-r-- 1 root root 5 Feb 18 00:00 log
-rwsr-sr-x 1 root root 18457 Jan 23 16:06 sandbox
-rw-r--r-- 1 root root 3281 Jan 23 16:06 sandbox.c
drwxr-xr-x 2 root root 4096 Sep 12 19:06 script
-rw-r--r-- 1 root root 106 Jan 23 16:06 test.c
-rwxr-xr-x 1 butler butler 795864 Jan 23 16:06 tiger
-rw-r--r-- 1 root root 449 Jan 23 16:06 tiger.c
</code></pre><pre><code>root@supermicro:/home/butler# tree
.
├── butler
├── config.h
├── GNUmakefile
├── log
├── sandbox
├── sandbox.c
├── script
│ ├── fstab
│ ├── mount
│ └── umount
├── test.c
├── tiger
└── tiger.c
</code></pre><p>編輯一下 <code>.bashrc</code> 的環境,等下遠端過來操作沙盒時,需要直接當作指令執行 butler 家目錄下編譯好的執行檔</p>
<pre><code>root@supermicro:/home/butler# vim .bashrc
</code></pre><p>在 <code>.bashrc</code> 加入</p>
<pre><code>export PATH=$HOME:$PATH
</code></pre><p>更新一下剛剛的設定</p>
<pre><code>root@supermicro:/home/butler# source .bashrc
</code></pre><p>測試是否有成功,確定 <code>echo $PATH</code> 中出現 <code>/home/butler</code>。</p>
<pre><code>root@supermicro:/home/butler# su butler
butler@supermicro:~$ echo $PATH
/home/butler:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
</code></pre><h4 id="準備沙盒">準備沙盒</h4>
<ul>
<li><p>確定 server 上有 <code>cgroup</code> 功能,在某些舊 kernel 並沒有我們需要限制沙盒的功能 (目前確定部分版本的 CentOS 和 Debian 沒有支持)。確定 <code>memory.limit_in_bytes</code> 存在在清單中。(可以使用 <code>$ mount</code> 找到 <code>cgroup</code> 在哪個資料夾。)</p>
<pre><code>$ ls /sys/fs/cgroup/memory/
</code></pre></li>
<li><p>在根目錄建造沙盒 <code>/sandbox</code></p>
<pre><code>root@supermicro:/# ls -l
total 104
drwxr-xr-x 13 root root 4096 Feb 25 2015 sandbox
</code></pre></li>
<li><p>建立 sandbox 資料夾目錄,到 <code>Judge-receiver/scripts</code> 目錄下進行構造 (否則 python 安裝時的 working directory 會造成錯誤),</p>
</li>
</ul>
<pre><code>root $ cd Judge-receiver/script && ./prepare && ./mount
</code></pre><p> 在最後一行的指令 <code>./mount</code>,每一次主機重新開啟 (例如斷電重開職主機後),要重新執行這條指令,否則測試結果會是一整排 Runtimer Error。將跟目錄下的這些資料夾 mount 到 sandbox 下。結果大致如下: </p>
<pre><code>root@supermicro:/sandbox# tree -L 2
sandbox/
├── bin
├── dev
├── etc
├── lib
├── lib64
├── opt
├── proc
├── sandbox/
| ├── app
| └── ws
├── sys
├── tmp
└── usr
</code></pre><ul>
<li>確認 <code>sandbox/sandbox/app</code>、<code>sandbox/sandbox/ws</code> 的權限配置如下,uid 與 gid 皆為 butler。如果權限不對,執行 <code>$ chown butler:butler app ws</code> 解決此問題。 <pre><code>root@supermicro:/sandbox/sandbox# ls -l
total 8
drwxr-xr-x 2 butler butler 4096 Feb 18 00:00 app
drwxrwxrwx 2 butler butler 4096 Feb 13 23:41 ws
</code></pre></li>
</ul>
<h5 id="沙盒測試">沙盒測試</h5>
<p>編譯簡單的 <code>hello.c</code>,複製到 <code>/sandbox</code> 下,並且限制時間 (second 為單位)、記憶體用量 (byte 為單位),最後是執行的方式。如果上述測試沒有發生錯誤,順利印出 <code>Hello, World !</code> 表示沙盒部屬完成。否則可能是 mount 失敗、或者沒有順利建好資料夾。</p>
<pre><code>root@ubuntu:/home/butler# gcc hello.c
root@ubuntu:/home/butler# cp a.out /sandbox/sandbox/app/
root@ubuntu:/home/butler# ./sandbox 1 16777216 ../app/a.out
</code></pre><h3 id="judgenode">JudgeNode</h3>
<h4 id="安裝">安裝</h4>
<p>下載需要的套件</p>
<pre><code>$ apt-get install nodejs mysql-server
$ npm install -g gulp
$ npm install -g bower
$ git clone https://github.com/JudgeGirl/JudgeNode
$ cd JudgeNode && npm install && bower install && gulp build
</code></pre><p>複製預設的設定檔案,並將資料庫帳號密碼打在 <code>_config.yml</code> 中,最後產生 https 需要的相關文件 </p>
<pre><code>$ cp _DEFAULTconfig.yml _config.yml
$ openssl genrsa -out privatekey.pem 1024
$ openssl req -new -key privatekey.pem -out certrequest.csr
$ openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
</code></pre><p>確定 Judge 的目錄如下所示: </p>
<pre><code>root@ubuntu:/home/judgesister# tree -L 1
.
├── JudgeNode (可以放置別處)
├── Judge-sender (一定要與 source, submission, testdata 位置相當)
├── Judge-template (提供範例,可不用下載)
├── source
├── submission
└── testdata
</code></pre><p>如果不手動建立,可以參考以下的做法建立</p>
<pre><code>$ mkdir /home/judgesister/source
$ mkdir /home/judgesister/submission
$ mkdir /home/judgesister/testdata
$ cp -r /home/judgesister/Judge-template/default/source/* /home/judgesister/source/
</code></pre><p>最後,測試用的啟動模式 <code>npm start</code> / 公開用的啟動模式 <code>./start</code>。</p>
<h4 id="公開用的啟動模式">公開用的啟動模式</h4>
<p>網站可能會因為某些 Bug 而掛掉,若需要不斷地重新開啟,執行目錄下的 <code>./start</code> 可以每隔 10 秒嘗試重新啟動,如果要強制關閉,請按 <code>CTRL + C</code> 終止網站啟動。在這種模式下,Debug 工作會變得非常困難。</p>
<pre><code>$ ./start
</code></pre><p>如果 <code>CTRL + C</code> 沒有反應,按照下面步驟停止前端服務。</p>
<pre><code>$ root@ubuntu:/home/judgesister/JudgeNode# ps aux | grep start
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 5671 0.0 0.0 4448 780 pts/3 S+ Feb20 0:00 /bin/sh ./start <<<<Judge-sender
root 19296 0.0 0.0 27236 8028 pts/4 S+ 12:04 0:00 python3 ./start <<<<JudgeNode
$ kill -9 <JudgeNode-PID>
</code></pre><h2 id="加入第一道題目">加入第一道題目</h2>
<h3 id="網站管理員">網站管理員</h3>
<p>在建立第一道題目之前,新增題目描述設定需要網站管理員,借由 <code>JudgeNode/test/workspace/adduser.js</code> 增加使用者帳號。假設要建立管理員身分,直接執行 <code><class> = 0</code>。</p>
<pre><code>$ cd JudgeNode/test/workspace
$ node adduser.js nodejs judgegirl notpassword 0 judgegirl@judgegirl.org
</code></pre><p>創立好後,從前端登入後在選單中看到管理頁面,點選新增題目即可。</p>
<h3 id="分類增加">分類增加</h3>
<p>目前還沒支持前端分類管理,必須手動從 MySQL 下指令完成。假設要創立在 level 1,並且將題目放置在 domain 0,與法如下:</p>
<pre><code>$ mysql -u root -p
mysql >> use judgegirl
mysql >> INSERT INTO levels (level, ttl, lorder) VALUES (1, 'Test', 1);
mysql >> INSERT INTO level_domain (did, level) VALUES (0, 1);
</code></pre><p>接著,就可以進行上傳測試!</p>
</div>
<div class="footer l-box is-center">
Powered by Nodejs and Theme by Pure.CSS © 2016
</div>
</div>
</body>
</html>