docker 搭建 hustoj

hustoj 是个GPL开源的OJ,其提供了docker形式的安装方式。

为执行方便,选择使用aliyun提供的docker镜像来加速安装。

拉取镜像

docker pull registry.cn-shanghai.aliyuncs.com/shiningrise/hustoj

执行镜像

docker run -d -it --name hustoj -p 9900:80 --privileged registry.cn-shanghai.aliyuncs.com/shiningrise/hustoj:latest

9900 是物理机针对docker image 80端口的映射。

访问本机如下地址即可开始使用 hustoj

http://127.0.0.1:9900

下载题库

https://github.com/zhblue/freeproblemset/ 提供了免费的题库下载,如果觉得不够用,

还可以去 http://tk.hustoj.com/ 作者提供的付费网站下载更多。

使用本地磁盘volumn

docker因为每次启动都是全新,为持久化,可以挂载一个本地目录给docker image。

标准执行方式

docker run -d -it \
-v /data/docker/docker-wxy/data:/data \
--privileged \
--name hustoj \
-p 80:80 shiningrise/hustoj:latest docker测试安装 docker run -d -it --name hustoj -p 80:80 --privileged shiningrise/hustoj:latest 仅安装C++版本 docker run -d -it --name hustoj -p 80:80 --privileged shiningrise/hustoj:cpp

执行docker shell

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f111112222333 registry.cn-shanghai.aliyuncs.com/shiningrise/hustoj:latest "/usr/local/bin/dock…" About an hour ago Up About an hour 0.0.0.0:9900->80/tcp hustoj docker exec -it f111112222333 bash ## f111112222333 是当前docker 映像执行的实例id

进去之后可以通过 mysql 执行数据库操作等。

hustoj 配置其它语言

https://blog.csdn.net/yybird_/article/details/46050023

配置python

python默认即支持,但,有一些诡异的小地方。

默认执行py是使用py3

需要在开头注释写个 # python2 才行

主要judge_client会读取源码,通过如下语句判断py是何种版本:

