การติดตั้ง Cafe grader/กรุ

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

บทความนี้จะอธิบายการติดตั้ง Cafe grader ขั้นตอนดังกล่าวยังไม่รวมถึงการเพิ่มโจทย์และการใช้งานอื่น ๆ สำหรับเนื้อหาในส่วนดังกล่าวจะเขียนเพิ่มเร็ว ๆ นี้

ขั้นตอนการติดตั้งจะแบ่งออกเป็นสองส่วน คือส่วนเว็บ และส่วนตัวตรวจ อย่างไรก็ตาม ทั้งสองส่วนยังมีการใช้ซอฟต์แวร์หลายอย่างร่วมกัน โดยจะเรียกรวม ๆ ว่าเป็นซอฟต์แวร์ที่จำเป็น เราจะเน้นการติดตั้งบน Ubuntu/Debian เป็นหลัก

เอกสารนี้เขียนสำหรับการติดตั้งบน Rails 2.3.4 (ถ้ามีรุ่นใหม่กว่านี้จะทยอยปรับปรุงต่อไป)

ในการเขียนบางจุดอาจมีรายละเอียดมากไป สำหรับผู้เชี่ยวชาญสามารถอ่านข้ามไปได้

การติดตั้งซอฟต์แวร์ที่จำเป็น

เราจะติดตั้ง Ruby, Rails (เป็นเว็บเฟรมเวิร์คที่ใช้ในการพัฒนา cafe grader), และ Subversion ซึ่งเป็นระบบจัดการเวอร์ชันของซอฟต์แวร์ (ใช้ในการโหลดระบบ cafe grader)

ติดตั้งระบบฐานข้อมูล MySQL, ระบบจัดการเวอร์ชัน Subversion

ติดตั้ง MySQL โดยสั่ง

 sudo apt-get install mysql-server mysql-client

ระหว่างติดตั้ง ระบบจะถาม password ของ root ของ mysql server ให้เลือกและจดไว้ (จะต้องใช้ต่อไปในการสร้าง user ของระบบฐานข้อมูล)

เราจะใช้ subversion ในการโหลดรุ่นล่าสุดของ Cafe grader มาติดตั้ง ดังนั้นสั่งติดตั้ง subversion ดังนี้

 sudo apt-get install subversion

ติดตั้ง Ruby, ระบบจัดการแพกเกจ Ruby Gem, Rails, และไลบรารีอื่น ๆ

Cafe grader พัฒนาด้วยภาษา Ruby ดังนั้นเราจะต้องติดตั้ง Ruby พร้อมทั้งระบบต่าง ๆ ก่อน

เริ่มติดตั้ง ruby และระบบจัดการ document rdoc โดยสั่ง

 sudo apt-get install ruby rdoc

จากนั้นให้ติดตั้ง Ruby gems ซึ่งเป็นระบบจัดการไลบรารีและซอฟต์แวร์ต่าง ๆ ของ Ruby แม้ว่าใน Ubuntu จะสามารถเรียกติดตั้งได้ด้วย apt-get แต่มักพบว่าการติดตั้งด้วยวิธีนี้มักพบปัญหา ดังนั้นเราจะติดตั้งโดยตรง ตามขั้นตอนต่อไปนี้

  • ดาวน์โหลด Ruby gems จาก RubyForge
  • จากนั้นให้ขยายไฟล์ใส่ในไดเร็กทอรีชั่วคราว แล้วสั่ง
 sudo ruby setup.rb

เราจะได้ ruby gem ที่เรียกให้ทำงานได้โดยคำสั่ง gem1.8 อย่างไรก็ตามเพื่อความสะดวก เราทำให้เรียกด้วยคำสั่ง gem ได้ด้วย โดยสั่ง

 sudo ln -s /usr/bin/gem1.8 /usr/bin/gem

(ไม่ต้องทำในขั้นตอนนี้ก็ได้ แต่ในลำดับต่อไปให้เรียก gem1.8 แทน gem)

