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

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

สำหรับผู้ที่พบปัญหาในการติดตั้ง กรุณาอ่าน ปัญหาการใช้ Cafe grader ที่พบบ่อย

Cafe grader ได้เปลี่ยนไปใช้ Git และได้ย้ายไปใช้บริการของ Gitorious เพื่อเก็บไฟล์แล้ว

สำหรับผู้ที่ติดตั้งโดยใช้ subversion และเรียกต้นฉบับผ่านทาง Google Code กรุณาอ่านขั้นตอนเพื่อย้ายจาก Google Code ที่เป็น Subversion ได้ที่นี่

วิธีการติดตั้งในหน้านี้เป็นวิธีเก่า ไม่สามารถใช้ได้แล้ว

เนื้อหา

การติดตั้งแบบ manual

บทความนี้จะอธิบายการติดตั้ง 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 ของระบบฐานข้อมูล)

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

 sudo apt-get install git-core

ติดตั้ง 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
  • ติดตั้งชุดโปรแกรมที่ใช้ในการคอมไพล์
 sudo apt-get install build-essential
  • ไฟล์ประกอบในการคอมไพล์ไลบรารีต่าง ๆ ของ 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

ดาวน์โหลด (clone) cafe grader และปรับแต่ง

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

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

 mkdir grader

จากนั้น clone cafe grader จาก gitorious

 git clone git://gitorious.org/cafe-grader/cafe-grader-web.git grader/web

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