void run_solution(int & lang, char * work_dir, int & time_lmt, int & usedtime,
int & mem_lmt) {
nice(19);
int py2=execute_cmd("/bin/grep 'python2' Main.py");
// now the user is "judger"
chdir(work_dir); .... if(!py2){
execl("/python2", "/python2", "Main.py", (char *) NULL);
}else{
execl("/python3", "/python3", "Main.py", (char *) NULL);
}

配置golang

To be done

源码阅读

hustoj 的模块拆分很清晰:

  • web // php后端逻辑 + html/css/js前端
  • core 判题逻辑模块
    • judged 判题后台服务
    • judge_client 判题工作模块
    • shim 源码相似度检查(据说是外部引入)

修改源码去除公告

为方便理解源码,也方便自己使用搭建的oj,引入一个小任务,去除晃眼的公告。

看到公告,第一反应是,先用chrome开发工具台找到飘来飘去的元素ID。它叫 <marquee>

搜下源码,看到在 contest-header.php 里面有涉及。

直接注掉 $view_marquee_msg 相关部分。

<?php
// php-comment
// $view_marquee_msg=file_get_contents($OJ_SAE?"saestor://web/msg.txt":"./admin/msg.txt");
?>
<!-- html
<div id=broadcast>
<marquee id=broadcast scrollamount=1 direction=up scrolldelay=250 onMouseOver='this.stop()' onMouseOut='this.start()';>
<?php echo $view_marquee_msg?>
</marquee>
</div>
-->

点击页面,依然没搞定。

再找,发现 template/bs3/js.php 里面才是真正生成消息元素的部分。

<?php
if(file_exists("./admin/msg.txt"))
$view_marquee_msg=file_get_contents($OJ_SAE?"saestor://web/msg.txt":"./admin/msg.txt");
if(file_exists("../admin/msg.txt"))
$view_marquee_msg=file_get_contents($OJ_SAE?"saestor://web/msg.txt":"../admin/msg.txt");
?> <script>
$(document).ready(function(){
var msg="<marquee style='margin-top:10px' id=broadcast direction='up' scrollamount=3 scrolldelay=50 onMouseOver='this.stop()'"+
" onMouseOut='this.start()' class=toprow>"+<?php echo json_encode($view_marquee_msg); ?>+"</marquee>";
$(".jumbotron").prepend(msg);
$("form").append("<div id='csrf' />");
$("#csrf").load("<?php echo $path_fix?>csrf.php");
$("body").append("<div id=footer class=center >GPLv2 licensed by <a href='https://github.com/zhblue/hustoj' >HUSTOJ</a> "+(new Date()).getFullYear()+" </div>");
$("body").append("<div class=center > <img src='http://hustoj.com/wx.jpg' width='96px'><img src='http://hustoj.com/alipay.png' width='96px'><br> 欢迎关注微信公众号onlinejudge</div>");
});
///// .... 省略
</script>

将上面的php和js都给注掉,搞定。

源码理解

php 部分为方便理解,大概可以拆分如下2个模块:

  • 用户界面
  • admin界面

为方便自定义,同时穿插了一套简单的主题模块。

即,所有的css、js等前端相关,都使用了如下几个模板来嵌套。

  • bs bootstrap2?
  • bs3 bootstrap3
  • classic 经典款
  • ie IE兼容
  • sae 新浪SAE模式

而php则通过主要的配置文件 include/db_info.inc.php 来指导工作。

docker 搭建 hustoj的更多相关文章

  1. 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器

    Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...

  2. 使用 Docker 搭建 Java Web 运行环境

    黄勇的博客 Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它.Docker 是一种“轻量级”容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公司开始逐 ...

  3. mac下通过docker搭建LEMP环境

    在mac下通过docker搭建LEMP环境境 1.安装virtualbox.由于docker是在lxc环境的容器 2.安装boot2docker,用于与docker客户端通讯 > brew up ...

  4. 转:使用 Docker 搭建 Java Web 运行环境

    原文来自于:http://www.codeceo.com/article/docker-java-web-runtime.html Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都 ...

  5. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  6. docker搭建zabbix

    本次使用docker搭建zabbix的组合是mysql+docker+zabix-server 1 先安装数据库mysql docker run --name zabbix-mysql-server ...

  7. Docker 搭建 etcd 集群

    阅读目录: 主机安装 集群搭建 API 操作 API 说明和 etcdctl 命令说明 etcd 是 CoreOS 团队发起的一个开源项目(Go 语言,其实很多这类项目都是 Go 语言实现的,只能说很 ...

  8. Centos7安装ES 和 Docker搭建ES

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.linux centos7.x安装ES 1.下载java sudo yum instal ...

  9. Docker最全教程之使用Docker搭建Java开发环境(十七)

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...

随机推荐

  1. header头参数 确定该文件类型

    'chm'=>'application/octet-stream', 'ppt'=>'application/vnd.ms-powerpoint', 'xls'=>'applicat ...

  2. autofac使用总结

    转摘自:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 注册部分: AutoFac是.net平台下的IOC容器产品,它可以管理 ...

  3. 安利一个十分实用的IDEA插件--RestfulToolkit

    官网链接:http://plugins.jetbrains.com/plugin/10292-restfultoolkit,英汉双语的帮助文档. 一套 RESTful 服务开发辅助工具集. 1.根据 ...

  4. JavaScript新手入门 贪吃蛇

    从小就在玩贪吃蛇,但是知道今天自己做了一遍才知道原理的具体的实现步骤. 刚进入界面时显示开始游戏(不重要,本人比较喜欢吹毛求疵) 中间黑色部分为游戏的主要展示部分 主要步骤及源码: body中代码,红 ...

  5. linux 在后台常驻运行php脚本

    php a.php &

  6. 【转载】 spring事物配置,声明式事务管理和基于@Transactional注解的使用

    https://blog.csdn.net/bao19901210/article/details/41724355

  7. vue2.0 微信分享

    需求:首页,列表页,详情页的分享,活动页分享并进行相关操作,比如分享一次活动次数加1 首先:阅读微信开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_ ...

  8. Appium环境搭建——安卓模拟器(AVD)调试 1-创建模拟器失败点的总结

    一.先安装好Android SDK 系统变量—>新建,变量名:ANDROID_HOME,变量值:SDK的安装路径 系统变量—>path—>点击编辑,变量值添加:;%ANDROID_H ...

  9. EBS WEBADI导入日记账 客户化账户组合规则校验

    近期项目需求对EBS中WEBADI导入日记账时,在加载数据时需要对账户组合额外进行客户化的校验,需要能够做到将校验结果体现在WEBADI模板的数据上,并且对每条错误数据都单独报错. 项目上的方案是调整 ...

  10. 记NOIP2018

    day0 中午在机房水了一波出发,坐了一下午的车,5点到了大门对面的红旗宾馆.南山中学的和我们住在一个宾馆里面,Z教练似乎同他们关系很好,见面还打招呼. 红旗宾馆附近特别偏僻,出门就是修路的工地,后面 ...