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. django如何查看mysql已有数据库中已有表格

    首先正常创建django项目,配虚拟环境,改配置文件,正常创建models,创建迁移和启动迁移等 接着通过找到Terminal窗户,双击,打开窗口 输入命令 python manage.py in i ...

  2. element 时间选择器——年

    <el-date-picker v-model="fileYear" type="year" placeholder="选择年"> ...

  3. java-IO流-其他流

    ###22.01_IO流(序列流)(了解) * 1.什么是序列流     * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, ...

  4. Javascrip基础

    术语解释 Javascript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速 ...

  5. 2018-2019-2 20165313 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容. (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...

  6. bugku 密码学一些题的wp

    ---恢复内容开始--- 1.滴答滴 摩斯密码,http://tool.bugku.com/mosi/ 2.聪明的小羊 从提示猜是栅栏密码,http://tool.bugku.com/jiemi/ 3 ...

  7. 引擎设计跟踪(九.14.3.2) Deferred shading的后续实现和优化

    最近完成了deferred shading和spot light的支持, 并作了一部分优化. 之前forward shading也只支持方向光, 现在也支持了点光源和探照光. 对于forward sh ...

  8. 像使用数据库一样使用xml

    目录 xml简介 语言结构 tinyxml 下载tinyxml 应用实例 tinyxml的封装 封装源码 实际应用 xml简介 XML 没什么特别的.它仅仅是纯文本而已.有能力处理纯文本的软件都可以处 ...

  9. docker安装centos后没有ifconfig命令解决办法

    使用docker pull centos命令下载下来的centos镜像是centos7的最小安装包,里面并没有携带ifconfig命令,导致我想查看容器内的ip时不知道该怎么办 yum provide ...

  10. Vue01

    1.vue.js库的下载 vue.js是目前前端web开发最流行的工具库,由尤雨溪在2014年2月发布的. 另外几个常见的工具库:react.js /angular.js 官方网站: 中文:https ...