Grader on Windows with TC

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

ระบบมีสองส่วน คือส่วนที่เป็นระบบรับโปรแกรมบนเว็บ ซึ่งพัฒนาด้วยภาษา php บนระบบฐานข้อมูล MySQL และส่วนที่เป็นโปรแกรมทำงานที่เซิร์ฟเวอร์สำหรับตรวจโปรแกรม โดยจะเรียก Turbo C หรือ Borland C มาคอมไพล์และตรวจผลลัพธ์โปรแกรม

การติดตั้งโปรแกรม

ก่อนติดตั้งในเครื่องควรมีโปรแกรมเอดิเตอร์ที่มีประสิทธิภาพ และสามารถเปิดแฟ้มที่สร้างจากระบบ unix ได้ ตัวอย่าง เช่น Notepad++, jEdit เป็นต้น

ระบบฐานข้อมูลและเว็บเซิร์ฟเวอร์

ระบบตรวจที่พัฒนาขึ้นใช้ระบบฐานข้อมูล MySQL และพัฒนาด้วยภาษา php สามารถติดตั้งระบบดังกล่าวได้โดยอาจใช้โปรแกรม AppServ ที่รวมโปรแกรมที่จำเป็นไว้แล้ว หรืออาจจะติดตั้งโดยตรงก็ได้

การติดตั้งระบบฐานข้อมูลและเว็บเซิร์ฟเวอร์โดยใช้ AppServ

AppServ เป็นระบบที่รวม Apache Web Server, PHP, MySQL และ PHPMySQLAdmin สำหรับติดตั้งในโปรแกรมเดียว เว็บดังกล่าวมีหน้าที่เป็นภาษาไทย ให้เลือกภาษาจากกล่องเลือกทางด้านขวา

