博客

  • HUSTOJ常见问答

     

    向AI提问


    问问 小张老师

    安装视频

    (https://www.bilibili.com/video/BV1Mp4y1C7Xx)

    如何安装?

    阿里云腾讯云镜像选Ubuntu22.04LTS,物理机安装Ubuntu22.04 Server。

    开命令行、终端,复制粘贴下面的脚本

    wget http://dl.hustoj.com/install.sh 
    sudo bash install.sh

    阿里云、腾讯云、华为云安装后为何不能访问?

    请开放80端口

    请检查安全策略等设置,开放80端口的访问。

    如何快速上手(了解系统的功能)?

    用例图

    注册admin用户成为管理员,点击右上角管理,仔细阅读管理首页的说明。

    在tk.hustoj.com注册账号,从免费专区挑选一些题目导入使用。

    切记:题目导入后一次只能删一题不要导入过多你暂时用不上的题目,正确的方式是每次训练、作业,导入所需的5-10个题目,比赛作业结束后让题目成为训练题库的一部分。这样能保证题库中题号靠前的题目难度依次上升,适合后来的同学自行训练。不要贪图题目数量而忽视其质量,等到后悔了,再到群里来问怎么批量删除。教练自己看不懂解法的题目,少用、慎用。

    阅读两个配置文件,逐个研究选项的注释和含义。
    所有与判题相关的选项都在这里
    /home/judge/etc/judge.conf

    所有与Web页有关的选项都在这里

    /home/judge/src/web/include/db_info.inc.php

    若要进行二次开发,首先应该了解数据库结构:

    /home/judge/src/install/db.sql

    如果想要开发全新的Web前端,增加新的业务逻辑如:积分、天梯,除了数据库,还需要了解judge_client写库的时机或者MySQL触发器的编写:

    /home/judge/src/core/judge_client/judge_client.cc 
    中函数_update_solution_mysql

    /home/judge/src/install/moodle.sql 触发器的参考例程

    参考二次开发基础教程

    系统中“用户”“比赛”均只有编辑、禁用功能,没有删除功能,这是为了从根源上防止出现“教学事故”,请不要要求增加相关功能,如果认为自己绝不会误操作,请自行开发相关功能。

    如何修改默认字体大小

    修改 /home/judge/src/web/template/syzoj/css/white.css末尾 设置页面内容字体大小font-size。

    修改/home/judge/src/web/template/syzoj/submitpage.php 432行 设置代码输入框的字体大小font-size。

    如何使用一本通编程启蒙的远程判题功能?

    1. 更新到最新版。可用fixing.sh升级。

      (二开系统需要更新:
      src/core/judged/judged.cc
      src/web/include/db_info.inc.php
      src/web/include/init.php
      src/web/include/curl.php
      src/web/include/remote_bas.php
      src/web/remote.php
      src/web/status.php
      src/web/submit.php
      src/web/admin/problem_import_xml.php 以及数据库结构更新update.sql中关于problem 、solution的部分 )
    2. 编辑remote.php编辑数组,设置模块名和URL,注意看注释。
    3. 编辑include/remote_bas.php配置远程账号密码。
    4. 编辑include/db_info.inc.php,设置$OJ_REMOTE_JUDGE=true; 用fixing.sh升级这个选项没有,可以自己加上。
    5. 导入申请账号时提供的题库xml文件
    6. 尝试提交,刷新状态页,等待判题结果。
    7. 如果判题结果正常,则配置完成。
    8. 注意每个机构账号是登记专属的,请勿外借。

    如何使用hdu、pku的远程判题功能?

    1. 更新到最新版。可用fixing.sh升级。

      (二开系统需要更新:
      src/core/judged/judged.cc
      src/web/include/db_info.inc.php
      src/web/include/init.php
      src/web/include/curl.php
      src/web/include/remote_bas.php
      src/web/remote.php
      src/web/status.php
      src/web/submit.php
      src/web/admin/problem_import_xml.php 以及数据库结构更新update.sql中关于problem 、solution的部分 )
    2. 编辑remote.php编辑数组,设置模块名和URL,注意看注释。
    3. 编辑include/remote_hdu(pku).php配置远程账号密码。
    4. 编辑include/db_info.inc.php,设置$OJ_REMOTE_JUDGE=true; 用fixing.sh升级这个选项没有,可以自己加上。
    5. 自行复制需要的题面,添加题目,填写remote_oj和remote_id,或用隐藏功能抓取题面。
    6. 尝试提交,刷新状态页,等待判题结果。
    7. 如果判题结果正常,则配置完成。
    8. 注意每个机构账号是登记专属的,请勿外借。

    我已经安装了apache/mysql/宝塔,而且有其他系统部署,不能重装,如何安装hustoj?

    可以参考宝塔环境的安装说明脚本,分别单独安装数据库、Web和判题,用配置文件将它们关联起来使用。

    注意关闭宝塔的php报错

    如何管理班级?

    本系统没有设计班级的功能,而是围绕比赛进行管理。现在有班级功能了,参考这里

    比赛的类型选为私有以后,只有在名单中的账号或知道比赛密码的账号可以参与。

    比赛名单可以方便从Excel或者其他系统中复制粘贴学号过来,并要求学生用学号注册或者在系统中用导入的方式指定学生的账号为学号。

    比赛的名称中可以写明班级信息。

    下一次,同一个班级的作业/比赛,可以用复制(Copy)功能复制已有的比赛,名单会自动继承。只需修改标题、比赛题目、比赛时间,就可以完成下一次比赛的安排。

    如果有平行班,可以从已经定制的比赛中复制名单到剪贴板,然后复制(Copy)已经选好题目的比赛,Ctrl+A全选,Ctrl+V将名单替换掉。

    一场比赛最多多少题目?

    系统的solution表num字段类型tinyint,上限是127,即最多0-127,共128题,更多题目会提交失败。

    但是,通常建议不超过26个,即A-Z,否则可能拖慢数据库,影响系统整体性能。

     

    如何使用Markdown编写题目?

    首先,编辑文件/home/judge/src/web/include/db_info.inc.php ,设置
    static $OJ_MARKDOWN=”marked.js” ; // MARKDOWN可选两种解析器marked.js和markdown-it,设为false则关闭支持。

    然后,在题目编辑器中使用源码模式
    用[md] # Markdown [/md] 格式插入markdown代码, 如果需要用到[]也可以用span+class标记:

    <span class="md" > </span>

     

    如何修改标题?背景?

    编辑/home/judge/src/web/include/db_info.inc.php

    修改$OJ_NAME和$OJ_BG

    如果没有权限,请用sudo命令:

    sudo nano /home/judge/src/web/include/db_info.inc.php

    我有一个虚拟主机,能不能只装web部分,用远程OJ来判题?

    可以。

    • 下载最新源码并解压
    • 利用install目录中的db.sql在你的虚拟主机管理面板里建立数据库
    • 为数据库分配用户和密码
    • 向privilege表增加一条记录,user_id是你准备注册的管理用户名,rightstr是administrator。
    • 将web目录下的文件上传到你的虚拟主机的htdocs或www目录中
    • 修改include/db_info.inc.php的名字为db_info.inc.sample.php
    • 用浏览器访问根目录的install.php,填写安装参数
    • 提交表单,访问主页。
    • 注册之前选定的管理员账号。

    如何修改nginx默认的80端口为其他端口?

    编辑/etc/nginx/sites-enabled/default

    将其中的listen 80的80修改为你所需要的端口。

    service nginx configtest 测试你的修改,若显示OK表示修改可用,若显示fail,检查是否漏了分号,用了中文字符。

    service nginx reload 重新加载配置生效。如果是云服务器,记得去云后台开放所需端口。

    如何开启SSL认证?如何增加证书?

    /etc/nginx/下面建目录cert放证书

    修改/etc/nginx/sites-enabled/default来引用证书

    其中的ssl-key.pem和ssl-key.key来自你的证书供应商,或自行生成

    若要保留非SSL的普通80,请先整体复制原始server段,然后修改复制的部分为ssl,原始server段保留。

    service nginx configtest 测试你的修改,若显示OK表示修改可用,若显示fail,检查是否漏了分号,用了中文字符。

    service nginx reload 重新加载配置生效。

    如果是云服务器,记得去云后台开放443端口。

    如何开启论坛功能?

    db_info.inc.php中设置$OJ_BBS=”discuss3″;开启内置论坛,或另行安装discuz或phpBB3。国内公网服务器,开启前请慎重考虑是否符合备案要求。

    如何设置备案号?

    修改db_info.inc.php中的 $OJ_BEIAN 如:

    static $OJ_BEIAN=”沪ICP备12345678号-1″;

    如何使用mdui模板?

    mdui模板默认引用了国际互联网上的cdn服务,在局域网中无法正常显示。

    需要给db_info.inc.php增加一行:

    static $MDUI_OFFLINE=true;

    如何设置默认显示中文界面?

    修改db_info.inc.php中的$OJ_LANG=”cn”;

    如何添加选择填空题?

    添加题目时,裁判类型选择“文本裁判”

    文本裁判

    输入文件内容为题目数量n

    输出文件为n行 【题号】空格【分数】空格【正确答案】

    总分之和必须为100分,才能在提交中显示为正确,否则只显示得分同值的通过率。

    如果正确答案是【*】,表示任何答案都得分。

    选增模板template.c,供学生填写

    template.c是c语言模板,template.cc是c++模板

    学生提交界面如图右侧

    在最新版本中,支持用下面的形式,自动生成可以点击的选项框:

    效果见 P3262 – 2023.3 GESP C++二级试卷 选择题 – demo (hustoj.com)

     

    如果需要添加填空题,希望填空内容能自动更新到答案中,可以按下面的规则编辑HTML源码:

    <input type=text name=题号 >

     

    我想拿hustoj来判题,开发我自己的OJ或者考试系统,如何跟判题对接?

    先插solution表获得solution_id,再插source_code表给源码

    第一遍插的时候result设14,插完源码回来改成0

    https://github.com/zhblue/hustoj/blob/master/trunk/web/submit.php#L320

    稍微严谨一点,防止你源码没插好就判题了。

    插好源码,用UDP往1536端口发一个字符串,触发judged进行判题。

    https://github.com/zhblue/hustoj/blob/master/trunk/core/judged/judged.cc#L782

    完了等2秒查结果,结果result小于4就是没判完,再等2秒看。

    https://github.com/zhblue/hustoj/blob/master/trunk/web/submit.php#L284

    当result大于4,查常量数组得知结果,在compileinfo有编译器报错,在runtimeinfo有运行时报错,或者输出的对比结果。

    result的含义查https://github.com/zhblue/hustoj/blob/master/trunk/web/include/const.inc.php#L7

    *如果不希望产生数据库耦合,可以研究一下web目录下的admin/problem_judge.php,这是一个基于HTTP的通信接口(不是WebService,也不是基于xml或者json,请跳出java/node/python开发的固有思维),如果你能够用你的web端实现完全兼容的一个模拟接口,就可以通过配置judge.conf让判题机以HTTP的方式主动连上去完成判题的功能。在这种架构下,你可以用你的web程序隔绝判题程序和数据的直接耦合,形成一个兼容层。但相应的开发工作量会增加,技术难度也稍有增加。

    我有非常多的提交需要判,如何最大化判题机的工作效率?

    更新判题机到最新版本。

    安装podman,生成镜像

    cd /home/judge/src/install
    sudo bash podman.sh

     

    设置judge.conf,改变判题机的进程管理工作模型。

    OJ_TURBO_MODE=1
    OJ_DEDICATED=1
    OJ_DOCKER_PATH=/usr/bin/podman

     

    为每种语言设置独立的判题机,用judge.conf中的OJ_LANG_SET进行控制,语言的编号是对应名称在const.inc.php数组 language_name 中的下标。

    临时增设更多的判题机(生产环境中实测过50台以上的云主机)。

    尽量提高mysql服务器的性能,避免其成为瓶颈。

    在网络中心部署的服务器,为什么在校园网里无法访问?

    如果您的服务器在校园网中的网段是172.x.x.x,那么有可能是因为docker默认使用了相同的网段。参考这一篇博文

    解决方法是:

    1)vim /etc/docker/daemon.json(这里没有这个文件的话,自行创建)

    {
        "bip":"192.168.0.1/24"
    }

    2)重启docker 

    systemctl restart docker

    为什么status.php状态页不能搜索到全部的提交?

    为了防止管理员和老师在测试题目的时候被学生观察到未来比赛考试用题的编号,系统对普通用户的搜索功能进行了限制。如果想打破这种限制,请自行修改status.php,内有注释说明如何修改。

    经常出现502 Bad Gateway,如何处理?

    考虑增加php-fpm的进程数量。

    sed -i 's/pm.max_children = 5/pm.max_children = 64/g' $(find /etc/php -name www.conf)

    我已经安装了Jdk为何Java还是编译错误?

    新安装的系统需要重启才能判java,jdk是安装在docker容器中的,外部安装jdk不会起作用。如果要修改jdk的版本,需要以root身份到/home/judge/src/install目录下修改Dockfile文件(内有注释),然后运行bash docker.sh。

    有没有Python题库?

    没有针对python的题库,题目都是不针对语言的,相同的题面,你用C也好用C++也好,用Java也行。如果你说你有题目只能C/C++做,用python做不出来了,那多半是你python学艺不精,更应该努力把这个题用python解出来!

    (手动狗头)

    题目可以去tk.hustoj.com看看,免费专区有超过1000道题目。

    如果需要题目,可以访问:
    tk.hustoj.com 注册即可下载免费专区的1000多道题目,使用购物车可以批量下载,下载到的xml文件可以直接导入系统。
    FPS sample FPS主站样例有部分题目可用。
    EasyFPSViewer 是一个Windows下的FPS/xml编辑查看工具可以查看、分割、提取xml中的题目。

    如何指定输入输出文件?

    测试数据目录准备两个文本文件input.name output.name,其内容为题面指定的输入输出文件名,当他们存在时,判题系统会用他们指定的文件名来取代默认的标准输入输出。选手就可以用input.name里面写的文件名来输入数据,用output.name里面写的文件名作为输出目标。

    如何开启在线测试运行a.k.a Web IDE ?

    db_info.inc.php

    $OJ_TEST_RUN=true;

    如何快速构造测试数据?

    1、在上传测试数据界面有“随机测试数据生成器”可以用元语言方式生成随机输入。构造系列.in结尾的文件。如:test01.in test02.in

    2、自己编写一个标注答案,接受符合格式的输入,产生正确输出。放在测试数据目录中,命名为Main.cc

    3、新版本有一个【用标程覆盖生成Out文件】的按钮,点一下就能自动完成后续步骤。

    如果这个按钮不起作用,可能是相关脚本缺失执行权限,通过下面的方式修复

    sudo su
    cd /home/judge/src/install
    chmod +x *.sh

    4、 如果是老版本,没有自动生成按钮,需要登陆服务器ssh, 将这个程序编译为可执行文件Main,如g++ -o Main Main.cc

    5、在测试数据目录下执行 /home/judge/src/install/makeout.sh Main

    6、上述脚本将根据test01.in test02.in自动生成test01.out test02.out

    如何手工添加题目?

    注册好admin用户后,右上角有管理入口。

    管理界面有说明,问题管理中添加问题。

    添加时只能提供一组样例+一组测试数据,但保存后可以在列表最右侧找到测试数据管理入口,允许上传、生成、解压更多测试数据。

    如何修改常见问答内容?

    1、修改template/皮肤名/faqs.php

    2、添加一个新闻,标题命名为faqs.cn则可以替换系统中的中文FAQ,其他语言雷同。

    如何修改页面上的XXXX?

    find /home/judge/src/ -name “*.php” |xargs grep ‘你想改的内容’

    就能找到你应该修改的文件,如果数量过多请调整搜索的关键词,缩小范围。

    如何增加更多的答题语言?

    显示部分先看/home/judge/src/web/include/db_info.inc.php,需要修改 $OJ_LANG_MASK 的值,需要用到的计算工具在该行的注释中提供了一个链接。

    判题部分首先看/home/judge/src/install/Dockerfile里的注释 。

    释放对应语言的行,之后运行sudo bash docker.sh

    修改judge.conf中的OJ_LANG_SET,其中的数字对应语言的关系


    /home/judge/src/ web/include/const.inc.php,其中的language_name数组列出了所有系统可以扩充的语言,数组元素的下标就是需要增加到OJ_LANG_SET的数字。

    保存后重启judged进程,sudo pkill -9 judged && sudo judged

    我是小白,从来没接触过OJ,这东西什么意思啊?

    查看此题题面http://my.hustoj.com/problem.php?id=1001

    看视频自学Linux 【2.Linux基础 (2)】 【精准空降到 05:29】 https://www.bilibili.com/video/BV1XP4y1n7Rt/?share_source=copy_web&vd_source=be2bc1b2adaefbeb3c67ece1dd0568f5&t=329

     

    备份

    这里描述的备份迁移均不含宝塔系统,宝塔系统请使用其自带的工具分别备份数据库、测试数据目录/home/judge/data、上传图片目录/home/judge/src/web/upload。最后做一次权限重置: sudo chown www:judge -R /home/judge/

    脚本安装的用户,可以使用 install 目录中的 bak.sh进行备份。注意,如果备份的目的是面向最新版本的迁移,最好先从dl.hustoj.com下载最新版本的bak.sh来替换使用。

    sudo bash /home/judge/src/install/bak.sh
    

    备份后的数据在 /var/backups/ 目录下, 命名格式为 hustoj_%Y%m%d.tar.bz2。

    可以安装开源的FileZilla来下载这个备份文件到本地,登录时使用sftp协议,端口22,账户与您的ssh账号相同。

    百度学习crontab的用法后,可以使用 sudo crontab -e 定制自动备份计划,部分安装脚本中包含了自动备份,但可能需要运行上面的语句一次来激活。

    迁移

    首先在新服务器上做全新安装和测试,没有问题后,再迁移数据。

    将你需要迁移的归档复制到目标系统的/home/judge/src/install目录下,执行下面的脚本进行恢复( 脚本的第一个参数为恢复的目标归档,20221026 指你实际复制过来的文件名中的日期数字)。

    cd /home/judge/src/install 
    sudo bash restore.sh hustoj_20221026.tar.bz2

     

    *如果是backup+.sh备份的.tar.gz文件,用restore+.sh还原。 +%Y-%m-%d-%H-%M-%S 指备份文件名中的日期时分秒。

    cd /home/judge/backup sudo bash /home/judge/src/install/restore+.sh +%Y-%m-%d-%H-%M-%S.tar.gz
    
    注意宝塔环境不支持这个方式。

    提高并发还有哪些可以调节的地方?

    /etc/nginx/nginx.conf中

    worker_connections 5000;

    multi_accept on;

    /etc/security/limits.conf 增加

    * soft nofile 65536
    * hard nofile 65536

    /etc/sysctl.conf 设置:(sysctl -p 生效)

    net.ipv4.tcp_syncookies=0
    net.ipv4.tcp_max_syn_backlog=65535

    /etc/php/7.4/fpm/pool.d/www.conf 修改php最大进程数

    pm.max_children = 5000


    apt-get install memcached php-memcache php-memcached

    修改/etc/php/7.4/fpm/php.ini 修改session存储方式

    session.save_handler = memcached
    session.save_path = “localhost:11211”

    修改/home/judge/src/web/include/db_info.inc.php,让memcached也缓存页面和数据库查询

    static $OJ_MEMCACHE=true; //使用内存缓存

    如何安装使用Moodle

    https://zhuanlan.zhihu.com/p/103899072

    如何查看当前版本信息

    sudo svn info /home/judge/src

    如何更新升级

    运行命令:
    
    sudo su
    cd /home/judge/src/install/
    bash fixing.sh
    

    升级脚本执行后,可能需要登陆web端管理后台,执行一次更新数据库。

    如果后台的更新不能执行成功,可以在命令行更新库结构。即执行update.sql

    $ sudo su

    # cd /home/judge/src/install

    # bash mysql.sh

    mysql>source update.sql

    • hustoj开源版的所有历史版本,只要没有对数据库结构进行改动,都可以无损升级到最新版本,包括10年以上历史的早期版本。
    • 如果老系统更新有疑问,随时加官方群咨询群主。
    • 由于网络环境的问题、github服务器的问题等情况,可能无法升级或半途失败,可以用下面的方法修复并更新。

    修复

    自己不小心改坏了 web 代码,可以使用 install 目录中的 fixing.sh 进行系统修复。修复过程自动下载最新版本更新,可能会影响db_info.inc.php中的设置,注意做好备份。

    sudo bash /home/judge/src/install/fixing.sh
    
    修复后,原始文件移动到 old.日期 目录下,如有二开和其他系统,可以手工处理。

    管理员如何查看其它用户代码?

    右上角进入管理后台,用户管理,用户-权限-添加

    给自己加权限sourse_browser权限

    然后,查看前台,注销,重新登录。在状态页,点击提交记录中的语言名称查看源代码。

    如何限制未登录用户访问?

    db_info.inc.php里面有

    $OJ_NEED_LOGIN 和 $OJ_REGISTER

    static $OJ_REGISTER=true; //允许注册新用户
    static $OJ_REG_NEED_CONFIRM=false; //新注册用户需要审核
    static $OJ_NEED_LOGIN=false; //需要登录才能访问

    不小心删除了admin的权限,如何修复?

    sudo su
    cd /home/judge/src/install
    echo "insert into jol.privilege values('admin','administrator','true','N');" | ./mysql.sh

     

    比赛作业里面的时间是什么含义,OI排名跟普通排名有何区别?

    时间是指参与人员做出对应题目“花费”的时间:

    即:做出题目的时刻 – 比赛开始的时刻 + 惩罚时间

    惩罚时间 = 做对之前错误的提交数 * 20分钟。

    普通排名按做对的题目数和“花费”的时间进行排名。

    OI排名,按得分排名,在开启judge.conf中的OJ_OI_MODE=1后,题目可以按通过的比例进行记分,每题100分。如果希望数据的分值不平均分配,可以使用[权重]作为文件名结尾。如 test01[60].in / test01[60].out 可占60的分数权重,而 test02[20].in/test02[20].out可占20的权重,如果没有其他测试数据,通过后者可以得本题100分中的25分。没有标明权重的数据,默认权重为10。

    人多的时候,随机出现"No input file specified"

    编辑/etc/php/7.4/fpm/pool.d/www.conf 修改设定 rlimit_files = 1024 为一个更大的值,如65535。修改后重启php-fpm进程(sudo service php7.4-fpm restart)生效。这里的php版本是7.4,每个服务器的具体版本号需要自行替换。

    明明已经过了10秒,为什么系统还是说我提交过于频繁?

    • sudo apt-get install tzdata 时区选择北京或上海
    • 修改db_info.inc.php

    - 老版本打开末尾关于时区的两行代码
    - 新版本把OJ_FRIENDLY_LEVEL调到1
    

    判题核心的原理是怎样的?

    • 参考一下wiki
    • 阅读一下judge_client.cc中的注释。
    •  

    判题如何触发的?

    在老版本里,判题是通过数据库轮询触发。当judged发现有result小于2的提交,就会fork出judge_client进程进行评测。

    新版本里,judged通过UDP监听1536端口,Web端有新的提交或者重判任务时,将发送消息给judged,judged接受到消息,主动去数据库领取任务,fork出docker中的judge_client进行判题。

    在SaaS模式中,judge_hub取代judged监听UDP端口,Web发送的消息包含SaaS目录下的子目录名,judge_hub根据SaaS根目录和消息,拼接出judged的主目录,并fork出judged进程去完成判题。judged完成所有数据库任务队列后,主动退出,等待下一次被judge_hub触发。

    参考:JudgeHub

    如何让学生账号在比赛中也能看到和练习一样的详细错误信息?

    • 编辑db_info.inc.php,设置 $OJ_SHOW_DIFF=true;
    • 打开文件reinfo.php 在27行和60行有两处详细注释,根据注释进行调整。

    如何获得管理员权限?

    • 操作系统Ubuntu的管理员权限是通过在安装过程中产生的账号运行sudo su切换到root。
    • OJ的管理员是安装完成后,第一个注册的用户用admin作为用户名注册,自动获得管理权限。
    • LiveCD的judge用户不能登陆,用户名ubuntu的密码是freeproblemset。

    权限表里的记录都是什么含义?

    以下权限是手动指派:

    • “administrator” 管理员,除查看源码外的所有权限。
    • “problem_editor”:题目编辑者,添加和编辑题目。
    • “source_browser”:查看审核所有提交的源代码,对比可疑的相似代码。
    • “contest_creator”:组织创建比赛,编辑比赛。
    • “http_judge”:HTTP远程判题账号。
    • “password_setter”:重置普通账户密码。
    • “printer”:现场赛打印员,注意该账户的school字段用于分配打印任务,如果只有一个打印区则置空。
    • “balloon”:气球配送员,注意该账户的school字段用于分配气球任务,如果只有一个气球配送区则置空。
    • “vip”:可以参与所有标题含有VIP字样的私有比赛。
    • “problem_start”:HTTP远程判题账户的任务起始题号。
    • “problem_end”:HTTP远程判题账户的任务结束题号。

    新赋予的权限需要重新登陆获得!

    以下权限是系统自动生成:

    • p+数字:题目的独立编辑权,管理员可以编辑所有题目,problem_editor只能编辑自己添加的题目。
    • m+数字: 比赛的独立编辑权,管理员可以编辑所有比赛,contest_creator只能编辑自己添加的比赛。
    • c+数字:比赛的参与权,私有比赛只有有权限或者知道密码的用户可以参与。

    如何使用题单功能?

    在新闻内容中编写,格式为:

    [plist=题号列表]题单名[/plist]
    

    也可以在题目列表里,勾选题目后,点击NewProblemList按钮(仅限bs3/syzoj模板使用)。在db_info.inc.php中有选项 $OJ_MENU_NEWS ,设置为true后可以通过勾选新闻的“是否展示到菜单”,在顶层导航中显示该条目。

    是否显示到菜

    默认系统自动按通过数逆序排列,把简单题排前面。如果希望安装给定顺序显示,修改problemset.php,83行,有注释。

    按注释修改可以调整题单显示顺序

    脚本把OJ装在哪里了?可以卸载么?

    • 脚本安装默认位置在/home/judge,其中src是全部源码,data是测试数据,etc目录是判题端的配置文件,install目录是各种工具脚本。
    • src/web/upload目录存放着所有上传的图片,包括新闻与题目的图片。
    • Ubuntu中默认的数据库文件放置在/var/lib/mysql,但是不建议直接备份库文件,而是推荐用install目录中的bak.sh进行备份。
    • 如果想卸载,可以参考src/install/uninstall.sh,注意卸载脚本不考虑服务器上可能存在的其他Web系统,请谨慎使用。
    • 对于正在运行中的生产服务器,任何操作前请做好离线备份。
    • 备份文件一定要解压查看内部是否包含全部数据,关注备份的大小(大系统备份应该有上百兆),有条件找虚拟机实测还原是否成功

    为什么hustoj很多数据点很容易超时,但用柠檬和其他oj不会 ?

    可能的原因1:因为hustoj默认用ptrace审查所有的系统调用,当用cin/cout时会产生数倍于scanf/printf的系统调用,数据点多的时候容易导致超时。简单说就是系统要求更严格一些。

    可能的原因2:默认计时按全部数据累加计时,可以试试修改judge.conf,具体参考下面的几条。

    可能的原因3:你的虚拟机CPU查到的MIPS值不准确,导致安装生成的CPU_COMPENSITION值过大,修改一下judge.conf按比例缩小这个值就可以直接改变判题计时的结果。

    最后,建议对于同一个问题,在不同系统里设置不同的时间限定,只要匹配系统就可以了。

    题目的限时和内存限制的精度是怎样的?

    • 题目限时允许设定的字面精度是0.001s,但是由于操作系统内核参数的限定,实测的精度通常为4ms。
    • judge.conf中有个OJ_CPU_COMPENSATION来标注当前系统的CPU速度,安装脚本自动根据BogoMIPS的值来设定。
    • 当BogoMIPS的值为5000时,这个值为1.000,当CPU的速度更快时,这个值为大于1.000的值。
    • 最终系统记录的时间,将按照这个系数进行调整,对于对时间精度要求较高的场合,如正式比赛,或者判题机配置不均衡的情况,可以通过手工调节该参数,让不同的判题机对于相同题目的运行结果趋于一致。

    内存限制的精度是1MB,对于本地native的编译型语言c/c++/pascal/freebasic/clang等是考察程序本身的内存申请空间; 对于虚拟机和脚本语言,则包含了虚拟机本身或解释器本身的内存消耗。

    测试文件的大小、数量有什么限制?

    一般情况下,单个测试文件大小建议不超过20M,测试文件总量15组以内(.in + .out)。

    怎么评测每个评测点,不是一个超时后面的全超时?

    • 源码中对测试文件大小有个上限 STD_F_LIM = 32M 定义 生效
    • /home/judge/etc/judge.conf 中有下面的若干配置可以影响系统设定。
    • OJ_OI_MODE=1的情况下,题目限时是依赖于OJ_TIME_LIMIT_TO_TOTAL的:
    • OJ_TIME_LIMIT_TO_TOTAL=1 限时应用于所有数据的总耗时
    • OJ_TIME_LIMIT_TO_TOTAL=0,限时应用于每组测试文件。
    • 状态页status.php(solution表)中记录的时间,取决于OJ_USE_MAX_TIME:
    • OJ_USE_MAX_TIME=0时,记录的是总耗时。
    • OJ_USE_MAX_TIME=1时,记录的是最高耗时。 因此,当测试数据组数较多时,推荐设定OJ_USE_MAX_TIME=0,OJ_TIME_LIMIT_TO_TOTAL=1可以减轻判题机压力。
    •  

    常见设置:

    中学生:
    OJ_OI_MODE=1
    OJ_TIME_LIMIT_TO_TOTAL=0
    OJ_USE_MAX_TIME=1

     大学生教学:
    OJ_OI_MODE=1
    OJ_TIME_LIMIT_TO_TOTAL=1
    OJ_USE_MAX_TIME=0

     大学生竞赛:
    OJ_OI_MODE=0
    OJ_TIME_LIMIT_TO_TOTAL=1
    OJ_USE_MAX_TIME=0

    • 如果希望不是对系统全局设置进行改动,只希望对某个题的规则进行订制,可以在测试数据目录下创建judge.conf,该文件中的相关设置只对该题生效。

    OJ_JAVA_TIME_BONUS 虚拟机语言时间宽松
    OJ_JAVA_MEMORY_BONUS 虚拟机语言内存宽松
    OJ_SIM_ENABLE 检查相似度
    OJ_JAVA_XMS JRE内存参数
    OJ_JAVA_XMX JRE内存参数
    OJ_OI_MODE OI模式判题,出错时继续后续测试点
    OJ_FULL_DIFF 完整对比
    OJ_RAW_TEXT_DIFF 原始对比
    OJ_SHM_RUN 共享内存运行
    OJ_USE_MAX_TIME 使用最长的单例作为显示时间
    OJ_TIME_LIMIT_TO_TOTAL 限制时间为总时间
    OJ_IGNORE_ESOL 忽略行末空白字符
    OJ_INTERNAL_MARK 允许单例内部通过比例分
    OJ_TURBO_MODE 加速模式
    OJ_CPU_COMPENSATION CPU计时系数
    OJ_COPY_DATA 复制测试数据到data.in
    OJ_CC_STD GCC编译标准参数
    OJ_CPP_STD G++编译标准参数
    OJ_CC_OPT C/C++优化级别参数
    OJ_AUTO_RESULT 自动判题AC的状态值:4是AC,14是等待人工确认。

    测试文件的文件名命名有什么规则?

    • 一般推荐用英文命名,相同文件名的.in .out文件为一组。
    • 不支持.ans的扩展名,请在上传前用Windows的命令行统一修改ren *.ans *.out
    • 支持在文件名中使用方括号[]来标注分数。如 test01[20].in / test01[20].out将视为分数是20分,未标注的文件按10分计分,系统最终根据所有文件的总分和运行得分,记录提交的通过率pass_rate放入solution表,用于前台显示。
    • 评测的时候根据所有.in文件的字典序来评测, 因此test10先于test2评测, 后于test02评测。
    • subtask的命名规则,可以在分数之前,再增加一个英文句号. 系统认为这个句号之前的内容为subtask的名字,相同subtask名字的测试数据为一组,互相绑定。
      • 例如: subtask1.1[10].in/out 和 subtask1.2[20].in/out 为一组subtask,必须同时通过才能得分共30分。
      • subtask不限定必须是数字,如 TaskA.a[20].in/out 和 TaskA.b[20].in/out也可以是一组,共计40分。
      • subtask的题目中也可以有不跟其他数据绑定的,认为是自己一组,如big[30].in/out可以跟前面两个例子同时放在一个题目中,共计100分。

    为什么我的系统卡在编译中?

    • 如果修改了数据库密码,请注意除了db_info.inc.php需要修改,还需要修改judge.conf中的数据库密码,并需要重启judged进程。
    • 如果judge.conf中启用了OJ_USE_DOCKER=1,请确保禁用了OJ_SHM_RUN=0,并检查run0等目录是真实的目录而非软连接。
    • 如果如果OJ_USE_DOCKER=0时系统正常,OJ_USE_DOCKER=1时卡住,请检查install目录下的Dockerfile文件内容是否符合需求,并再次运行docker.sh确认运行结果正常。
    • 修改OJ_USER_DOCKER参数,需要重启judged生效,方法是sudo pkill -9 judged && sudo judged
    • 如果是刚刚新装的系统,尝试去/home/judge/src/install重新运行docker.sh :
      sudo su
      cd /home/judge/src/install
      bash docker.sh

    正式比赛或大规模系统需要注意哪些问题?

    • 正式比赛推荐激活db_info.inc.php中的两个参数,用bs3界面。前者开启后不能查看之前历史代码,后者开启锁定系统只能参与指定比赛,练习功能关闭。

    //static  $OJ_EXAM_CONTEST_ID=1000; // 启用考试状态,填写考试比赛ID
    //static  $OJ_ON_SITE_CONTEST_ID=1000; //启用现场赛状态,填写现场赛比赛ID
    

    • 对于公网上的系统,推荐使用阿里云的RDS作为数据库服务器,然后根据比赛规模分别部署一定数量的判题机和Web服务器,通过域名解析进行Web访问的负载均衡。
    • Web服务器和判题机都和RDS配置在同一专用网络中,使用mysql直连数据库。
    • Web服务器都增加Memcached做页面缓存。
    • 可以配置php用Memcached存放session数据。
    • 判题机测试数据提前复制,并配置证书登陆、编写rsync脚本方便覆盖同步。
    • 判题机开启UDP监听(judge.conf:OJ_UDP_ENABLE等参数),Web服务器配置好UDP任务推送(db_info.inc.php:$OJ_UDP等参数)。
    • 安装配置完成后,可以从任意一台Web服务器导入一个特制的FPS文件,这个文件中可以提前复制粘贴数百份solution。
    • 导入后,可以模拟大量提交,然后观察全部判题队列的运行时间,推算平均判题速度,观察判题机分配是否均匀,判题结果是否一致,耗时内存是否接近。

    NOI SCP CCF 新标准使用C++14,如何在hustoj中更改默认的编译参数。

    最新版本已经更新默认C++标准为C++14,直接升级即可。 对于2021年7月份之后安装的用户,judge.conf中自己增加一个OJ_CPP_STD=-std=c++14即可。

    C++ 中的gets函数哪里去了?为何编译报错?

    根据 https://zh.cppreference.com/w/cpp/io/c/gets , gets函数已经被移除。 可以使用#define gets(S) fgets(S,sizeof(S),stdin) 作为兼容性宏替换。

    Python判题好慢好慢,如何加速?

    如果你的系统主要为Python服务,可以修改/home/judge/etc/judge.conf 设定 OJ_PYTHON_FREE=1 为了增加安全性,请在/home/judge/src/install目录运行sudo bash docker.sh,然后修改/home/judge/etc/judge.conf 设定 OJ_USE_DOCKER=1 这样设定后,可以提高Python的判题速度,并提供额外的安全防护。 推荐使用Ubuntu20.04作为基础系统,这个针对Python优化的方案在其他发行版未经测试。

    为什么提交后没有记录?

    可能是没有填写验证码,或者昵称过长,或者是数据库结构不是最新版(Web代码和数据库版本不一致)。 建议后台-系统管理-系统-更新数据库-Update点击一次。

    如何使用HTTP判题模式

    1、注册一个新的账户例如judger1,用作判题。 2、用管理员登陆后台,给这个判题账户增加HTTP_JUDGE权限。 3、修改判题机judge.conf,设置好相关字段

       OJ_HTTP_JUDGE=1
       OJ_HTTP_BASEURL=http://OJ系统URL地址/
       OJ_HTTP_USERNAME=judger1
       OJ_HTTP_PASSWORD=judger1password
    

    4、修改db_info.inc.php,禁用$OJ_VCODE验证码。 5、重启判题机

       sudo pkill -9 judged
       sudo judged
    

    另参考 https://github.com/zhblue/hustoj/blob/master/wiki/HTTPJudge.md

    是否可以只由管理员来注册账号,自己不能注册

    可以,设置db_info.inc.php中的选项, https://github.com/zhblue/hustoj/blob/master/trunk/web/include/db_info.inc.php#L51

    static $OJ_REGISTER=true; //true允许注册新用户,false禁止注册
    static $OJ_REG_NEED_CONFIRM=true; //true新注册用户需要审核,false无需审核直接登陆
    

    关闭注册后,管理员可以在后台“比赛队账户生成器”,生成指定数量的账户用于分配。 http://xxxx.xxxxx/admin/team_generate.php

    如何显示MathJax语法的公式?

    修改db_info.inc.php设置

    static  $OJ_MATHJAX=true;  // 激活mathjax
    

    需要用户能够正常访问互联网,内网用户需要自行部署mathjax内网镜像,并修改template/bs3/problem.php中相关路径。

    如何启用查重机制?

    修改/home/judge/etc/judge.conf,设置

    OJ_SIM_ENABLE=1
    

    修改/home/judge/src/web/include/db_info.inc.php,设置

    $OJ_SIM=true;
    

    • 抄袭只对不同账号间生效,自己抄袭自己不计。拥有Source_browser权限的账号可以看到具体数值和对比。
    • 至少要50个词汇以上,才会判断相似度,过于短小的程序不会进行判断。
    • 长期使用查重功能,需要占用较多磁盘空间和CPU时钟,可以考虑用下面的命令考虑定期清理:
      • cd /home/judge/data
      • find -name ‘ac’ -exec rm -rf {} \;
      • 清理前注意备份,避免误操作
    •  

    不能访问github,国内网,如何通过gitee安装?

    没关系,最新的脚本不能访问Github也能用脚本安装,只要确保你的软件源是完整可用的。 通过下面语句可以测试软件源是否正常。

    sudo apt-get update
    

    如果没有产生关于无法访问的报错,就说明是正常的,可以直接运行首页的脚本。 如果有报错,请检查dns是否正确,/etc/apt/source.list的内容是否正确。 百度您的操作系统名称+版本号+软件源,如:Ubuntu 20.04 软件源,可能会找到修复的方法。

    请问如何重启判题机?

    sudo pkill -9 judged
    sudo judged
    

    XXXXX 这个文件是在哪的

       sudo find /home/judge -name "XXXXX"
    

    数据库账号密码是什么,如何登陆mysql?

    数据库账号密码存放在两个配置文件中:

    /home/judge/etc/judge.conf
    /home/judge/src/web/include/db_info.inc.php
    

    新版本中,快速登陆mysql的脚本在install目录里,名字为mysql.sh 使用方法

    sudo bash /home/judge/src/install/mysql.sh

    如果忘记了admin密码,可以在登录mysql之后执行sql删除admin账户, 然后重新注册一个。

    mysql> delete from users where user_id=’admin’;

    也可以安装phpmyadmin:
    sudo apt-get -y install phpmyadmin
    第一个对话框询问关于Configure database for phpmyadmin with dbconfig-common
    用Tab键选到No,回车。
    在后续对话框中,不要选择任何一个(apache/lighthttpd都不选),用Tab键选到最下面的OK
    安装完成后,执行
    sudo ln -s /usr/share/phpmyadmin /home/judge/src/web/pma
    然后就可以在OJ的网页端,用http://IP或域名/pma/ 来访问phpmyadmin了
    数据库帐号密码,查看前述配置文件。

    如何用Windows上的Navicat去连接远程服务器上的mysql?

    利用ssh的端口转发机制,把Windows本地的3306端口映射到远程的3306端口上,就可以用前面一个问题中查到的账号密码去连接数据库了。对于Navicat参考https://blog.csdn.net/qq_36798131/article/details/61618399

    注意常规标签里写的是配置文件里查到的数据库的账号密码,SSH标签里写的是连接SSH用的账号密码。如果你的ssh服务端口不是22,记得要修改成正确的端口

    对于putty,参考下图:

     

    后台导入问题失败

    1、先用谷歌浏览器直接打开xml文件,看是否有语法错误,如果有,用文本编辑器修订提示的行号。

    2、如果超过100M,可以先用EasyFPSViewer拆分成多个小文件,然后再导入。

    3、对于HUSTOJ,可以先压缩为zip再上传导入

    4、修改/etc/php/7.2/fpm/php.ini, 提高post_max_size、upload_max_filesize 、memory_limit、max_execution_time 的值。修改后执行sudo service php7.2-fpm restart生效。

    电脑配置太高,造了很多数据还是没法卡住暴力怎么办?

    修改/home/judge/etc/judge.conf

    OJ_CPU_COMPENSATION=1.0
    

    增加这个值可以降低CPU的评测速度,安装脚本根据CPU的bogomips值来初始化。 最高不超过100,设为100可以将原先1ms的测试数据计成100ms。

    为什么题目不见了/如何让比赛里的题目也可以在练习里做?

    参考这里

    其他主机怎么连接到oj?

    这取决于买的阿里云还是校园网服务器,或者虚拟机: 阿里云直接用阿里提供的公网ip访问,也可以添加域名解析后用域名访问。 校园网,用学校提供的内网ip或二级域名访问。 虚拟机,百度“【虚拟机的名字如virtualbox或vmware】+端口映射” ,把80端口转进去,然后用物理机的ip地址访问。

    迁移/更新/升级后似乎不能提交/判题了?

    这多半意味着数据库结构与预期不一致,可以通过以下方法解决:

    • 管理后台更新数据库
    • 参考db.sql中的建表语句,对比修订当前库表结构
    • cd /home/judge/src/install
      bash mysql.sh < update.sql
    • 处理掉从老版本MySQL里带来,在新版MySQL中不再合法的日期数据,如:’0000-00-00’,然后参考前面的方案解决。
    • 更新源码后,判题部分需要编译
    • sudo su
    • cd /home/judge/src/core
    • bash make.sh
    • 修改judge.conf,设置OJ_USE_DOCKER=1,OJ_INTERNAL_CLIENT=0
    • 重启judged
    • sudo pkill -9 judged
    • sudo judged

    比赛后题目看不见了?

    • 比赛的题目在比赛添加后,直到结束前,是不能在练习中看到和提交的,否则比赛将泄题或罚时被绕过。
    • 私有比赛的题目,在比赛结束后,仍然保留,即使比赛被隐藏也是一样,这是为了防止下一届新生提前获知测试内容。
    • 如果希望私有比赛后,题目公开可做,请将比赛切换为公开。
    • 如果你对这一机制感到不适,希望所有题目都能自由练习,可以激活db_info.inc.php中的$OJ_FREE_PRACTICE=true;如果你的配置文件里没有这个选项,可以在进行系统更新后手动增加。

    关于NOIP赛制

    • 设置judge.conf中的OJ_OI_MODE=1 //不在单个数据点WA时停止判题,而是继续判题
    • 设置db_info.inc.php中的 $OJ_MARK=”mark”; // 非AC的提交结果显示得分而非错误比率
    • 设置db_info.inc.php中的 $OJ_OI_1_SOLUTION_ONLY=true; //比赛是否采用noip中的仅保留最后一次提交的规则。
    • 添加比赛时,比赛标题中包含”NOIP”这个关键词 // 赛后才能看结果
    • “NOIP”这个敏感词在db_info.inc.php中可以修改

    随机的CE编译错误

    • 检查OJ_RUNNING的设置与run?目录的对应关系,例如:OJ_RUNNING=2,需要run0 run1两个目录,属主judge,权限700。
    • 有的题目CE有的题目AC,适当放宽judge_client.cc中compile函数里的CPU、内存、文件限制。约1234行前后。修改后需在core目录执行sudo bash make.sh

    老版本

    编译报错找不到mysql.h

       如果使用debian或centos,可能默认安装的是mariadb不是mysql,这时请自行搜索安装mariadb的头文件。

    debian里大约是

        sudo apt-get install libmariadb-dev
    

    centos里大约是

        sudo yum install MariaDB-devel
    

    Runtime Error:[ERROR] A Not allowed system call: runid:10735 CALLID:20 如何解决?

    编辑okcalls64.h或okcalls32.h(取决于您使用的Linux版本uname -a出现x64字样则64位,i686字样则32位),在对应的语言数组里增加内容。 如C或C++:

    int LANG_CV[256] = { 85, 8,140, SYS_time, SYS_read, SYS_uname, SYS_write, SYS_open,
    	SYS_close, SYS_execve, SYS_access, SYS_brk, SYS_munmap, SYS_mprotect,
    	SYS_mmap2, SYS_fstat64, SYS_set_thread_area, 252, 0 };
    

    将上述报错中CALLID:后的数字,增加到数组中非末尾的位置,如果这个数字是0,请加在首位。

    int LANG_CV[256] = { 20, 85, 8,140, SYS_time, SYS_read, SYS_uname, SYS_write, SYS_open,
    	SYS_close, SYS_execve, SYS_access, SYS_brk, SYS_munmap, SYS_mprotect,
    	SYS_mmap2, SYS_fstat64, SYS_set_thread_area, 252, 0 };
    

    修改完成,重新在core目录执行sudo ./make.sh 然后重新测试,如果发现再次出现类似错误,请留意CALLID数字变化,重复上述步骤直至问题消失。 看不懂请移步知乎 看更详细解释。

    如何让判题程序忽略行尾的空白字符

    在judge_client.cc头部增加宏定义 IGNORE_ESOL 或者修改 Makefile 增加 -DIGNORE_ESOL 参数。

    多组数据怎么上传?

    加好题目后在题目列表找TestData,点击上传。 主文件名一样的*.in *.out,如test1.in test1.out

    CentOS 用户

    CenOS已经停止后续更新服务,推荐换用Ubuntu或者Debian。

    点击CentOS

    使用HUSTOJ要花多少钱?

    不要钱,我们是GPL的。

    管理员如何添加,如何管理?

    查看安装说明[README],管理员登录后有Admin菜单。
    

    为什么我提交的答案始终在pending?

    判题程序judged需要用root帐号启动,请重启服务器或手动执行sudo judged。如果无效,请检查/home/judge/etc/judge.conf中的数据库账号配置,参考[Configuration],修正后再次重启服务器或执行sudo pkill -9 judged等待一会儿再执行sudo judged
    

    为什么添加题目时出现warning,题目目录下数据没有自动生成?

    您需要修改测试数据目录,给予php-fpm操作数据目录的权限。Ubuntu下php-fpm运行的用户身份是www-data

    chgrp www-data -R /home/judge/data 
    chmod g+rw -R /home/judge/data
    
    

    为什么我添加的题目普通用户看不到?

       题目默认为删除状态,只有管理员能访问,当管理员确认题目没有问题后,可以点击ProblemList中红色的Reserved,切换为绿色的Available启用题目。

    为何我的C/C++都能用,唯独Java总是CE/RE?

      目前只支持sun原版jdk和openjdk,其他jdk暂不能保证支持。如果你用的是64位系统,你可能需要自己调整一下源代码。请联系我。

    我是管理员,为什么不能查看别人的源码?

    请给自己增加source_browser权限。issue1
    

    如何从POJ的免费版迁移?

    参考[POJ2HUSTOJ]
    

    我有问题怎么办?

    到issues去提问,new issue
    

    如何获得管理员帐号?

    注册一个叫admin的用户,自动获得权限。
    

    如何进入后台?

    以管理员身份登录,点击Admin/管理进入后台。
    

    如何添加题目?

    进入后台,点击左侧NewProblem。
    

    如何添加测试数据?

    添加题目时,可以在test input/test output添加一组测试数据,大规模的数据(10kb+)和更多的数据,可以在添加完题目后,通过ftp/sftp,上传到题目对应目录,通常是 /home/judge/data/题号。命名规则是输入数据以.in结尾,输出数据以.out结尾,主文件名相同。
    

    如何编辑题目?

    后台中点击ProblemList,找到需要编辑的题目,点击Edit。编辑时不能修改测试数据,测试数据请使用ftp工具修改。
    

    如何启用题目?

    题目添加后,默认是停用状态,以防比赛提前漏题,后台中点击ProblemList,找到题目,点击Reserved 切换为Available启用题目,或者组织比赛,比赛中的题目将自动启用。
    

    如何组织比赛?

    在题目列表ProblemList中选择使用的题目,在PID一栏打钩,点击CheckToNewContest按钮,进入到比赛添加页面,输入比赛名称,设定比赛时间,语言类型,访问权限提交即可。
    也可以使用管理菜单中的NewContest,需要手动输入题目编号,用英文逗号分隔。
    

    如何修改、删除比赛?

    点击比赛列表ContestList,选择Edit或Delete。
    

    如何修改公告信息?

    点击SetMessage。修改无效请检查admin/msg.txt是否对php账号(www-data)可写
    

    如何修改用户密码?

    点击ChangPassWD
    

    如何重新判题?

    点击Rejudge,输入题号或运行编号。
    

    如何增加用户权限?

       Addprivilege/添加权限, administrator为管理员,source_browser为代码审查,contest_creator为比赛组织者。 通常给使用系统的老师分配代码审查和比赛组织者权限即可。

    如何导入、导出题目?

    使用ImportProblem,上传FPS文件。
    使用ExportProblem,输入起始编号,结束编号,或题号列表,如果输入了列表,起始结束将不起作用。
    

    如何更新数据库结构?

    系统升级中,有对数据库的修改,这些修改不能通过SVN实现自动更新,如果发现升级web/core代码后系统报错,可以执行update database操作,进行数据库升级。因为脚本中有测试代码,所以重复执行不会造成影响。
    

    如何下载新题目?

    访问FreeProblemSet,查看Downloads列表。
    

     

    Why the added problem don’t show up to non-admin users?

    problem is deleted when first added, admin need to Resume them in the "Problem List"
    

    I install hustoj on CentOS, why it doesn’t work?

    disable your SELinux and check /etc/php.ini for short_open_tag = On
    

    Why Java can’t work?

    Try SUN-JDK or openjdk,if you are working with a 64bit System, check issue25
    

    How much dollar to get this system ?

    0, God bless GPL.

  • 升级HUSTOJ

    2018年以后的系统


    打开一个终端或者登录远程ssh,输入:

    sudo bash /home/judge/src/install/update-hustoj

    即可完成升级


    ——2018年以前的系统——

    检出最新web,复制原upload目录到新目录,测试后切换。

    检出最新core,./make.sh。

    管理员登陆后台,更新数据库。

    以前升级hustoj可以用update-hustoj命令快速完成,自从googlecode光荣的进入被墙的黑名单后,很多用户长时间没有做过升级了。

    现在的最新代码放在github(愿习大大保佑github不封,保佑台湾是中国不可分割的一部分),因此升级需要从github取得最新源码。

    如果你是用apache的,老脚本安装的。

     sudo svn checkout https://github.com/zhblue/hustoj/trunk/trunk/web /var/www/new/
    
    sudo cp -a /var/www/JudgeOnline/include/db_info.inc.php  /var/www/new/include/
    
    到这里找到函数pdo_query
    https://github.com/zhblue/hustoj/blob/master/trunk/web/include/db_info.inc.php
    把它添加到/var/www/new/include/db_info.inc.php中
    
    sudo cp -a /var/www/JudgeOnline/upload  /var/www/new/
    
    sudo svn checkout https://github.com/zhblue/hustoj/trunk/trunk/core core
    
    cd core
    
    sudo pkill -9 judged
    
    sudo ./make.sh
    
    sudo judged
    
    访问http://原OJ地址/new
    
    登陆,后台,更新数据库。
    
    测试无误后
    
    sudo mv /var/www/JudgeOnline /var/www/oldOJ
    
    sudo mv /var/www/new /var/www/JudgeOnline

    如果你是用nginx,新脚本安装的

    sudo su
    cd /home/judge/src
    svn up .
    cd core
    pkill -9 judged
    ./make.sh
    judged

    ……待续

  • [原]给HUSTOJ用户提供的源码阅读与修改建议

    0、 准备知识

    a)        最新系统源码可以用svn取得,或在下述地址直接浏览

    i.  http://code.google.com/p/hustoj/source/browse/   墙外老版

    ii.  https://github.com/zhblue/hustoj                         无墙新版

    b)       系统分为Web和Core两个部分

    c)        简化ER图

    hustoj-db

    d)       Web与core的连接方式有两种,实际运行可选其中一种

    i.   数据库连接【默认】

    1.        Web插入Solution表获得solution_id,result设为14

    2.        插入source_code表准备需要评测的源码。

    3.        更新solution的result为0,标志准备好进入评测阶段。

    4.        judged轮询solution表( 或通过UDP端口得到有新任务的消息通知 ),发现新纪录,派生judge_client进程。

    5.        judge_cliet判题时更新solution表result等字段

    6.        Web端轮询soltuion显示result等字段。

    ii.   HTTP方式

    1.        Web插入Solution表,细节同上

    2.        core访问Web端admin/problem_judge.php,发现新纪录

    3.        core向Web端admin/problem_judge.php提交数据,problem_judge.php更新solution表result等字段

    4.        Web端轮询soltuion显示result等字段。

    • 最新版本里,增加了UDP通知功能,提交记录插入后,通过UDP端口1536发送消息提醒判题机及时处理。

    1、 Web部分

    a)        阅读配置文件,弄清各设置含义

    i.      参考

    db_info.inc.php


    static $DB_HOST="localhost"; 数据库的服务器地址
    static $DB_NAME="jol"; 数据库名
    static $DB_USER="root"; 数据库用户名
    static $DB_PASS="root"; 数据库密码
    // connect db
    static $OJ_NAME="HUSTOJ"; OJ的名字,将取代页面标题等位置HUSTOJ字样。
    static $OJ_HOME="./"; OJ的首页地址
    static $OJ_ADMIN="root@localhost"; 管理员email
    static $OJ_DATA="/home/judge/data"; 测试数据所在目录,实际位置。
    static $OJ_BBS="discuss";//"bbs" 论坛的形式,discuss为自带的简单论坛,bbs为外挂论坛,参考bbs.php代码。
    static $OJ_ONLINE=false; 是否使用在线监控,需要消耗一定的内存和计算,因此如果并发大建议关闭
    static $OJ_LANG="en"; 默认的语言,中文为cn
    static $OJ_SIM=true; 是否显示相似度检测的结果。
    static $OJ_DICT=true; 是否启用在线英字典
    static $OJ_LANGMASK=1008; //1mC 2mCPP 4mPascal 8mJava 16mRuby 32mBash 1008 for security reason to mask all other language 用掩码表示的OJ接受的提交语言,可以被比赛设定覆盖。
    static $OJ_EDITE_AREA=true;// 是否启用高亮语法显示的提交界面,可以在线编程,无须IDE。
    static $OJ_AUTO_SHARE=false;//true: 自动分享代码,启用的话,做出一道题就可以在该题的Status中看其他人的答案。
    static $OJ_CSS="hoj.css"; 默认的css,可以选择dark.css和gcode.css,具有有限的界面制定效果。
    static $OJ_SAE=false; //是否是在新浪的云平台运行web部分
    static $OJ_VCODE=true; 是否启用图形登录、注册验证码。
    static $OJ_APPENDCODE=false; 是否启用自动添加代码,启用的话,提交时会参考$OJ_DATA对应目录里是否有append.c一类的文件,有的话会把其中代码附加到对应语言的答案之后,巧妙使用可以指定main函数而要求学生编写main部分调用的函数。
    static $OJ_MEMCACHE=false;是否使用memcache作为页面缓存,如果不启用则用/cache目录
    static $OJ_MEMSERVER="127.0.0.1"; memcached的服务器地址
    static $OJ_MEMPORT=11211; memcached的端口
    static $OJ_RANK_LOCK_PERCENT=0; //比赛封榜时间的比率,如5小时比赛设为0.2则最后1小时封榜。
    static $OJ_SHOW_DIFF=false; //显示WrongAnswer时的对比

    b)       制定自己的前台模板(即改变页面效果)

    i.      复制template/bs3目录,放置在template目录中,并改为新模板名。

    ii.     在db_info.inc.php中修改$OJ_TEMPLATE变量为新模板名

    iii.   浏览前台,打开要修改的页面,根据地址栏修改新目录中对应的php、css、images等文件,保存后刷新页面看修改效果。

    c)        模板制定成功以后应该有足够的知识开始修改template目录以外的部分了

    d)       论坛

    i.    建议集成GPL的phpbb,参考。

    ii.    集成Discuz

    1.   建议购买商业许可。

    2.   参考/web/include/login-discuz.php

    e)        比赛根据数据通过率排名,而不只看AC数量

    i.             数据库solution表pass_rate字段表示改条通过率。

    ii.             把contestrank.php中的solved字段变成浮点对待。

    iii.            这里,修改积分方式,按照希望的方式积分。可能需要给TM增加字段$p_wa_best_rate记录每题最大通过率。

    f)        对有志于重写整个前台的勇士

    i.             希望你选择一种魔法师编程语言(node.js/ror/python/go)。

    ii.             如果做不到前面那条,请做好长时间开发的心理准备。

    iii.             理论上任何现存web编程模型都可以,推荐JSP/SSH(前方高能坑……)。

    iv.             建议实现admin/problem_judge.php的仿真,方便直接集成原版core。(get/post/ servlet-mapping)

    2、 Core部分

    a)        阅读配置文件,弄清各设置含义

    i.    参考


    judge.conf  不要复制下面的注释进入实际文件,judged和judge_client不能识别#注释。

    OJ_HOST_NAME=127.0.0.1 #mysql host ip
    OJ_USER_NAME=root #mysql host username
    OJ_PASSWORD=root #mysql host password
    OJ_DB_NAME=jol #mysql DB name
    OJ_PORT_NUMBER=3306 #mysql port
    OJ_RUNNING=4 #max concurrent threads number of judge_client
    OJ_SLEEP_TIME=5 #judged work interval
    OJ_TOTAL=1 #Deprecated: total number of judged (hosts/processes)
    OJ_MOD=0 #Deprecated: the number of this judged(host)
    OJ_JAVA_TIME_BONUS=2 #java's extral time
    OJ_JAVA_MEMORY_BONUS=512 #java's extral memory
    OJ_SIM_ENABLE=0 #using sim
    OJ_HTTP_JUDGE=0 #using http link to database(if enabled,mysql is not used anymore)
    OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline #http link basedir
    OJ_HTTP_USERNAME=admin #account in db that has http_judge privilege
    OJ_HTTP_PASSWORD=admin #password of this account
    OJ_OI_MODE=0 #using oi (Olympiad in Informatics) mode
    OJ_SHM_RUN=0 #using /dev/shm for fast running & low harddisk wear
    OJ_USE_MAX_TIME=0 #use the max time of all testcase rather than total time
    OJ_LANG_SET=0,1,2,3,4 #selective judge solution of languagesOJ_HOST_NAME=127.0.0.1 如果用mysql连接读取数据库,数据库的主机地址
    OJ_USER_NAME=root 数据库帐号
    OJ_PASSWORD=root 数据库密码
    OJ_DB_NAME=jol 数据库名称
    OJ_PORT_NUMBER=3306 数据库端口
    OJ_RUNNING=4 judged会启动judge_client判题,这里规定最多同时运行几个judge_client
    OJ_SLEEP_TIME=5 judged通过轮询数据库发现新任务,轮询间隔的休息时间,单位秒
    OJ_TOTAL=1 老式并发处理中总的judged数量
    OJ_MOD=0 老式并发处理中,本judged负责处理solution_id按照TOTAL取模后余数为几的任务。
    OJ_JAVA_TIME_BONUS=2 Java等虚拟机语言获得的额外运行时间。
    OJ_JAVA_MEMORY_BONUS=512 Java等虚拟机语言获得的额外内存。
    OJ_SIM_ENABLE=0 是否使用sim进行代码相似度的检测
    OJ_HTTP_JUDGE=0 是否使用HTTP方式连接数据库,如果启用,则前面的HOST_NAME等设置忽略。
    OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline 使用HTTP方式连接数据库的基础地址,就是OJ的首页地址。
    OJ_HTTP_USERNAME=admin 使用HTTP方式所用的用户帐号(HTTP_JUDGE权限),该帐号登录时不能启用VCODE图形验证码,但可以登录成功后启用。
    OJ_HTTP_PASSWORD=admin 密码
    OJ_OI_MODE=0 是否启用OI模式,即无论是否出错都继续判剩余的数据,在ACM比赛中一旦出错就停止运行。
    OJ_SHM_RUN=0 是否使用/dev/shm的共享内存虚拟磁盘来运行答案,如果启用能提高判题速度,但需要较多内存。
    OJ_USE_MAX_TIME=1 是否使用所有测试数据中最大的运行时间作为最后运行时间,如果不启用则以所有测试数据的总时间作为超时判断依据。
    OJ_LANG_SET=0,1,2,3,4 #判哪些语言的题目

    OJ_COMPILE_CHROOT=0  是否在编译时使用chroot环境,避免某些编译期攻击。

    OJ_TURBO_MODE=0 是否放弃用户表和问题表的数据一致性,以在大型比赛中添加更多的判题机来提高判题速度。

    ii.      源码https://github.com/zhblue/hustoj/blob/master/trunk/core/judge_client/

    b)       查阅Linux文档中关于下述关键词的内容

    i.  Ptrace

    ii.  Chroot

    iii. Setuid

    iv.  Proc

    v. shm

    c)        所有API限定在okcalls.h

    d)       代码查重工具sim

    i.   https://github.com/zhblue/hustoj/tree/master/trunk/core/sim

    e)        对于计划改造Core来适应你自己的OJ前台的朋友

    i. 参考1.c.iv

    ii. 在judge_client.cc中搜索关键词wget

    f)        HUSTOJ的沙箱模型

    i.  相对openjudge.net的sandbox libraries而言并不严谨

    ii.  对于OJ而言,基本满足需求

    iii.  容易理解、容易实现、容易修改

    f) 莫名其妙的Runtime Error,请点击RuntimeError打开详细信息,并做英译汉。

    对于okcalls23/64.h进行修改,请只修改符合你的操作系统架构(32位/64位)的那个,0只能在首位,末尾必须为0。非0callid请加在中间任意位置。

    CSDN网友的源码注释

    http://blog.csdn.net/legan/article/details/40746829

    http://blog.csdn.net/legan/article/details/40789939

  • 二次开发过的系统,如何更新AI错误解析功能?

    将最新版本中的aiapi目录复制到web目录中。

    在db_info.inc.php中增加变量 $OJ_AI_API_URL=”aiapi/qwen.php”;    //根据所需选择aiapi目录中的某个文件。

    配置$OJ_AI_API_URL所指向的文件,主要是提供其中的$apiKey 的值,其他内容可根据自己需求修改调整。

    修改template/syzoj/ceinfo.php 和 template/syzoj/reinfo.php , 如果你有自己开发的template,请修改对应目录下的文件。

    在合适的位置( javascript的片段中)增加

    <?php if (isset($OJ_AI_API_URL)&&!empty($OJ_AI_API_URL)){ ?>
                    expmsg+=”AI 答疑 …<img src=’image/loader.gif’>”;
    $(“#errexp”).html(expmsg);
                    $(“#errexp”).load(“<?php echo $OJ_AI_API_URL ?>?sid=<?php echo $id?>”, function(response, status, xhr) {
                            if (status === “success”) {
                                    $(“#errexp”).html(marked.parse($(“#errexp”).text()));
                            } else if (status === “error”) {
                                    console.error(“加载失败:”, xhr.status, xhr.statusText);
                            }
                    });
    <?php } ?>

     

    如果实在搞不清楚,可以覆盖这两个文件。

    尝试提交一个语法有问题的代码,查看编译错误,滚动页面到最下方,等待结果出现。

    如果没有出现,可以按F12查看network标签,寻找qwen.php的返回信息进行debug。

  • 如何使用SaaS模式?

    SaaS模式的功能是用一台服务器服务多个(10~100)相互独立的OJ系统,需要有自己的域名(已备案),没有这种需求的老师不用继续往下看了。

    1 要用judged目录中的judgehub取代judged作为系统服务 , 复制judgehub到/usr/bin。

    2 修改/etc/init.d/hustoj, 替换所有的judged为judgehub

    3 创建默认的farmbase:/home/saas目录,赋属主www-data。

    4 修改include/init.php,将
    $DOMAIN=”my.hustoj.com”; // 替换为SaaS服务的主域名。

    5 修改db_info.inc.php设置
    static $OJ_SaaS_ENABLE=true;

    6 添加泛域名解析 *.my.hustoj.com和主域名解析 my.hustoj.com到服务器

    Judgehub简介:

    背景:

    随着服务器性能的不断提升,一台高性能物理机或者云服务器的判题能力已经足以满足多个独立OJ系统的需求。传统的judged多进程启动模式就是为这种情景设计的。但是多进程模式在大规模SaaS平台中存在一个问题,就是大量(数百个)同时启动的judged可能在50%以上的时间里都是闲置状态中消耗着服务器宝贵的内存资源和奢侈的数据库长链接,定期轮询数据库也构成了不小的压力。

    解决方案:

    一个显而易见的解决方案,就是设置类似早期unix系统中inetd进程的轻量级守护程序,在必要时启动负责对应系统的judged,judged完成一定量的判题任务后自动退出。这样既能保证判题的响应速度,又能减少judged并发数量,在同等级硬件设施的基础上提供更高的系统总容量。

    代码实现:

    实现上述方案的代码即为judgehub,它的命令行参数如下:

    judgehub [farmbase] [udpport] [debug]

    farmbase:

    在虚拟主机系统中,虚拟主机往往集中存放在特定目录下,如常见的/home/saas,judgehub要为所有的虚拟主机提供判题服务,自然需要知道这个基础路径。而具体是哪个子目录下存在hustoj的主目录,则作为消息的内容发送到udp端口上。

    udpport:

    judgehub监听的udp端口,因为udp是无连接的,因此资源消耗少,适合单端口接受多个消息源,代码容易实现。

    debug:

    当第三个参数存在时,不管内容是什么,开启debug模式,judgehub不自动进入后台,并输出调试信息。

    php方面的适配:

    之前php代码发送给judged的消息内容是新增提交的编号,实际上judged并未直接使用该编号,而是主动去数据库查询最新的任务编号,这为适配judgehub留下了方便之处。只需将消息内容修改为从farmpath到hustoj主目录的相对路径,即可完成适配。

    新的提交运行流程:

    • submit.php接受到提交,插入数据库
    • submit.php发送hustoj子路径到UDP端口
    • 监听UDP端口的judgehub接受到消息,拼接计算出启动judged所需参数,启动judged
    • judged根据judge.conf配置的方式完成判题任务后退出
    • judgehub等待下一个消息触发

    可能存在的问题与处理:

    当提交频繁时,judged可能被重复启动,但是因为启动judged时有锁文件操作,后续进程将自动退出。

    管理员重判需要补充发送消息给judgehub。

    其他人可能向UDP端口发送未经授权的消息,可能导致缓冲区溢出。因此judgehub仅可在回环地址127.0.0.1上监听,或在可信网络内使用。通过简单的校验代码,如判断judge.conf文件是否存在,来决定是否启动judged进程。

    版权声明

  • 写给小贝的信

    小贝

    你好!

    你问我,为什么每天晚上都陪你入(ru)睡?

    那是因为,你是家里年龄(ling)最小的成员,爸爸妈妈对你有很多的偏(pian)爱,也有很多的期(qi)待(dai)。

    我们希望你在学校里能听懂(dong)老师传授的知识,能和同学愉(yu)快的交流;希望你能不断(duan)的进步,超(chao)过以前的自己;希望你能用心的体(ti)验(yan)人生中的各种挑战与机会。

    这些希望让我们有时会提出一些看上去不近人情(qing)的要求,比如在你还想继续玩耍(shua)的时候要你去休息(xi),比如在你觉得累(lei)了的时候让你坚持先写完作业才能休息。

    我们很高兴的是,你大多数时候都能够尽(jin)力的去完成这些要求,并且不断的制(zhi)造出惊喜。你画的画很好看,你拼的乐高很有创意,你打台球的时候能够(gou)打出意想不到的进球。送你去上学的时候,你会先跟我抱一抱,走去学校的路上还回头跟我招手。

    爸爸妈妈能够感(gan)受到你对我们的依赖和喜欢,我们会努力做更好的父母,也希望你能做更好的自己。

    让我们一起进步吧!

    爱你的

    爸爸妈妈

    2021.6.25

    小贝

  • 某人的游戏史

    关于我带孩子玩游戏,有很多人表示不解:”别人家家长视游戏为洪水猛兽,你怎么还主动带孩子玩游戏,这以后要是沉迷游戏怎么办?”作为玩小霸王走上编程道路的我,笑而不语,其实我心里想的,恰恰是若要他将来进了大学不沉迷游戏,首先就要在大学之前把游戏玩透。而从游戏走向编程,可谓是玩透游戏的终极之路。

    某人第一次接触游戏,大约是会说话的Tom猫,某人话都还说的不溜爸妈就拿这个猫逗他。这个以声音加速变频回放为核心功能的小游戏,给刚学说话的某人一个快速反应的交互对象,同时让他学会了与触屏界面交互。

    某人坐在爸爸怀里的时候发现“鼠标”可以控制电脑屏幕上的东西,就开始试图抢来玩,爸爸无可奈何专门装了一台ubuntu系统的笔记本,给他玩Gcompris里的鼠标游戏,比如擦玻璃、接水管。我当然巴不得他学汉语前先学英语,学英语前先学C语言,可是饭是一口一口吃的,知识也需要循序渐进,没有乐趣的事情是难以持久的。

    接下来,Gcompris里的其他游戏就慢慢进入了某人的游戏库了,什么足球射门、电路连接、小企鹅洗澡。然后爸爸开始在ubuntu的软件仓库里寻找类似的东西,发现了诸如ChildsplayTuxpaint,后来索性重装系统安装了edubuntu。windows下的各种全家桶太讨厌,孩子乱点很容易中招,看到什么莫名奇妙的八卦新闻那就尴尬了。

    *Gcompris和Childsplay都是国外开源界多年积累的多语言教育软件,针对各种年龄段的孩子设计了各种不同类型的游戏,每一种都针对性的训练孩子的记忆力、创造力、排列组合、计算能力等等。

    这期间,爷爷开始教某人认字,随着认识的字越来越多,他看书慢慢从看图多字少的卡片书,慢慢开始转向字多图少的小说,特别是科幻小说(目前看的是三体1和超新星纪元)。经常的使用电脑、长时间看书,让妈妈很担心他的眼睛会近视,于是就开始买很多的玩具来吸引他像其他同龄小朋友一样多玩玩”物理世界”的游戏。不管是物理世界的游戏还是虚拟世界的游戏,都是小朋友学习将来成人技能的过程。这种观点记得是赵忠祥说的,当然,他说的是小狮子们互相打闹的游戏。

    玩具,成了我们日常生活的一大笔开销,有时我都不知道,是我在给孩子买玩具,还是我拿着孩子当借口给自己买玩具(显然是后者多一点)。在各种玩具中,某人最喜欢的是积木和火车轨道。

    他第一次把一块儿三角形的积木放在方块上面,形成房子的模样,奶奶故作惊奇的表扬他,让他很受用,就开始迷恋上摆各种各样的房子。可见及时的表扬一下,哪怕是盲目的不加区分的“你真棒!”,也能让孩子充满了动力。

    刚开始,某人把火车轨道当作是一种积木来拼,后来发现电动的火车永远按照轨道跑,这下触发了他的控制欲。控制欲是个好东西,因为在大脑里这货直接连着成就感。成就感我认为,就是驱动着所谓好学生饥渴的学习的力量,也同时是驱动着差学生沉迷于网络游戏的力量。要把这成就感导向到积极的光明面,这就需要原力更多的鼓励和表扬,最直接的鼓励就是在淘宝立刻定了几十节的充电电池,然后不断的买各式各样的火车和轨道,让轨道越拼越长。为了能得到更长的轨道,某个版本的电动火车,直接在阿里巴巴批发了10套回来。

    玩具越来越多,各式各样的积木、各式各样的轨道火车,他每次都要把他们全都摆出来,把整个客厅当成他的游乐园,摆出来一大堆,然而他只管玩不管收拾,这可苦了某人他妈。

    爸爸看到这种情况,开始寻找积木与火车主题的游戏,第一个上手的是手机上的”轨道火车”:

    这是一个火车主题的解密游戏,要运用各种形状的轨道和机关控制火车开到终点,这回轨道不会摆的满地都是了。更重要的是,这游戏里隐含着程序分支的原始概念。

    解迷游戏的弱点在于通关之后就是索然无味……没关系,火车是一个很有市场的主题。诸如模拟火车、桥梁建筑等关键词,各种市场一搜就是一大堆,为了避免不小心装了恶意扣费软件,把退役的安卓手机刷了个系统,不带SIM卡,专门拿来给某人玩游戏用,当然时间被妈妈严格控制着,不能超过15分钟。

    不断的用新游戏来吸引注意力,各种套路见多了,也就不会特别的沉迷于某一款游戏了。

    曾经沧海难为水,包括巫山都是浮云……

    时间过的飞快,转眼某人上了小学,口算成了一个难题,某人极其郁闷的是“那些题我都会,就是时间来不及了!”

    时间来不及?这还不容易,只要把每道题目的时间尽可能的缩短,加上一定的正反馈机制,让他不由自主的加速加速,哪怕错个一两题,总比剩下10几题没做过要好吧。

    经过30分钟的js头脑风暴,口算训练游戏算是出炉了。

    口算不愿意做,但是玩游戏拿积分,怎么就上瘾了呢?

    一周后再次口算测试,某人骄傲的拿着100分回来,“我就说我都会做,就是来不及了而已嘛~”。

    当乘除法出现了以后,自然就升级了乘除法的功能。

    学习口算之余,偶而我们还玩玩用电工胶带铺轨道的“小火车”(其实就是淘宝上卖给大学生做课程设计的循迹小车套件):

    http://v.youku.com/v_show/id_XNDMyMDEwOTAw.html

    http://v.youku.com/v_show/id_XNDMyMDEwNDg4.html

     

    后来,妈妈怀上了小弟弟,开始担心自己的身材,于是爸爸以将来妈妈产后恢复为借口,购入了Xbox360体感套装250G港版双破解(事实上最后妈妈是玩的最少的人……),这下某人又开启了新世界了。既然要玩游戏,怎么能没有主机。

    先是微软体感大冒险、然后是舞蹈中心、型可塑、水果忍者,极大的锻炼了身体协调能力。接下来虚拟宠物、动物园大亨,然后就义无反顾的掉进了“我的世界”MC的坑。

    *我的世界、MC,很多家长可能不知道,这是一个建造类游戏,在中小学生群体里非常流行。它的创造模式,就是给你无穷多的乐高积木一样的方块,让你充分发挥创造力和想象力,建造各种各样的建筑。

    为了MC,打印了上百页的合成手册、游戏攻略,然后发现手册上说的很多东西xbox上找不到,原来主流玩家玩的是PC版。好吧,为了PC版另外装了一台Windows的笔记本,专门玩PC版。有一天,玩积木的时候突然提出,某人要当市长,在我的世界里要盖一座城市,接下来很长一段时间不停的磨,要求爸爸陪他建城市。爸爸实在不想在这无聊的沙盘游戏里花太多时间,又不忍心打击他的积极性,于是网上花了100大洋找人买了一个完整的城市地图送给他,这才得以脱身。

    MC有点上瘾了,看来需要转移一部分注意力,嗯,城市。

    “城市”这个词反复的被提及,爸爸想起小时候有个“模拟城市”,百度一搜,好家伙,这货居然还在出,从simcity1000 到2000、3000、4000、5,各种平台各种版本下下来。

    *运行在Andorid平板中DOSBox里面的模拟城市2000。千万不要以为这只是一款无聊的模拟游戏,其中蕴含着丰富的经济、政治、社会知识。首先你手握50万美元,来到一块荒地,要从无到有创建一个大都市。如何规划生活区、工业区、商业区,如何获得电力、自来水、处理污水垃圾,如何降低失业率、增加人口、增加税收,如何提高工业水平、获得稀有资源,所有这些都巧妙的串联在一起,让你在不经意之间学习到很多复杂的概念,比如:债券、贷款、税收、预算。

    刚开始还担心英文版以及复杂的预算变量小家伙接受不了,谁知道在拿到打印版的攻略之后,一夜之间徒弟就变师傅了,成天喊的我要盖城市变成了我要建伟大工程!识字这个技能树确实应该早点点开,这个要感谢爷爷。

    游戏玩的多了,某人开始问,这些游戏是哪里来的呢?

    我掩盖住兴奋的内心,故作镇定的回答:程序员写的。

    (等你问这个问题好多年啦!)

    于是“程序员”成了某人头脑里的神,终于有一天,某人问:“爸爸你能教我写程序么?”

    既然时机成熟,Ubuntu那台老机器又请了出来,Scratch1.4隆重出场。

    *Scratch是一种以控件为基本单位的编程语言,跟VB有点像,但是更简单,他把难记的关键词都换成了控件,除了精确的数字文本需要键盘,其他全部使用鼠标就可以完成,非常适合小朋友和初学者学习基础编程概念使用。

    不可轻视的点灯机器人,这里面都有函数的概念了亲,你还要什么自行车?

    *图中f1、f2,两个子程序,有的关卡是必不可少的哦。

    http://www.hustoj.com/lightbot.swf

    然后为了能让某人保持住对编程的向往,并用他喜欢的元素吸引他,我开始自学python,用python在MC里盖房子,来演示程序员的魔力!(看老爸给你露一手)

    *用python脚本,1秒就可以建出这么复杂的建筑,问你手工一个个方块搭建要多久?知道了这种技巧,你还愿意自己手工建房子么?

    并把源码托管在了github上,以备将来他自己学会Python大法的时候再来回顾。

    https://github.com/zhblue/mcpi

    (不过这个代码仅限树莓派或用复杂的私服插件,当然,学编程怎么能不买树莓派呢?)

    然后是各种MC的官方教程、攻略、红石,最后终于搭建了自己的私服。同期安利了关于客户端和服务的基础知识,即所谓的C/S架构。

    编程的路还很长……………………………………(PHP、Java在远处召唤~~)

    接下来该怎么走,我也常常在发呆的时候思索。

    要常常关注他最近感兴趣的点,然后找合适的有潜在理念的游戏给他玩。

    比如他假期看了《科学向未来》,每一集最后的疯狂大联动他感觉有趣。

    我就找古老的“不可思议的机器(dos版)”和“重返不可思议的机器(Win重制版)”给他玩。

    *不可思议的机器,the incredible machine,通过各种机械物理装置,拼装组合达到一个个设定目标的解密游戏,通关方法不止一种,可以看作是中学物理实验室的游戏版。

    忽然有一天,在朋友圈里看到了“海码爸爸”的推广信息

    于是就加了QQ群:361999832(这样说会不会有硬广的感觉?)

    发现了一群带有相似想法的家长和各位“船长”的网易云课堂。(不管了,强行安利)

    进群以后开始把玩过的游戏乱发了一通,骗了不少赞。

    群里大家的讨论也让我更有信心:从玩游戏到思考游戏背后的数学和逻辑,再到自己编程实现游戏;这一条路走下来,孩子就像打上了“减毒活疫苗”;到了大学里沉迷游戏的概率大大降低了,努力学习如何利用计算机知识制作游戏的概率大大提高了;那我们的目的也就达到了。

    值得高兴的是,某人在看过几次船长们的直播讲座后,终于从游戏少年正式走上了编程转型之旅,还幸运的得到了证书和神秘礼物。

    现在我们准备开始学python了,谢谢“海码爸爸”这个组织、这些热心人……^_^

    今天,群主方丈请我写点东西,于是就有了此文。

    2016-12-30