การติดตั้ง Cafe grader/กรุ
สำหรับผู้ที่พบปัญหาในการติดตั้ง กรุณาอ่าน ปัญหาการใช้ 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