การติดตั้ง Cafe grader/กรุ
Cafe Grader ได้เปลี่ยนไปใช้ Git ได้ย้ายไปใช้บริการของ Gitorious เพื่อเก็บไฟล์แล้ว กรุณาอ่านขั้นตอนเพื่อย้ายจาก Google Code ที่เป็น Subversion ได้ที่นี่
บทความนี้จะอธิบายการติดตั้ง 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 ถ้าต้องการติดตั้งที่อื่นสามารถเปลี่ยนแปลงได้
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
ทดลองกับโจทย์ตัวอย่างพร้อมระบบรับทางเว็บ
โจทย์ตัวอย่างสำหรับทดสอบคือโจทย์ที่ให้หาผลรวม:
- จงเขียนโปรแกรมหาผลรวมของจำนวนเต็ม ในข้อมูลป้อนเข้าบรรทัดแรกระบุจำนวนข้อมูล 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]
การโหลด cafe grader รุ่นปรับปรุง
เราโหลด cafe grader ด้วย subversion ระบบของ subversion จะมีการบันทึกหมายเลขรุ่นของโปรแกรมที่เราใช้ไว้ เราสามารถตรวจสอบรุ่นของโปรแกรมที่ใช้อยู่ได้โดยสั่ง
svn info
จากไดเร็กทอรี ~/grader/web และ ~/grader/judge ตามลำดับ บรรทัดที่เขียนว่า Revision: จะระบุหมายเลขรุ่นของโปรแกรม
ถ้ามีการปรับปรุงรุ่นใหม่เราสามารถสั่ง svn update เพื่อโหลดโปรแกรมรุ่นปรับปรุงมาได้ทันที โดยสั่ง
svn update
จากไดเร็กทอรี ~/grader/web และ ~/grader/judge ตามลำดับ โดย svn จะแสดงหมายเลขรุ่นของ cafe grader เมื่อ update เสร็จ เช่น Updated to revision 422.
บางครั้งการเปลี่ยนรุ่นจะมีการปรับปรุงฐานข้อมูล ดังนั้นก่อนใช้งานจะต้องสั่งให้ระบบทำการ migrate ข้อมูลเสียก่อน โดยสั่ง
rake db:migrate
ในไดเร็กทอรีของระบบเว็บ (ในตัวอย่างคือ ~/grader/web)
สามารถดูหมายเลขรุ่นล่าสุดของ cafe grader ได้ที่ http://code.google.com/p/cafe-grader/source/list