เมื่อได้ Ruby และ Ruby gems แล้ว เราจะติดตั้ง software ต่าง ๆ ที่ต้องการ ต่อไปนี้

  • Rails (เว็บเฟรมเวิร์ค), ติดตั้งโดยสั่ง
 sudo gem install rails --no-rdoc --no-ri
  • Rspec (ระบบทดสอบการทำงาน), ติดตั้งโดยสั่ง
 sudo gem install rspec --no-rdoc --no-ri
  • ไลบรารีของ ruby ในการติดต่อกับ mysql, ติดตั้งโดยสั่ง
 sudo apt-get install libmysql-ruby
  • ไลบรารีในการเชื่อมต่อแบบปลอดภัยของ ruby
 sudo apt-get install libopenssl-ruby
  • ไฟล์ประกอบในการคอมไพล์ไลบรารีต่าง ๆ ของ ruby
 sudo apt-get install ruby1.8-dev

การติดตั้งส่วนติดต่อทางเว็บ

เราจะเริ่มโดยการสร้าง user บน mysql และ database

สร้างฐานข้อมูลบน MySQL

เราจะสร้างผู้ใช้และฐานข้อมูลบน Mysql เข้าใช้ mysql โดยสั่ง

 mysql -u root -p

และป้อนรหัสผ่านที่ได้กำหนดไว้ในขั้นแรก

เมื่อเข้ามาใน mysql แล้ว สั่งให้สร้าง user ในตัวอย่างนี้จะใช้ชื่อว่า cafe อย่าลืมเปลี่ยน mypassword ด้านล่างให้เป็นรหัสผ่านที่ต้องการ

 create user 'cafe'@'localhost' identified by 'mypassword';

สร้างฐานข้อมูลชื่อ grader

 create database grader;

ให้สิทธิผู้ใช้ cafe ในการทำทุกอย่างในฐานข้อมูล grader

 grant all on grader.* to 'cafe'@'localhost';

เมื่อเรียบร้อยแล้วให้ออกจาก mysql โดยสั่ง quit

Check out cafe grader และปรับแต่ง

เราจะติดตั้งส่วนติดต่อทางเว็บที่ ~/grader/web ถ้าต้องการติดตั้งที่อื่นให้แก้ขั้นตอนต่อไปตามเหมาะสม

ก่อนอื่นสร้างไดเร็กทอรี ~/grader ก่อน

 mkdir grader

จากนั้น check out cafe grader จาก google code

 svn checkout http://cafe-grader.googlecode.com/svn/web/trunk grader/web

โปรแกรมส่วนติดต่อกับผู้ใช้ทางเว็บจะถูกดาวน์โหลดมาที่ ~/grader/web

เราจะเข้าไปปรับแก้แฟ้มต่าง ๆ โดยแฟ้มเหล่านี้อยู่ในไดเร็กทอรี ~/grader/web/config

  • ให้คัดลอกแฟ้ม database.yml.SAMPLE เป็น database.yml แฟ้มดังกล่าวจะเก็บข้อมูลเกี่ยวกับการเชื่อมต่อกับฐานข้อมูล เราจะแก้ไข โดยใส่ชื่อฐานข้อมูล, ชื่อผู้ใช้, และรหัสผ่าน ให้ใส่ทั้งส่วน development และส่วน production ดังตัวอย่างด้านล่างนี้ (ส่วน production ให้ใส่ลักษณะเดียวกัน)
 development:
   adapter: mysql
   database: grader
   username: cafe
   password: mypassword
   host: localhost

ส่วน development เราจะใช้เพื่อทดสอบว่าระบบทำงานได้ เมื่อใช้งานจริง เราจะใช้ในส่วน production

  • ให้คัดลอกแฟ้ม environment.rb.SAMPLE เป็น environment.rb แฟ้มดังกล่าวจะเก็บการตั้งค่าต่าง ๆ ในเบื้องต้นนี้เราจะยังไม่แก้ไขอะไร อย่างไรก็ตาม หากต้องการ web interface ภาษาไทย ให้แก้ส่วน locales เป็น ภาษาไทยดังด้านล้าง
 # Setting locales
 config.i18n.default_locale = 'th'