(หมายเหตุ: ถ้าไม่สามารถโหลดได้ให้ทดลองเปลี่ยน url จาก git://.... เป็น http://git.gitorious.org/cafe-grader/cafe-grader-web.git แทน)

เราจะเข้าไปปรับแก้แฟ้มต่าง ๆ โดยแฟ้มเหล่านี้อยู่ในไดเร็กทอรี ~/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

แล้วสั่ง

 rake db:seed

เพื่อใส่ข้อมูลเริ่มต้นเข้าในระบบ

ในการทดลองใช้เบื้องต้น เราจะใช้ 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

การติดตั้ง Phusion Passenger เพื่อให้เข้าโดยไม่ต้องใส่หมายเลขพอร์ตได้

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

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

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

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

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

จากนั้นสร้างไดเร็กทอรี judge เพื่อใส่ไฟล์ระบบตรวจ แล้วย้ายเข้าไปในไดเร็กทอรีนั้นโดยสั่ง

 mkdir judge
 cd judge

จากนั้น clone โปรแกรมตัวตรวจ จาก gitorious

 git clone git://gitorious.org/cafe-grader/cafe-grader-judge-scripts.git scripts

(หมายเหตุ: ถ้าไม่สามารถโหลดได้ให้ทดลองเปลี่ยน url จาก git://.... เป็น http://git.gitorious.org/cafe-grader/cafe-grader-judge-scripts.git แทน)

และสร้างไดเร็กทอรีต่าง ๆ ที่เกี่ยวข้อ

 mkdir raw
 mkdir ev-exam
 mkdir ev
 mkdir result
 mkdir log

ไดเร็กทอรี ~/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

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

โจทย์ตัวอย่างสำหรับทดสอบคือโจทย์ที่ให้หาผลรวม:

จงเขียนโปรแกรมหาผลรวมของจำนวนเต็ม ในข้อมูลป้อนเข้าบรรทัดแรกระบุจำนวนข้อมูล N (N <= 200) จากนั้นอีก N บรรทัดจะมีจำนวนเต็มบรรทัดละหนึ่งตัว โปรแกรมจะต้องเขียนข้อมูลส่งออกหนึ่งบรรทัดเป็นผลรวมของจำนวนเต็มดังกล่าว

ก่อนอื่นสร้างไดเร็กทอรี ~/grader/judge/ev และ ~/grader/judge/ev-exam ก่อน

จากนั้นย้ายเข้าไปที่ไดเร็กทอรี ~/grader/judge จากนั้น import ข้อมูลชุดทดสอบของโจทย์ตัวอย่าง โดยสั่ง

./scripts/import_problem - scripts/test/data/raw/sum/ text

จากนั้นเรียก grader โดยย้ายเข้าไปในไดเร็กทอรี ~/grader/judge/script แล้วเรียก grader ให้ทำงานค้างไว้โดยสั่ง

./grader grading queue

ให้เข้าไปที่ส่วนติดต่อทางเว็บ (ถ้าไม่ได้ทำขั้นตอนติดตั้ง Phusion passenger อย่าลืมเรียก ./script/server ใน ~/grader/web), login เป็น root, จากนั้นให้เข้าไปเพิ่มโจทย์ sum โดยทำขั้นตอนดังนี้

  • เลือกเมนู [Problem admin]
  • เพิ่มข้อมูลแบบเร็ว โดยใช้ Quick New ป้อน Name เป็น sum และ Full name เป็น sum เช่นเดียวกัน จากนั้นกดปุ่ม Create
  • เปิดโจทย์ข้อดังกล่าว โดยกด [Toggle] ที่บรรทัดของโจทย์นั้น โจทย์ที่เปิดจะแสดงเป็นแถบสีเขียว

จากนั้นกลับไปที่หน้าแรก โดยกด [Main] จะเห็นโจทย์ sum ปรากฎอยู่ ทดลองส่งได้ โดยเลือกไฟล์ตัวอย่างเฉลย sum.c จากไดเร็กทอรี ~/grader/judge/scripts/test/data/raw/sum/ (หรือ ดาวน์โหลดที่นี่) เมื่อโปรแกรมตรวจเรียบร้อยจะได้คะแนนเต็ม 100 พร้อมแสดงผลการตรวจว่า P[PP]PPPPPPP[PPP]

การเชื่อมระบบเว็บเข้ากับระบบตัวตรวจเพื่อทำให้สามารถอัพโหลดโจทย์และเปิดปิดโปรแกรมตรวจได้ทางเว็บ

ให้แก้ไฟล์ ~/grader/web/config/environment.rb ในบรรทัด GRADER_ROOT_DIR ให้ชี้ไปยังไดเร็กทอรีที่ติดตั้งระบบตรวจ เช่น

 GRADER_ROOT_DIR = '/YOUR-HOME-DIRECTORY/grader/judge'

เป็นต้น (อย่าลืมแทน YOUR-HOME-DIRECTORY ด้วย path ที่ถูกต้อง)

วิธีการอัพโหลดโจทย์จะเพิ่มเติมเร็ว ๆ นี้

การโหลด cafe grader รุ่นปรับปรุง

เราโหลด cafe grader ด้วย git เราสามารถโหลดโปรแกรมรุ่นใหม่ได้ด้วย git เช่นกัน โดยมีขั้นตอนดังนี้

1. ดาวน์โหลดซอฟต์แวร์เวอร์ชันล่าสุด

ที่ไดเร็กทอพรี ~/grader/web และ ~/grader/judge/scripts เราสามารถสั่ง

git pull origin master:master

เพื่อให้ git อัพเดทไฟล์ให้เป็นไฟล์ล่าสุด

ในการสั่ง git pull ที่ ~/grader/web อาจพบปัญหาว่าไฟล์ db/schema.rb ถูกแก้ โดยจะเห็นข้อผิดพลาดลักษณะดังนี้

Updating XXXXXX
error: Entry 'db/schema.rb' not uptodate. Cannot merge.

ถ้าเกิดกรณีดังกล่าวขึ้น เรียกไฟล์เก่ากลับมาก่อนครับ โดยสั่ง

git checkout db/schema.db

ก็จะสามารถสั่ง git pull ได้ตามต้องการ (ในกรณีนี้ค่อนข้างแน่นอนว่าต้องสั่ง rake db:migrate ในขั้นต่อไปด้วย)

2. ปรับปรุงไฟล์ที่เก็บ config

จากนั้นตรวจสอบไฟล์ ~/grader/web/config/environment.rb.SAMPLE จากต้นทางกับ ~/grader/web/config/environment.rb ที่เครื่อง เพื่อตรวจสอบความเปลี่ยนแปลงของ config นะครับ ถ้ามีการประกาศอะไรเพิ่มเติมก็ให้คัดลอกมาใส่ในไฟล์ที่เครื่องด้วย

3. ปรับปรุงโครงสร้างตารางในฐานข้อมูล

บางครั้งการเปลี่ยนรุ่นจะมีการปรับปรุงฐานข้อมูล ดังนั้นก่อนใช้งานจะต้องสั่งให้ระบบทำการ migrate ข้อมูลเสียก่อน โดยเข้าไปที่ ~/grader/web แล้วสั่ง

rake db:migrate
rake db:seed

หน้าเว็บของ Cafe grader ที่ Gitorious คือ http://gitorious.org/cafe-grader