来源:http://blog.csdn.net/xiajian2010/article/details/12954855
缘起
大四了,快毕业了,所以想准备点LAMP的知识和经验。刚好实验室里有人在搞Hustoj,于是我就搞了个下午。(6个月后)临近毕业了,还有一个多月,之前搞的Hustoj其实没有安装成功,当时也没在意,就没修改,后来看别人安装成功了,就请教并操作了一番,从而将博客补全。
正文
1. Hustoj简介
HustOj是一个开源的的在线评测系统,其官方网站是http://code.google.com/p/hustoj/,更多详细介绍参考项目主页。
主要开发人员的博客为:http://blog.csdn.net/zhblue/article/details/7259940
2. Hustoj安装
系统配置:Ubuntu 12.10 桌面版+HP的PC机(4GB内存,双核处理器)
安装前必看README和FAQ,README中的安装介绍的两种方法,一种是下载install安装包自动安装,一种是下载源代码手动配置安装。其实,自动安装比手动多了一个签出代码的过程。
采用的自动安装,这里觉得REMDME中有点问题,就是自动安装的过程中并不会修改/etc/php5/apache2/php.ini文件,可能是我自己会错意了。
上次安装的时候,使用官方提供的install安装包。下载包位置为下图中install.rxxx.tar.gz.
使用ubuntu的归档文件软件解压或者使用命令行解压,当然也可使用命令行解压:
- <span style="font-size:18px;">tar zxf install.r2119.tar.gz
- cd install</span>
这次再次安装采用的是官方提供的更加简单的方法:
- <span style="font-size:18px;">svn checkout http://hustoj.googlecode.com/svn/trunk/install hustoj
- cd hustoj</span>
此时,编辑其中的install文件,修改如下两个关于数据库的设置:
- <span style="font-size:18px;">DBUSER=root #数据库用户名
- DBPASS=root #数据库密码</span>
将涉及yum命令的第18,19行注释调,这里是为了方便RedHat用户使用而设置的命令。
然后,运行/install.sh 或 ./install-interactive.sh,不要以root权限运行,这样会使签出的hustoj-read-only的用户权限为root,从而不太方便编辑。
签出的hustoj-read-only的目录如下:
- android/ 不知有何用处
- core/ hustoj的核心部分
- install/ 安装文件目录
- .svn/ 版本库的文件
- web/ 该目录和WEBBASE变量中JudgeOnline文件相同,但调整了一下结构。
安装完成后,可以发现看到系统中多了一个用户judge,然而此时,这个用户是不能够使用的,需要设置起密码,命令:sudo passwd judge。
此时,如果在浏览器中输入http://localhost/JudgeOnline/,可以看到如下的错误:
Could not connect: Access denied for user 'root'@'localhost' (using password: NO)
查看FAQ知道,这是数据库没有设置好。
cd /var/ww/JudgeOnline/include
编辑db_info.inc.php文件中,将如下的数据库的账号设置为真实可用的账号。
- <span style="font-size:18px;">static $DB_USER="root";
- static $DB_PASS="root";</span>
此外,查看并编辑judge用户主目录下的etc文件夹下的judge.conf文件,修改其中的数据库配置:
- <span style="font-size:18px;">OJ_USER_NAME=root #数据库用户名
- OJ_PASSWORD=root #数据库密码</span>
注:可以看到Hostoj数据库用户和密码的命名比较混乱,三个文件三个叫法。
修改上述文件后,可以打开hostoj的网站了:
创建管理员
insert into privilege(user_id,rightstr) values('zhblue','administrator');
zhblue 为需要加管理员权限的帐号
这里,使用的phpadmin执行sql语句,非常的方便。
普通登录后访问http://127.0.0.1/JudgeOnline/admin,界面如下:
首先,单击FreeProblemSet从而下载一些问题集,其次导入问题集,这里使用一个简单的A+B的问题作为测试。
在查看问题状态时,看到如下的界面:
查看了官方的FAQ说是本地编译器安装的问题,要安装glibc-static,自己下载了源码包没有能安装的上,心想,算了,以后再说吧。下面介绍一下Glibc。
3.Glibc
3.1包含的程序
catchsegv, gencat, getconf, getent, glibcbug, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, nscd_nischeck, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump 和 zic
具体说明
catchsegv当程序发生segmentation fault的时候, 用来建立一个堆栈跟踪(a stack trace)
gencat
建立消息目录
getconf
针对文件系统的指定变量显示其系统设置值
getent
从系统管理数据库获取一个条目
glibcbug
建立一个对glibc的bug报告并且email到bug报告的邮件地址
iconv
转化字符设置.
iconvconfig
建立对iconv模块的快速读取设置文件
ldconfig
设置对动态链接库的实时绑定, 这个命令非常有用,在安装了新的库之后要运行这个命令来在系统中登记这个新库,否则装了也是白装.
ldd
列出每个程序或者命令需要的共享库
lddlibc4
辅助add操作object目标文件.
locale
是一个perl程序, 可以叫编译器对内嵌操作是否开启POSIX locales.
localedef
编译locale的设置.
mtrace
列印从源到其接收者的多点路径.
nscd
提供对通用名称调用的缓存的守护进程
nscd_nischeck
检查在对NIS+侦查的时候是否需要安全模式
pcprofiledump
打印PC profiling产生的信息
pt_chown
根据主虚拟终端给出的文件文件描述符'3'设置对子虚拟终端的所有者,组及存取权限. 帮助grantpt的运行. 不能直接从命令行运行.
rpcgen
生成执行RPC协议的C代码
rpcinfo
对RPC服务器产生一个RPC呼叫.
sln
是从目标文件到源的静态字符联接. 在动态链接不起作用的时候sln可以建立对库的静态联接.
sprof
读取并显示共享目标的特征描述数据
tzselect
对用户提出关于当前位置的问题,并输出时区信息到标准输出.
xtrace
通过打印当前执行的函数跟踪程序执行情况
zdump
显示时区.
zic
时区编译器.
3.2 包含的库文件
ld.so, libBrokenLocale.[a,so], libBrokenLocale_p.a, libSegFault.so, libanl.[a,so], libanl_p.a, libbsd-compat.a, libc.[a,so], libc_nonshared.a, libc_p.a, libcrypt.[a,so], libcrypt_p.a, libdl.[a,so], libdl_p.a, libg.a, libieee.a, libm.[a,so], libm_p.a, libmcheck.a, libmemusage.so, libnsl.a, libnsl_p.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libpthread_p.a, libresolv.[a,so], libresolv_p.a, librpcsvc.a, librpcsvc_p.a, librt.[a,so], librt_p.a, libthread_db.so, libutil.[a,so] and libutil_p.a
具体说明
ld.so
帮助动态链接库的执行.
libBrokenLocale, libBrokenLocale_p
帮助程序处理破损locale, 如:mozilla
libSegFault
处理segmentation fault信号. 会试图找出segmentation fault
libanl, libanl_p
异步名称查询库.
libbsd-compat
为了执行一些linux程序,libbsd-compat提供了必要的可移植性.
libc, libc_nonshared, libc_p
这些C库是一些程序通用的函数集。这样就可以保证程序员不用为了他的每一个单独的任务重复写相同的函数。最常见的情况是象向屏幕输出一个字符串的程序已经可以由程序员随意调用了。
C 库(事实上几乎每个库)都有两种格式:动态的和静态的。简而言之,当程序调用静态的C库时,C库中的代码会拷贝到执行文件中。当程序使用动态C库时,可执 行文件不会包含C库中的代码。而是在程序运行时动态加载不要的库函数。这就意味着可以明显地减小程序文件的大小。C库中包含的文档描述得更详细些,在这里 只用一两行去明确地解释这些复杂知识是不现实的。
libcrypt, libcrypt_p
有关加密编码
libdl, libdl_p
动态联接界面.
libg
g++运行需要的库.
libieee
IEEE动态指针库.
libm, libm_p
数学函数库.
libmcheck
包括了起动时需要运行的代码.
libmemusage
帮助memusage搜集程序内存使用的信息
libnsl, libnsl_p
网络服务库.
libnss_compat, libnss_dns, libnss_files, libnss_hesiod, libnss_nis, libnss_nisplus
在不同的模块中加入存取数据库的不同的服务,有如下的好处:
添加新服务而不用改动GNU C库,
这些模块可以单独升级
C库会比较小.
libpcprofile
帮助内核跟踪在函数, 源码行和命令中CPU使用时间
libpthread, libpthread_p
POSIX线程库
libresolv, libresolv_p
创建,发送及解释到互联网域名服务器的数据包.
librpcsvc, librpcsvc_p
提供RPC的其他服务.
librt, librt_p
提供了大部分的POSIX.1b实时扩展的给定界面
libthread_db
对建立多线程程序的调试很有用
libutil, libutil_p
包含了在很多不同的Unix程序中使用的"标准"函数.
4. 一些问题
执行脚本install.sh时,遇到一个问题yum没有安装,yum(全称为Yellow dog Updater, Modified),在百科和wikipedia中都有介绍。yum和rpm的关系与apt 和dpkg的关系类似,都是包管理软件,yum主要由SUSE和RedHat使用,apt主要在Ubuntu和Debian中用的比较多,其功能相似。安装了yum后,发现isntall.sh脚本中依然会出现:No package php available,我想大概是在Ubuntu系统中没有配置Yum的软件源的问题。
后记
怕麻烦而没有自己动手去配置Hustoj,不是优点的说。6个月后,再一次看Hustoj的界面丑死了,尤其是那个后台管理,不符合我的美学观点。
改以前写的博客,感觉以前好菜啊。
参考资料
1.Hustoj的官方网站:http://code.google.com/p/hustoj/
2.http://blog.sina.com.cn/s/blog_4f3b79d0010107o2.html
3.Glibc:http://docs.huihoo.com/lfs/lfs-4.0/chapter06/glibc.html