ผลต่างระหว่างรุ่นของ "การติดตั้ง Cafe grader/กรุ"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
(/* การเชื่อมระบบเว็บเข้ากับระบบตัวตรวจเพื่อทำให้สามารถอัพโหลดโจทย์และเปิดปิดโปรแกรมตร)
(/* การเชื่อมระบบเว็บเข้ากับระบบตัวตรวจเพื่อทำให้สามารถอัพโหลดโจทย์และเปิดปิดโปรแกรมตร)
แถว 305: แถว 305:
 
ให้แก้ไฟล์ <tt>~/grader/web/config/environment.rb</tt> ในบรรทัด <tt>GRADER_ROOT_DIR</tt> ให้ชี้ไปยังไดเร็กทอรีที่ติดตั้งระบบตรวจ เช่น
 
ให้แก้ไฟล์ <tt>~/grader/web/config/environment.rb</tt> ในบรรทัด <tt>GRADER_ROOT_DIR</tt> ให้ชี้ไปยังไดเร็กทอรีที่ติดตั้งระบบตรวจ เช่น
  
   GRADER_ROOT_DIR = '/home/YOURDIRECTORY/grader/judge'
+
   GRADER_ROOT_DIR = '/YOUR-HOME-DIRECTORY/grader/judge'
  
เป็นต้น
+
เป็นต้น (อย่าลืมแทน YOUR-HOME-DIRECTORY ด้วย path ที่ถูกต้อง)
  
 
== การโหลด cafe grader รุ่นปรับปรุง ==
 
== การโหลด cafe grader รุ่นปรับปรุง ==

รุ่นแก้ไขเมื่อ 14:08, 23 กุมภาพันธ์ 2553

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

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

เนื้อหา

ข่าวการอัพเดท

การติดตั้ง Cafe Grader

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

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

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

 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 เช่นกัน

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

git pull origin master:master

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

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

rake db:migrate
rake db:seed

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