Sistema de juez automático para competencias de programación desarrollado en PHP. Permite la evaluación automática de código fuente en múltiples lenguajes de programación.
Este sistema fue desarrollado como Trabajo Especial de Grado para optar al título de Ingeniero en Informática por:
Leonardo Meléndez
Universidad Politécnica Territorial del Estado Portuguesa "Juan de Jesús Montilla" Acarigua, Estado Portuguesa, Venezuela
- Características
- Requisitos del Sistema
- Instalación
- Configuración
- Estructura del Proyecto
- Uso del Sistema
- Lenguajes Soportados
- API del Juez
- Solución de Problemas
- Contribuir
- Licencia
- Juez automático para evaluación de código en tiempo real
- Múltiples lenguajes: C, C++, Java, Python 3, JavaScript, PHP, SQL
- Sistema de concursos con tiempos de congelamiento y descongelamiento
- Módulo de entrenamiento para práctica individual
- Gestión de equipos e instituciones
- Sistema de clarificaciones durante concursos
- Rankings en tiempo real (público y jurado)
- Panel de administración completo
- Sistema de notificaciones
- Chat integrado
- Reportes en PDF
- Auditoría completa de acciones
| Software | Versión Mínima | Recomendado |
|---|---|---|
| PHP | 7.4+ | 8.1+ |
| MariaDB/MySQL | 10.3+ / 5.7+ | 10.11+ / 8.0+ |
| Apache | 2.4+ | 2.4+ |
| GCC | 9+ | 11+ |
| G++ | 9+ | 11+ |
| Python | 3.8+ | 3.11+ |
| Node.js | 14+ | 18+ |
| Java JDK | 11+ | 17+ |
php-mysqli
php-gd
php-mbstring
php-xml
php-curl
php-json- CPU: 2 cores
- RAM: 2 GB
- Disco: 10 GB libres
- CPU: 4+ cores
- RAM: 8+ GB
- Disco: 50+ GB SSD
# Clonar el repositorio
git clone https://github.com/webmasterscity/juez.com.ve.git
cd juez.com.ve
# Ejecutar script de instalación
chmod +x install.sh
sudo ./install.shgit clone https://github.com/webmasterscity/juez.com.ve.git
cd juez.com.ve# Actualizar repositorios
sudo apt update
# Instalar Apache, PHP y extensiones
sudo apt install -y apache2 php php-mysqli php-gd php-mbstring php-xml php-curl libapache2-mod-php
# Instalar MariaDB
sudo apt install -y mariadb-server mariadb-client
# Instalar compiladores y lenguajes
sudo apt install -y gcc g++ default-jdk python3 nodejs npm# Iniciar y habilitar MariaDB
sudo systemctl start mariadb
sudo systemctl enable mariadb
# Configuración segura (establecer contraseña root)
sudo mysql_secure_installation
# Crear la base de datos
mysql -u root -p < ovi_database.sql# Copiar archivos al directorio web
sudo cp -r . /var/www/html/juez
# Configurar permisos
sudo chown -R www-data:www-data /var/www/html/juez
sudo chmod -R 755 /var/www/html/juez
sudo chmod -R 777 /var/www/html/juez/archivos
# Habilitar mod_rewrite
sudo a2enmod rewrite
# Reiniciar Apache
sudo systemctl restart apache2Crear archivo /etc/apache2/sites-available/juez.conf:
<VirtualHost *:80>
ServerName juez.local
DocumentRoot /var/www/html/juez
<Directory /var/www/html/juez>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/juez_error.log
CustomLog ${APACHE_LOG_DIR}/juez_access.log combined
</VirtualHost># Habilitar el sitio
sudo a2ensite juez.conf
sudo systemctl reload apache2Editar el archivo modelo/class_db.php:
public $dns="localhost", // Host de la base de datos
$usuario="ovi", // Usuario de la base de datos
$password="tu_password", // Contraseña de la base de datos
$db="ovi"; // Nombre de la base de datosEditar el archivo chat/includes/config.php:
define('DB_SERVER','localhost');
define('DB_USERNAME','tu_usuario');
define('DB_PASSWORD','tu_password');
define('DB_NAME','ovi');El servidor de juez se encarga de compilar y ejecutar el código enviado. Se configura en la base de datos en la tabla servidor:
INSERT INTO servidor (nombre_servidor, active, polltime)
VALUES ('juez-local', 1, 5);# Directorio para archivos subidos
chmod -R 777 archivos/
# Directorio para fotos de perfil
chmod -R 777 archivos/fotos_usuarios/
# Directorio para problemas
chmod -R 777 archivos/problemas/
# Directorio para imágenes de noticias
chmod -R 777 images/noticia/juez.com.ve/
├── modelo/ # Clases de modelos (ORM básico)
│ ├── class_db.php # Conexión a base de datos
│ ├── class_usuario.php
│ ├── class_problema.php
│ ├── class_envio.php
│ └── ...
├── control/ # Controladores
│ ├── control_usuario.php
│ ├── control_concurso.php
│ └── ...
├── vista/ # Vistas y templates
│ ├── campo/ # Campos de formulario
│ └── ...
├── libreria/ # Librerías de terceros
│ ├── bootstrap/
│ ├── jquery/
│ ├── codemirror/
│ └── ...
├── chat/ # Sistema de chat integrado
├── reporte/ # Generación de reportes PDF
├── js/ # JavaScript personalizado
├── css/ # Estilos CSS
├── images/ # Imágenes del sistema
├── archivos/ # Archivos subidos
├── error/ # Páginas de error
├── index.php # Punto de entrada principal
├── intranet.php # Panel de administración
├── servidor # Servidor de juez (daemon)
├── ovi_database.sql # Script de base de datos
├── install.sh # Script de instalación
└── .htaccess # Configuración de Apache
| Tipo | Descripción | Permisos |
|---|---|---|
| Administrador | Control total del sistema | Todos |
| Juez | Gestión de problemas y concursos | Crear/editar problemas, juzgar |
| Participante | Competidores | Enviar código, ver resultados |
| Colaborador | Ayudantes | Permisos limitados |
| Nuevo | Usuarios recién registrados | Solo lectura |
Cédula: V12345678
Nombre: Admin Sistema
Tipo: Administrador
Nota: Cambiar la contraseña después de la primera instalación.
- Crear concurso: Definir nombre, tiempos de inicio/fin/congelamiento
- Agregar problemas: Asociar problemas al concurso
- Registrar equipos: Inscribir equipos participantes
- Iniciar concurso: El sistema activa automáticamente según horario
- Recibir envíos: Los equipos envían soluciones
- Juzgamiento automático: El servidor evalúa los envíos
- Ver rankings: Tabla de posiciones en tiempo real
- Finalizar: El sistema calcula posiciones finales
- Ir a Problemas > Crear Problema
- Completar:
- Nombre del problema
- Límite de tiempo (segundos)
- Límite de memoria (MB)
- Enunciado (HTML o imagen)
- Agregar casos de prueba:
- Input esperado
- Output esperado
- Marcar si es ejemplo visible
- Seleccionar lenguajes permitidos
- Activar el problema
| Lenguaje | Extensiones | Compilador/Intérprete | Factor Tiempo |
|---|---|---|---|
| C | .c |
gcc | 1.0x |
| C++ | .cpp, .cc, .cxx |
g++ | 1.0x |
| Java | .java |
javac/java | 2.0x |
| Python 3 | .py |
python3 | 3.0x |
| JavaScript | .js |
node | 2.0x |
| PHP | .php |
php | 2.0x |
| SQL | .sql |
psql | 1.0x |
INSERT INTO lenguaje_prog (nombre, extensiones, factor_tiempo, comando, estatus)
VALUES ('Ruby', 'rb', 2.50, 'ruby', 1);| Código | Mensaje | Descripción |
|---|---|---|
| 1 | ACCEPTED | Respuesta correcta |
| 2 | WRONG ANSWER | Respuesta incorrecta |
| 3 | TIME LIMIT EXCEEDED | Tiempo excedido |
| 4 | RUNTIME ERROR | Error en ejecución |
| 5 | COMPILATION ERROR | Error de compilación |
| 6 | MEMORY LIMIT EXCEEDED | Memoria excedida |
| 7 | PRESENTATION ERROR | Error de formato |
| 8 | PENDING | Pendiente |
| 9 | JUDGING | En evaluación |
1. Usuario envía código
2. Sistema guarda en tabla `envio`
3. Servidor de juez detecta envío pendiente
4. Compila el código (si aplica)
5. Ejecuta con cada caso de prueba
6. Compara salida con salida esperada
7. Actualiza resultado en base de datos
8. Usuario ve resultado
# Verificar que MariaDB está corriendo
sudo systemctl status mariadb
# Verificar credenciales en modelo/class_db.php
# Probar conexión manual
mysql -u usuario -p nombre_bd# Restablecer permisos
sudo chown -R www-data:www-data /var/www/html/juez
sudo chmod -R 755 /var/www/html/juez
sudo chmod -R 777 /var/www/html/juez/archivos# Ver logs de Apache
sudo tail -f /var/log/apache2/error.log
# Habilitar errores en desarrollo
# En php.ini:
display_errors = On
error_reporting = E_ALL# Verificar que el servidor de juez está activo
# En la base de datos:
SELECT * FROM servidor WHERE active = 1;
# Verificar permisos de ejecución
ls -la servidor
chmod +x servidor# Verificar encoding de la base de datos
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set%';"
# La base de datos debe usar utf8mb4
ALTER DATABASE ovi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;- Fork el repositorio
- Crear una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Agregar nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Crear un Pull Request
- Usar indentación con tabs
- Comentarios en español
- Nombres de variables descriptivos
- Seguir la estructura MVC existente
Leonardo Meléndez
- Ingeniero en Informática
- Universidad Politécnica Territorial del Estado Portuguesa "Juan de Jesús Montilla"
- Acarigua, Estado Portuguesa, Venezuela
Este proyecto fue desarrollado como Trabajo Especial de Grado (Tesis) para optar al título de Ingeniero en Informática, con el objetivo de crear una plataforma que fomente la programación competitiva en instituciones educativas de Venezuela.
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
- Repositorio: https://github.com/webmasterscity/juez.com.ve
- Issues: https://github.com/webmasterscity/juez.com.ve/issues
Desarrollado con PHP para la comunidad de programación competitiva en Venezuela y Latinoamérica.