จากนั้นเราจะติดตั้งไลบรารีอื่น ๆ ของ ruby ที่ cafe grader ต้องการ โดยสั่ง (สั่งที่ไดเร็กทอรีที่ติดตั้งส่วน web ของ cafe grader --- ในตัวอย่างนี้คือ ~/grader/web)

 sudo rake gems:install

ใส่ข้อมูลเบื้องต้นลงในฐานข้อมูลและทดลองใช้

เราจะใส่ข้อมูลเบื้องต้นลงในฐานข้อมูล โดยการสั่ง

 rake db:migrate

ในการทดลองใช้เบื้องต้น เราจะใช้ Mongrel เป็น server ในการให้บริการ cafe grader ติดตั้ง mongrel โดยสั่ง

 sudo gem install mongrel

ถ้าไม่มีปัญหาใด ๆ เราก็พร้อมที่จะทดลองเรียกใช้ส่วน web interface แล้ว เรียกใช้โดยสั่ง

 ./script/server

ที่ไดเร็กทอรีของระบบ web (เช่น ~/grader/web)

จากนั้นเข้าใช้เว็บได้ที่พอร์ต 3000 ของเครื่องที่ติดตั้งได้เลย (เข้าโดยป้อน url เป็น http://หมายเลขไอพีเครื่อง:3000/)

ผู้ใช้เริ่มต้นคือ root รหัสผ่านคือ ioionrails

ในการใช้งานทั่วไป การติดตั้งเท่านี้ก็เพียงพอแล้ว ถ้าต้องการให้ web interface รันค้างอยู่เมื่อผู้ใช้ log out ออกจากเครื่องไปแล้ว ให้สั่งดังด้านล่าง

 nohup ./script/server &

เพื่อให้ mongrel ทำงานค้างอยู่ ผู้ใช้สามารถระบุให้ mongrel ทำงานที่พอร์ตอื่นก็ได้ สามารถดู option ต่าง ๆ ได้โดยสั่ง ./script/server --help

อย่างไรก็ตาม ถ้าต้องการให้ระบบเว็บทำงานอยู่บน URL ที่ไม่ต้องระบุพอร์ต, ต้องการทำงานที่รับโหลดมากขึ้น, รวมถึงไม่ต้องการเรียก ./script/server เอง จะต้องทำการติดตั้งในแบบ production วิธีการติดตั้งแบบดังกล่าวจะเขียนเร็ว ๆ นี้

การติดตั้งส่วนตัวตรวจ

เราจะอธิบายวิธีการติดตั้งส่วนตรวจโปรแกรมในไดเร็กทอรี ~/grader/judge ถ้าต้องการติดตั้งที่อื่นสามารถเปลี่ยนแปลงได้

Check out สคริปต์ตัวตรวจและตั้งค่าพื้นฐาน

เราเริ่มโดยเข้าไปในไดเร็กทรอรี ~/grader ที่สร้างไว้จากขั้นตอนก่อน (โดยสั่ง cd ~/grader) จากนั้น check out โปรแกรมตัวตรวจ จาก googlecode

 svn checkout http://cafe-grader.googlecode.com/svn/judge/trunk judge

เราจะได้ไดเร็กทอรี ~/grader/judge ซึ่งต่อไปจะอ้างถึงว่าเป็นรากของระบบตรวจ (judge-root) ปัจจุบันไดเร็กทอรีดังกล่าวประกอบไปด้วยไดเร็กทอรีย่อยคือ scripts, log, และ result

โครงสร้างของไดเร็กทอรีโดยทั่วไปของระบบตรวจจะเป็นดังต่อไปนี้

/[judge-root]
  /ev                     (มีข้อมูลสำหรับการตรวจจริงสำหรับโจทย์แต่ละข้อ)
    /problem_1
     ...
    /problem_n
    /test_request         (เก็บ TEST interface template สำหรับแต่ละข้อ)
      /problem_1
      ...
  /ev-exam                (มีข้อมูลสำหรับการตรวจจริงระหว่างแข่ง, โครงสร้างภายในเหมือน /ev)
    ...
  /raw                    (ที่เก็บข้อมูลชุดทดสอบแบบดิบ (raw) ก่อนการ import เข้าไปที่ ev และ ev-exam)
    /problem_1
    ...
  /result                 (ผลลัพธ์ของการตรวจสำหรับผู้ใช้แต่ละคน)
    /user_1
      /problem_1
        /submission_1     
    ...
    /user_n
  /scripts                (สคริปต์ทั้งหมด)
    /config               (ส่วนการตั้งค่า)
    /lib         
    /std-script           (สคริปต์ประกอบสำหรับการตรวจ)
    /templates            (เทมเพลตสำหรับการ import โจทย์)
    /test
  /log

(อย่างไรก็ตาม ในขั้นนี้เราจะยังมีแค่ scripts, log, และ result)

เราจะต้องไปปรับแต่งค่าในแฟ้มต่าง ๆ ในไดเร็กทอรี (judge-root)/scripts/config ให้เปลี่ยนไดเร็กทอรีไปที่ไดเร็กทอรีดังกล่าว จากนั้นคัดลอกแฟ้มข้อมูลกำหนดค่าที่นามสกุลลงท้ายด้วย .SAMPLE ทั้งหมดให้เป็นแฟ้มจริง (ที่ตัด .SAMPLE ทิ้ง) โดยสั่งดังด้านล่าง

cp env_exam.rb.SAMPLE env_exam.rb
cp env_grading.rb.SAMPLE env_grading.rb
cp env_test.rb.SAMPLE env_test.rb
cp environment.rb.SAMPLE environment.rb

จากนั้นให้แก้แฟ้ม environment.rb โดย

  • ปรับค่า RAILS_ROOT ให้เป็นไดเร็กทอรีที่เราติดตั้งระบบเว็บ (ในที่นี้คือ ~/grader/web) อย่างไรก็ตามเวลาระบุให้ใส่เป็นพาธเต็ม และ
  • ปรับค่า GRADER_ROOT ให้เป็นไดเร็กทอรีที่เก็บสคริปต์ (ในที่นี้คือ ~/grader/judge/scripts) ในการแก้ให้ใส่เป็นพาธเต็มเช่นเดียวกัน

สำหรับแฟ้ม env_*.rb เราจะใช้ค่ามาตรฐานไปก่อน อย่างไรก็ตามสามารถอ่านวิธีการปรับแต่งได้ที่เอกสารเก่านี้ไปพลาง ๆ ก่อน

คอมไพล์ส่วน sandbox

ส่วน sandbox เป็นส่วนที่ใช้เรียกโปรแกรมของผู้เข้าแข่งขันมาทำงาน และป้องกันโปรแกรมดังกล่าวจากการทำงานที่เราไม่พึงประสงค์ Cafe grader ใช้ sandbox ที่พัฒนาโดย Martin Mares

เราจะต้องคอมไพล์ sandbox ก่อน โดยใช้ gnu c++ ถ้ายังไม่ได้ติดตั้ง gnu c++ ให้ติดตั้งโดยสั่ง

sudo apt-get install g++

จากนั้นเข้าไปในไดเร็กทอรี ~/grader/judge/scripts/std-scripts แล้วสั่ง

g++ box.cc -o box

อาจจะเห็น warning บ้าง ก็ไม่เป็นไร ถ้าคอมไพล์ได้เรียบร้อยจะเห็นไฟล์ box ในไดเร็กทอรีดังกล่าว

ทดสอบระบบตรวจ ด้วย rspec

ระบบตรวจมาพร้อมกับชุดทดสอบ ถ้าเราติดตั้ง rspec แล้ว สามารถทดลองเรียกใช้ชุดทดสอบดังกล่าวเพื่อตรวจสอบว่าระบบตรวจ (รวมถึงระบบ sandbox) สามารถทำงานอย่างถูกต้องได้หรือไม่

ในไดเร็กทอรี ~/grader/judge/scripts แล้วสั่ง

spec test

ถ้าติดตั้งถูกต้อง บรรทัดสุดท้ายจะเห็นเป็น 18 examples, 0 failures

ทดลองกับโจทย์ตัวอย่างพร้อมระบบรับทางเว็บ

จะเพิ่มเร็ว ๆ นี้