Rexdf

The devil is in the Details.

小玩Acdream_OJ

| Comments

午后心情比较蛋疼,然后花了大约2小时测试了下Acdream这个OJ。

由于其前端与后端都是开源的,因此可以非常容易的搭建。

其后端是 https://github.com/ttlast/Judge.git,前端是 https://github.com/KIDx/ACdream.git .

均是在Ubuntu平台以nodejs为目标语言编写。

由于我的Ubuntu安装在物理机,而我惯于启动到Win平台, 懒于重启机器,故使用最近才喜欢上的Arch来搭建。

0.备忘

家里几台机器ssh配置

scp .ssh/id_rsa.pub localhost@rexdf:~/
ssh localhost:12345
cat id_rsa.pub >>authorized_keys
vim /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
UsePAM no
RSAAuthentication yes
PubkeyAuthentication yes

1.安装依赖

像什么imagemagick,g++,python2,python3,make这些基础的开发环境就不说了,基本上我是在Arch第一次开机以前就会安装的。

nodejs安装,因为前些天要玩grunt,所以也安装过了。

首先是Acdream,放在prog/Acdream

针对这个项目前端比较重要的

sudo pacman -S mongodb redis 
sudo systemctl start mongodb
redis
sudo npm install -g canvas
sudo npm install -g socket.io
cd ~/prog/Acdream
npm i #这里只能使用普通权限,因为Arch用sudo是真的以root用于运行,不像Ubuntu只是依然是当前用户。这一步相当的漫长,需要无错误退出。如果出错,rm -rf node_modules,然后再次执行。

然后就是Judge,放在prog/Judge下面

第一个比较麻烦的问题是Arch64源已经使用python3为默认的python,而python2叫做python2.这个问题在我这里不存在,因为我需要运行gae_dev,已经加了一个~/bin目录在PATH最前面。 同时需要修改deamon.py第一行为 #!/usr/bin/env python

然而Python的pip却是分python3和python2的。

sudo pacman -S python2-pip
sudo pip2 install pymongo

修改~/prog/Judge/judge/test.cpp

//设置运行根目录、运行用户
//获得运行用户的信息
struct passwd *judge = getpwnam("ttlast");

的ttlast改成rexdf;

修改~/prog/Judge/judge/okcall.h

因为我是Arch64,所以修改136行#else之后的部分 在C和Cpp里面各添加一行

89,1,

然后执行

g++ ~/prog/Judge/judge/test.cpp -O ~/prog/Judge/judge/Judge

修改deamon.py,第一行

#!/usr/bin/env python

124行dadir = "./data"改成dadir = ../../Acdream/data 145行同理,不过似乎可以不改。

244行,把'/home/ttlast/OJ/dtest/daemon.pid'改成我的git-clone目录里面的pid文件绝对路径'/home/rexdf/prog/Judge/dtest/daemon.pid'

202行,把db = con.gzhu_db改成db = con.acdream_db

2.启动系统

启动mongdb,并初始化表,开一个cygwin的teminal

sudo systemctl start mongodb
cd ~/prog/Acdream
mongorestore -h localhost -d acdream_db --directoryperdb acdream_db -drop

启动redis,直接开了一个terminal启动

sudo systemctl start redis

启动前端,新开一个teminal

cd ~/prog/Acdream
node app.js

启动判题系统,新开一个terminal

cd ~/prog/Judge
~/prog/Judge/daestart.sh
sudo ~/prog/Judge/daemon.py restart

接下去做一个端口映射,我是把3000映射到了主机的10013,结果如图。

另外说一下坑爹的admin密码,我试了下admim和123456似乎都是不对,然后KiDx项目主页似乎也没有明文说明,无奈只能强行进入db看看了。

mongo
>show dbs;
>use acdream_db;
>show collections;
>db.acdream_db.users.find();

然后上网搜索这个MD5值,直接指导密码是root。

另外我注意到了test.cpp里面使用的spoj.exe,显然是需要重新编译的,不过我没有兴趣继续玩这个。

总体感觉不错,似乎nodej嘛,mongo嘛,redis嘛,都是较为前沿的技术。应该说效率是会比传统LAMP,LNMP高出许多的。

Comments