1. ดาวน์โหลดและติดตั้ง AppServ 2.5.9 จาก sourceforge ให้บันทึกไดเร็กทรอรีที่ติดตั้งไว้ด้วย (ถ้าทำตามค่าปกติ จะติดตั้งที่ C:\AppServ

จากนั้น AppServ จะถามข้อมูลที่ต้องใช้ในการติดตั้งแต่ละส่วนดังนี้

  • ในการติดตั้งสำหรับ Apache ต้องระบุ Server Name และ Administrator's Email Address ให้ระบุลงไปอย่างไรก็ได้
  • จากนั้นในส่วนของการติดตั้ง MySQL จะมีหน้าต่างที่ถาม root password ให้กรอกและบันทึกไว้ด้วย ให้สังเกตด้วยว่าได้เลือก Character Sets and Collations เป็น UTF-8 Unicode แล้ว

เมื่อติดตั้งเสร็จโปรแกรมติดตั้งจะถามว่าจะเริ่มการทำงานของ Apache และ MySQL หรือไม่ ให้คลิ๊กเลือกทั้งสองโปรแกรม

2. เมื่อติดตั้งแล้ว ถ้าทดลองเรียก http://localhost/ จะพบหน้าเริ่มต้นของ AppServ

โครงสร้างไดเร็กทรอรีที่ได้จะเป็นดังนี้ (ดูรายละเอียดเพิ่มเติม)

C:\AppServ
 |
 +-- Apache2.2
 +-- MySQL
 +-- php5
 \-- www
      |
      \-- phpmyadmin

ไดเร็กทรอรี www จะเป็นที่จะติดตั้งระบบรับโปรแกรมของผ่านเว็บ

ทั้งโปรแกรม Apache และ MySQL จะทำงานให้บริการ การเปิด/ปิด หรือเรียกติดตั้งสามารถทำได้จากเมนูของโปรแกรม AppServ

การติดตั้งระบบฐานข้อมูลและเว็บเซิร์ฟเวอร์โดยตรง

ในส่วนนี้ยังมีข้อมูลไม่เรียบร้อย

1. ติดตั้ง MySQL

ติดตั้ง MySQL Community Server 5.0 โดยเลือกติดตั้งหัวข้อ Windows Essentials

2. ติดตั้ง Apache Webserver

ติดตั้ง Apache Http Server โดยเลือกติดตั้ง แฟ้มติดตั้งนี้

การสร้างฐานข้อมูลของระบบรับโปรแกรมผ่านทางเว็บ

ในการสร้างฐานข้อมูลและผู้ใช้บนระบบฐานข้อมูล MySQL จะกระทำผ่านทาง phpMyAdmin

1. เรียกใช้ phpMyAdmin โดยเข้าทาง http://localhost/phpmyadmin จากนั้นระบบจะถามผู้ใช้และรหัสผ่าน ให้ป้อน root และรหัสผ่านที่ตั้งไว้ในตอนต้น

2. สร้างบัญชีผู้ใช้ของระบบฐานข้อมูลชื่อ posn (หรือชื่ออื่นก็ได้) โดยเลือกลิงก์ "Privileges" => "Add a new User"

จากนั้นป้อน User name และรหัสผ่าน พร้อมทั้งเลือกตัวเลือก "Create database with same name and grant all privileges" ในส่วนของ "Database for user" เพื่อสร้างฐานข้อมูลของผู้ใช้โดยอัตโนมัติ เมื่อเลือกเสร็จแล้ว ให้กด "Go" เพื่อทำงาน

เมื่อเสร็จแล้วให้ log out ออกจาก phpMyAdmin (เลือก 'exit' ไอคอนที่เมนูด้านซ้ายบน) แล้วให้เข้าสู่ระบบอีกครั้งด้วยบัญชีผู้ใช้ posn ที่ได้สร้างไว้

3. ขั้นตอนต่อไปจะเป็นการสร้างตารางสำหรับระบบรับโปรแกรม ให้ดาวน์โหลดแฟ้ม posn_init_db.sql ที่เก็บคำสั่งสำหรับสร้างตารางมา

จากนั้นให้เลือกฐานข้อมูล posn จากรายการฐานข้อมูลด้านซ้าย จากนั้นเลือก Import แล้วเลือกแฟ้มดังกล่าวในช่อง "Location of the text file" ในกลุ่ม "File to import" แล้วกด "Go"

4. เมื่อทำเสร็จจะเห็นรายการตารางปรากฏในฐานข้อมูล posn จำนวนทั้งสิ้น 6 ตาราง หนึ่งในตารางนั้น ตาราง user_info ที่เก็บข้อมูลผู้ใช้จะมีข้อมูลเริ่มต้นอยู่ โดยจะมีข้อมูลของผู้ใช้ root และมีรหัสผ่านเริ่มต้น ให้เข้าไปแก้รหัสผ่านใหม่ีเพื่อความปลอดภัย ก่อนที่จะดำเนินการอื่น ๆ ต่อไป

ระบบรับโปรแกรมผ่านทางเว็บ

1. ดาวน์โหลด posn-web.zip จากนั้น unzip ลงในไดเร็กทรอรี www ของ AppServ (เช่น c:\AppServ\www) หรือในไดเร็กทรอรีที่ต้องการใส่โปรแกรม

ขณะนี้อยู่ระหว่างการปรับปรุงครับ ให้ลอง checkout จาก http://code.google.com/p/fossil-grader/ ก่อนนะครับ จะรีบใส่ไฟล์ชุดใหม่เร็ว ๆ นี้ครับ ขออภัยด้วยครับ

2. แก้แฟ้ม config.php ดังนี้

  • แก้ส่วนข้อมูลของการติดต่อฐานข้อมูล
//for MySQL
define("MYSQL_USER","posn");              # ชื่อ database user ที่สร้างไว้
define("MYSQL_PASSWD","posnpassword");    # ใส่รหัสผ่าน
define("MYSQL_DATABASE","posn");          # ชื่อ database

3. ทดลองเข้าใช้ทาง http://localhost/ แล้วเข้าสู่ระบบด้วยบัญชีผู้ใช้ root (และรหัสผ่านที่เปลี่ยนไปในฐานข้อมูล)

โปรแกรมตรวจ

โครงสร้างไดเรกทรอรีของโปรแกรมตรวจ

grader
 \-- ev
 \-- test
 \-- test-res
 \-- src

การคอมไพล์โปรแกรมตรวจ

ลง Dev C++ (4.9.9.2), ตั้ง include paths, แก้ compiler options เพิ่ม -D ON_WINDOWS, ลง libmysql DevPak (เลือก Tools -> Check for Updates/Packages)

การตั้งค่าเริ่มต้น

การสร้างบัญชีผู้ใช้

การเพิ่มโจทย์

การใช้งาน

รายละเอียดเพิ่มเติม

โครงสร้างฐานข้อมูล

ตารางและคอลัมน์ต่าง ๆ มีดังนี้

TABLE: user_info  ตารางผู้ใช้
COLUMNS:
  user_id  varchar(10)  รหัสประจำตัวผู้ใช้
  name     varchar(100) ชื่อ
  passwd   varchar(10)  รหัสผ่าน
  grp      varchar(10)  รหัสกลุ่ม (หรือศูนย์)
  type     char(1)      ประเภทผู้ใช้:
                          'C' คือผู้เข้าแข่งขัน (contestant) 
                          'S' คืออาจารย์ผู้ดูแลกลุ่ม (supervisor) และ 
                          'A' คือผู้ดูแลระบบ
TABLE: prob_info  ตารางปัญหา
COLUMNS:
  prob_id      varchar(10)   รหัสปัญหา
  name         varchar(100)  ชื่อปัญหา
  avail        char(1)       เปิดให้ส่ง ('Y' หรือ 'N')
  prob_order   int(10)       ลำดับในการแสดงผล ปัญหาจะแสดงตาม prob_order จากน้อยไปมาก
TABLE: submission  ตารางเก็บโปรแกรมที่ส่ง
COLUMNS:
  user_id  varchar(10)  
  prob_id  varchar(10)  
  sub_num  int(11)      หมายเลขของการส่ง (ส่งครั้งที่) นับสำหรับผู้ใช้และปัญหานี้ เริ่มจาก 1
  time     datetime     
  code     mediumtext   ซอร์สโปรแกรมที่ส่ง
PRIMARY KEY: (`user_id`,`prob_id`,`sub_num`)
TABLE: grd_queue  คิวรอการตรวจ
COLUMNS:
  q_id     int(10)      
  user_id  varchar(10)  
  prob_id  varchar(10)  
  sub_num  int(10)      
TABLE: grd_status  สถานะของการตรวจ
COLUMNS:
  user_id       varchar(10) 
  prob_id       varchar(10)
  res_id        int(10)      รหัสสถานะ ดูตาราง res_desc
  score         int(10)      
  grading_msg   varchar(50)  ข้อความจากการตรวจ (แสดงเป็นสตริงของอักษร P, -, x, และ T)
  compiler_msg  text         ข้อความจาก compiler
PRIMARY KEY: (`user_id`,`prob_id`)

ตารางประกอบ

TABLE: res_desc
COLUMNS:
  res_id     int(10)      
  res_text   varchar(45)  
DATA: 
  (1,'in queue'),
  (2,'grading'),
  (3,'accepted'),
  (4,'rejected');