ผลต่างระหว่างรุ่นของ "การติดตั้ง Cafe grader/กรุ"
Chalet16 (คุย | มีส่วนร่วม) |
Jittat (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 54 รุ่นระหว่างกลางโดยผู้ใช้ 3 คน) | |||
แถว 1: | แถว 1: | ||
+ | {{กล่องสี|#ffcccc| | ||
+ | <center> | ||
+ | สำหรับผู้ที่พบปัญหาในการติดตั้ง กรุณาอ่าน [[ปัญหาการใช้ Cafe grader ที่พบบ่อย]] | ||
+ | </center> | ||
+ | }} | ||
+ | {{กล่องสี|#ffcccc| | ||
+ | <center> | ||
+ | [[Cafe grader]] ได้เปลี่ยนไปใช้ [http://git-scm.com/ Git] และได้ย้ายไปใช้บริการของ [http://gitorious.org/cafe-grader Gitorious] เพื่อเก็บไฟล์แล้ว | ||
+ | |||
+ | สำหรับผู้ที่ติดตั้งโดยใช้ subversion และเรียกต้นฉบับผ่านทาง Google Code [[Cafe-grader-moved|กรุณาอ่านขั้นตอนเพื่อย้ายจาก Google Code ที่เป็น Subversion ได้ที่นี่]] | ||
+ | </center> | ||
+ | }} | ||
+ | |||
+ | : '''วิธีการติดตั้งในหน้านี้เป็นวิธีเก่า ไม่สามารถใช้ได้แล้ว''' | ||
+ | |||
+ | == การติดตั้งแบบ manual == | ||
+ | |||
บทความนี้จะอธิบายการติดตั้ง [[Cafe grader]] ขั้นตอนดังกล่าวยังไม่รวมถึงการเพิ่มโจทย์และการใช้งานอื่น ๆ สำหรับเนื้อหาในส่วนดังกล่าวจะเขียนเพิ่มเร็ว ๆ นี้ | บทความนี้จะอธิบายการติดตั้ง [[Cafe grader]] ขั้นตอนดังกล่าวยังไม่รวมถึงการเพิ่มโจทย์และการใช้งานอื่น ๆ สำหรับเนื้อหาในส่วนดังกล่าวจะเขียนเพิ่มเร็ว ๆ นี้ | ||
แถว 7: | แถว 24: | ||
ในการเขียนบางจุดอาจมีรายละเอียดมากไป สำหรับผู้เชี่ยวชาญสามารถอ่านข้ามไปได้ | ในการเขียนบางจุดอาจมีรายละเอียดมากไป สำหรับผู้เชี่ยวชาญสามารถอ่านข้ามไปได้ | ||
− | == การติดตั้งซอฟต์แวร์ที่จำเป็น == | + | === การติดตั้งซอฟต์แวร์ที่จำเป็น === |
เราจะติดตั้ง Ruby, [http://www.rubyonrails.org/ Rails] (เป็นเว็บเฟรมเวิร์คที่ใช้ในการพัฒนา cafe grader), และ Subversion ซึ่งเป็นระบบจัดการเวอร์ชันของซอฟต์แวร์ (ใช้ในการโหลดระบบ cafe grader) | เราจะติดตั้ง Ruby, [http://www.rubyonrails.org/ Rails] (เป็นเว็บเฟรมเวิร์คที่ใช้ในการพัฒนา cafe grader), และ Subversion ซึ่งเป็นระบบจัดการเวอร์ชันของซอฟต์แวร์ (ใช้ในการโหลดระบบ cafe grader) | ||
− | === ติดตั้งระบบฐานข้อมูล MySQL, ระบบจัดการเวอร์ชัน Subversion === | + | ==== ติดตั้งระบบฐานข้อมูล MySQL, ระบบจัดการเวอร์ชัน Subversion ==== |
ติดตั้ง MySQL โดยสั่ง | ติดตั้ง MySQL โดยสั่ง | ||
แถว 19: | แถว 36: | ||
ระหว่างติดตั้ง ระบบจะถาม password ของ root ของ mysql server ให้เลือกและจดไว้ (จะต้องใช้ต่อไปในการสร้าง user ของระบบฐานข้อมูล) | ระหว่างติดตั้ง ระบบจะถาม password ของ root ของ mysql server ให้เลือกและจดไว้ (จะต้องใช้ต่อไปในการสร้าง user ของระบบฐานข้อมูล) | ||
− | เราจะใช้ [http:// | + | เราจะใช้ [http://git-scm.com/ git] ในการโหลดรุ่นล่าสุดของ Cafe grader มาติดตั้ง ดังนั้นสั่งติดตั้ง git ดังนี้ |
− | sudo apt-get install | + | sudo apt-get install git-core |
− | === ติดตั้ง Ruby, ระบบจัดการแพกเกจ Ruby Gem, Rails, และไลบรารีอื่น ๆ === | + | ==== ติดตั้ง Ruby, ระบบจัดการแพกเกจ Ruby Gem, Rails, และไลบรารีอื่น ๆ ==== |
Cafe grader พัฒนาด้วยภาษา Ruby ดังนั้นเราจะต้องติดตั้ง Ruby พร้อมทั้งระบบต่าง ๆ ก่อน | Cafe grader พัฒนาด้วยภาษา Ruby ดังนั้นเราจะต้องติดตั้ง Ruby พร้อมทั้งระบบต่าง ๆ ก่อน | ||
แถว 49: | แถว 66: | ||
sudo gem install rails --no-rdoc --no-ri | sudo gem install rails --no-rdoc --no-ri | ||
− | |||
− | |||
− | |||
− | |||
* Rspec (ระบบทดสอบการทำงาน), ติดตั้งโดยสั่ง | * Rspec (ระบบทดสอบการทำงาน), ติดตั้งโดยสั่ง | ||
แถว 65: | แถว 78: | ||
sudo apt-get install libopenssl-ruby | sudo apt-get install libopenssl-ruby | ||
+ | |||
+ | * ติดตั้งชุดโปรแกรมที่ใช้ในการคอมไพล์ | ||
+ | |||
+ | sudo apt-get install build-essential | ||
* ไฟล์ประกอบในการคอมไพล์ไลบรารีต่าง ๆ ของ ruby | * ไฟล์ประกอบในการคอมไพล์ไลบรารีต่าง ๆ ของ ruby | ||
แถว 70: | แถว 87: | ||
sudo apt-get install ruby1.8-dev | sudo apt-get install ruby1.8-dev | ||
− | == การติดตั้งส่วนติดต่อทางเว็บ == | + | === การติดตั้งส่วนติดต่อทางเว็บ === |
เราจะเริ่มโดยการสร้าง user บน mysql และ database | เราจะเริ่มโดยการสร้าง user บน mysql และ database | ||
− | === สร้างฐานข้อมูลบน MySQL === | + | ==== สร้างฐานข้อมูลบน MySQL ==== |
เราจะสร้างผู้ใช้และฐานข้อมูลบน Mysql เข้าใช้ mysql โดยสั่ง | เราจะสร้างผู้ใช้และฐานข้อมูลบน Mysql เข้าใช้ mysql โดยสั่ง | ||
แถว 96: | แถว 113: | ||
เมื่อเรียบร้อยแล้วให้ออกจาก mysql โดยสั่ง <tt>quit</tt> | เมื่อเรียบร้อยแล้วให้ออกจาก mysql โดยสั่ง <tt>quit</tt> | ||
− | === | + | ==== ดาวน์โหลด (clone) cafe grader และปรับแต่ง ==== |
เราจะติดตั้งส่วนติดต่อทางเว็บที่ <tt>~/grader/web</tt> ถ้าต้องการติดตั้งที่อื่นให้แก้ขั้นตอนต่อไปตามเหมาะสม | เราจะติดตั้งส่วนติดต่อทางเว็บที่ <tt>~/grader/web</tt> ถ้าต้องการติดตั้งที่อื่นให้แก้ขั้นตอนต่อไปตามเหมาะสม | ||
แถว 104: | แถว 121: | ||
mkdir grader | mkdir grader | ||
− | จากนั้น | + | จากนั้น clone cafe grader จาก gitorious |
− | + | git clone <nowiki>git://gitorious.org/cafe-grader/cafe-grader-web.git</nowiki> grader/web | |
โปรแกรมส่วนติดต่อกับผู้ใช้ทางเว็บจะถูกดาวน์โหลดมาที่ <tt>~/grader/web</tt> | โปรแกรมส่วนติดต่อกับผู้ใช้ทางเว็บจะถูกดาวน์โหลดมาที่ <tt>~/grader/web</tt> | ||
+ | |||
+ | ('''หมายเหตุ:''' ถ้าไม่สามารถโหลดได้ให้ทดลองเปลี่ยน url จาก <tt><nowiki>git://....</nowiki></tt> เป็น <tt><nowiki> http://git.gitorious.org/cafe-grader/cafe-grader-web.git</nowiki></tt> แทน) | ||
เราจะเข้าไปปรับแก้แฟ้มต่าง ๆ โดยแฟ้มเหล่านี้อยู่ในไดเร็กทอรี <tt>~/grader/web/config</tt> | เราจะเข้าไปปรับแก้แฟ้มต่าง ๆ โดยแฟ้มเหล่านี้อยู่ในไดเร็กทอรี <tt>~/grader/web/config</tt> | ||
แถว 132: | แถว 151: | ||
sudo rake gems:install | sudo rake gems:install | ||
− | === ใส่ข้อมูลเบื้องต้นลงในฐานข้อมูลและทดลองใช้ === | + | ==== ใส่ข้อมูลเบื้องต้นลงในฐานข้อมูลและทดลองใช้ ==== |
− | + | เราจะสร้างตารางในฐานข้อมูล โดยการสั่ง | |
rake db:migrate | rake db:migrate | ||
+ | |||
+ | แล้วสั่ง | ||
+ | |||
+ | rake db:seed | ||
+ | |||
+ | เพื่อใส่ข้อมูลเริ่มต้นเข้าในระบบ | ||
ในการทดลองใช้เบื้องต้น เราจะใช้ Mongrel เป็น server ในการให้บริการ cafe grader ติดตั้ง mongrel โดยสั่ง | ในการทดลองใช้เบื้องต้น เราจะใช้ Mongrel เป็น server ในการให้บริการ cafe grader ติดตั้ง mongrel โดยสั่ง | ||
แถว 158: | แถว 183: | ||
เพื่อให้ mongrel ทำงานค้างอยู่ ผู้ใช้สามารถระบุให้ mongrel ทำงานที่พอร์ตอื่นก็ได้ สามารถดู option ต่าง ๆ ได้โดยสั่ง <tt>./script/server --help</tt> | เพื่อให้ mongrel ทำงานค้างอยู่ ผู้ใช้สามารถระบุให้ mongrel ทำงานที่พอร์ตอื่นก็ได้ สามารถดู option ต่าง ๆ ได้โดยสั่ง <tt>./script/server --help</tt> | ||
− | === การติดตั้ง Phusion Passenger เพื่อให้เข้าโดยไม่ต้องใส่หมายเลขพอร์ตได้ === | + | ==== การติดตั้ง Phusion Passenger เพื่อให้เข้าโดยไม่ต้องใส่หมายเลขพอร์ตได้ ==== |
− | อย่างไรก็ตาม ถ้าต้องการให้ระบบเว็บทำงานอยู่บน URL ที่ไม่ต้องระบุพอร์ต, ต้องการทำงานที่รับโหลดมากขึ้น, รวมถึงไม่ต้องการเรียก ./script/server เอง จะต้องทำการติดตั้งในแบบ production | + | อย่างไรก็ตาม ถ้าต้องการให้ระบบเว็บทำงานอยู่บน URL ที่ไม่ต้องระบุพอร์ต, ต้องการทำงานที่รับโหลดมากขึ้น, รวมถึงไม่ต้องการเรียก ./script/server เอง จะต้องทำการติดตั้งในแบบ production โดย cafe grader จะทำงานผ่านทาง apache ด้วย module passenger อ่านวิธีการติดตั้งได้ที่[[การติดตั้ง web interface ของ cafe grader ด้วย passenger]] |
− | == การติดตั้งส่วนตัวตรวจ == | + | === การติดตั้งส่วนตัวตรวจ === |
เราจะอธิบายวิธีการติดตั้งส่วนตรวจโปรแกรมในไดเร็กทอรี <tt>~/grader/judge</tt> ถ้าต้องการติดตั้งที่อื่นสามารถเปลี่ยนแปลงได้ | เราจะอธิบายวิธีการติดตั้งส่วนตรวจโปรแกรมในไดเร็กทอรี <tt>~/grader/judge</tt> ถ้าต้องการติดตั้งที่อื่นสามารถเปลี่ยนแปลงได้ | ||
− | === | + | ==== Clone สคริปต์ตัวตรวจและตั้งค่าพื้นฐาน ==== |
− | เราเริ่มโดยเข้าไปในไดเร็กทรอรี <tt>~/grader</tt> ที่สร้างไว้จากขั้นตอนก่อน (โดยสั่ง <tt>cd ~/grader</tt>) | + | เราเริ่มโดยเข้าไปในไดเร็กทรอรี <tt>~/grader</tt> ที่สร้างไว้จากขั้นตอนก่อน (โดยสั่ง <tt>cd ~/grader</tt>) |
− | + | จากนั้นสร้างไดเร็กทอรี <tt>judge</tt> เพื่อใส่ไฟล์ระบบตรวจ แล้วย้ายเข้าไปในไดเร็กทอรีนั้นโดยสั่ง | |
− | + | mkdir judge | |
+ | cd judge | ||
+ | |||
+ | จากนั้น clone โปรแกรมตัวตรวจ จาก gitorious | ||
+ | |||
+ | git clone <nowiki>git://gitorious.org/cafe-grader/cafe-grader-judge-scripts.git</nowiki> scripts | ||
+ | |||
+ | ('''หมายเหตุ:''' ถ้าไม่สามารถโหลดได้ให้ทดลองเปลี่ยน url จาก <tt><nowiki>git://....</nowiki></tt> เป็น <tt><nowiki>http://git.gitorious.org/cafe-grader/cafe-grader-judge-scripts.git</nowiki></tt> แทน) | ||
+ | |||
+ | และสร้างไดเร็กทอรีต่าง ๆ ที่เกี่ยวข้อ | ||
+ | |||
+ | mkdir raw | ||
+ | mkdir ev-exam | ||
+ | mkdir ev | ||
+ | mkdir result | ||
+ | mkdir log | ||
+ | |||
+ | ไดเร็กทอรี <tt>~/grader/judge</tt> ต่อไปจะอ้างถึงว่าเป็นรากของระบบตรวจ (judge-root) ปัจจุบันไดเร็กทอรีดังกล่าวประกอบไปด้วยไดเร็กทอรีย่อยคือ <tt>scripts</tt>, <tt>log</tt>, และ <tt>result</tt> และอื่น ๆ | ||
โครงสร้างของไดเร็กทอรีโดยทั่วไปของระบบตรวจจะเป็นดังต่อไปนี้ | โครงสร้างของไดเร็กทอรีโดยทั่วไปของระบบตรวจจะเป็นดังต่อไปนี้ | ||
แถว 217: | แถว 259: | ||
สำหรับแฟ้ม <tt>env_*.rb</tt> เราจะใช้ค่ามาตรฐานไปก่อน อย่างไรก็ตามสามารถอ่านวิธีการปรับแต่งได้ที่[[Installing and configuring Judge|เอกสารเก่านี้ไปพลาง ๆ ก่อน]] | สำหรับแฟ้ม <tt>env_*.rb</tt> เราจะใช้ค่ามาตรฐานไปก่อน อย่างไรก็ตามสามารถอ่านวิธีการปรับแต่งได้ที่[[Installing and configuring Judge|เอกสารเก่านี้ไปพลาง ๆ ก่อน]] | ||
− | === คอมไพล์ส่วน sandbox === | + | ==== คอมไพล์ส่วน sandbox ==== |
ส่วน sandbox เป็นส่วนที่ใช้เรียกโปรแกรมของผู้เข้าแข่งขันมาทำงาน และป้องกันโปรแกรมดังกล่าวจากการทำงานที่เราไม่พึงประสงค์ Cafe grader ใช้ sandbox ที่พัฒนาโดย Martin Mares | ส่วน sandbox เป็นส่วนที่ใช้เรียกโปรแกรมของผู้เข้าแข่งขันมาทำงาน และป้องกันโปรแกรมดังกล่าวจากการทำงานที่เราไม่พึงประสงค์ Cafe grader ใช้ sandbox ที่พัฒนาโดย Martin Mares | ||
แถว 231: | แถว 273: | ||
อาจจะเห็น warning บ้าง ก็ไม่เป็นไร ถ้าคอมไพล์ได้เรียบร้อยจะเห็นไฟล์ box ในไดเร็กทอรีดังกล่าว | อาจจะเห็น warning บ้าง ก็ไม่เป็นไร ถ้าคอมไพล์ได้เรียบร้อยจะเห็นไฟล์ box ในไดเร็กทอรีดังกล่าว | ||
− | === ทดสอบระบบตรวจ ด้วย rspec === | + | ==== ทดสอบระบบตรวจ ด้วย rspec ==== |
ระบบตรวจมาพร้อมกับชุดทดสอบ ถ้าเราติดตั้ง rspec แล้ว สามารถทดลองเรียกใช้ชุดทดสอบดังกล่าวเพื่อตรวจสอบว่าระบบตรวจ (รวมถึงระบบ sandbox) สามารถทำงานอย่างถูกต้องได้หรือไม่ | ระบบตรวจมาพร้อมกับชุดทดสอบ ถ้าเราติดตั้ง rspec แล้ว สามารถทดลองเรียกใช้ชุดทดสอบดังกล่าวเพื่อตรวจสอบว่าระบบตรวจ (รวมถึงระบบ sandbox) สามารถทำงานอย่างถูกต้องได้หรือไม่ | ||
แถว 241: | แถว 283: | ||
ถ้าติดตั้งถูกต้อง บรรทัดสุดท้ายจะเห็นเป็น <tt>18 examples, 0 failures</tt> | ถ้าติดตั้งถูกต้อง บรรทัดสุดท้ายจะเห็นเป็น <tt>18 examples, 0 failures</tt> | ||
− | === ทดลองกับโจทย์ตัวอย่างพร้อมระบบรับทางเว็บ === | + | ==== ทดลองกับโจทย์ตัวอย่างพร้อมระบบรับทางเว็บ ==== |
+ | |||
+ | โจทย์ตัวอย่างสำหรับทดสอบคือโจทย์ที่ให้หาผลรวม: | ||
+ | |||
+ | ::''จงเขียนโปรแกรมหาผลรวมของจำนวนเต็ม ในข้อมูลป้อนเข้าบรรทัดแรกระบุจำนวนข้อมูล N (N <= 200) จากนั้นอีก N บรรทัดจะมีจำนวนเต็มบรรทัดละหนึ่งตัว โปรแกรมจะต้องเขียนข้อมูลส่งออกหนึ่งบรรทัดเป็นผลรวมของจำนวนเต็มดังกล่าว'' | ||
+ | |||
+ | ก่อนอื่นสร้างไดเร็กทอรี <tt>~/grader/judge/ev</tt> และ <tt>~/grader/judge/ev-exam</tt> ก่อน | ||
+ | |||
+ | จากนั้นย้ายเข้าไปที่ไดเร็กทอรี <tt>~/grader/judge</tt> จากนั้น import ข้อมูลชุดทดสอบของโจทย์ตัวอย่าง โดยสั่ง | ||
+ | |||
+ | ./scripts/import_problem - scripts/test/data/raw/sum/ text | ||
+ | |||
+ | จากนั้นเรียก grader โดยย้ายเข้าไปในไดเร็กทอรี <tt>~/grader/judge/script</tt> แล้วเรียก grader ให้ทำงานค้างไว้โดยสั่ง | ||
+ | |||
+ | ./grader grading queue | ||
+ | |||
+ | ให้เข้าไปที่ส่วนติดต่อทางเว็บ (ถ้าไม่ได้ทำขั้นตอนติดตั้ง Phusion passenger อย่าลืมเรียก <tt>./script/server</tt> ใน <tt>~/grader/web</tt>), login เป็น root, จากนั้นให้เข้าไปเพิ่มโจทย์ <tt>sum</tt> โดยทำขั้นตอนดังนี้ | ||
+ | |||
+ | * เลือกเมนู [Problem admin] | ||
+ | * เพิ่มข้อมูลแบบเร็ว โดยใช้ Quick New ป้อน Name เป็น <tt>sum</tt> และ Full name เป็น <tt>sum</tt> เช่นเดียวกัน จากนั้นกดปุ่ม Create | ||
+ | * เปิดโจทย์ข้อดังกล่าว โดยกด [Toggle] ที่บรรทัดของโจทย์นั้น โจทย์ที่เปิดจะแสดงเป็นแถบสีเขียว | ||
+ | |||
+ | จากนั้นกลับไปที่หน้าแรก โดยกด [Main] จะเห็นโจทย์ sum ปรากฎอยู่ ทดลองส่งได้ โดยเลือกไฟล์ตัวอย่างเฉลย <tt>sum.c</tt> จากไดเร็กทอรี <tt>~/grader/judge/scripts/test/data/raw/sum/</tt> (หรือ [http://cafe-grader.googlecode.com/svn/judge/trunk/scripts/test/data/raw/sum/sum.c ดาวน์โหลดที่นี่]) เมื่อโปรแกรมตรวจเรียบร้อยจะได้คะแนนเต็ม 100 พร้อมแสดงผลการตรวจว่า <tt>P[PP]PPPPPPP[PPP]</tt> | ||
+ | |||
+ | === การเชื่อมระบบเว็บเข้ากับระบบตัวตรวจเพื่อทำให้สามารถอัพโหลดโจทย์และเปิดปิดโปรแกรมตรวจได้ทางเว็บ === | ||
+ | |||
+ | ให้แก้ไฟล์ <tt>~/grader/web/config/environment.rb</tt> ในบรรทัด <tt>GRADER_ROOT_DIR</tt> ให้ชี้ไปยังไดเร็กทอรีที่ติดตั้งระบบตรวจ เช่น | ||
+ | |||
+ | GRADER_ROOT_DIR = '/YOUR-HOME-DIRECTORY/grader/judge' | ||
+ | |||
+ | เป็นต้น (อย่าลืมแทน YOUR-HOME-DIRECTORY ด้วย path ที่ถูกต้อง) | ||
+ | |||
+ | : ''วิธีการอัพโหลดโจทย์จะเพิ่มเติมเร็ว ๆ นี้'' | ||
+ | |||
+ | == การโหลด cafe grader รุ่นปรับปรุง == | ||
+ | |||
+ | เราโหลด cafe grader ด้วย git เราสามารถโหลดโปรแกรมรุ่นใหม่ได้ด้วย git เช่นกัน โดยมีขั้นตอนดังนี้ | ||
+ | |||
+ | '''1. ดาวน์โหลดซอฟต์แวร์เวอร์ชันล่าสุด''' | ||
+ | |||
+ | ที่ไดเร็กทอพรี <tt>~/grader/web</tt> และ <tt>~/grader/judge/scripts</tt> เราสามารถสั่ง | ||
+ | |||
+ | git pull origin master:master | ||
+ | |||
+ | เพื่อให้ git อัพเดทไฟล์ให้เป็นไฟล์ล่าสุด | ||
+ | |||
+ | ในการสั่ง <tt>git pull</tt> ที่ <tt>~/grader/web</tt> อาจพบปัญหาว่าไฟล์ <tt>db/schema.rb</tt> ถูกแก้ โดยจะเห็นข้อผิดพลาดลักษณะดังนี้ | ||
+ | |||
+ | Updating XXXXXX | ||
+ | error: Entry 'db/schema.rb' not uptodate. Cannot merge. | ||
+ | |||
+ | ถ้าเกิดกรณีดังกล่าวขึ้น เรียกไฟล์เก่ากลับมาก่อนครับ โดยสั่ง | ||
+ | |||
+ | git checkout db/schema.db | ||
+ | |||
+ | ก็จะสามารถสั่ง <tt>git pull</tt> ได้ตามต้องการ (ในกรณีนี้ค่อนข้างแน่นอนว่าต้องสั่ง <tt>rake db:migrate</tt> ในขั้นต่อไปด้วย) | ||
+ | |||
+ | '''2. ปรับปรุงไฟล์ที่เก็บ config''' | ||
+ | |||
+ | จากนั้นตรวจสอบไฟล์ <tt>~/grader/web/config/environment.rb.SAMPLE</tt> จากต้นทางกับ <tt>~/grader/web/config/environment.rb</tt> ที่เครื่อง เพื่อตรวจสอบความเปลี่ยนแปลงของ config นะครับ ถ้ามีการประกาศอะไรเพิ่มเติมก็ให้คัดลอกมาใส่ในไฟล์ที่เครื่องด้วย | ||
+ | |||
+ | '''3. ปรับปรุงโครงสร้างตารางในฐานข้อมูล''' | ||
+ | |||
+ | บางครั้งการเปลี่ยนรุ่นจะมีการปรับปรุงฐานข้อมูล ดังนั้นก่อนใช้งานจะต้องสั่งให้ระบบทำการ migrate ข้อมูลเสียก่อน โดยเข้าไปที่ <tt>~/grader/web</tt> แล้วสั่ง | ||
+ | |||
+ | rake db:migrate | ||
+ | rake db:seed | ||
− | : | + | หน้าเว็บของ Cafe grader ที่ Gitorious คือ http://gitorious.org/cafe-grader |
รุ่นแก้ไขปัจจุบันเมื่อ 08:11, 6 ตุลาคม 2555
สำหรับผู้ที่พบปัญหาในการติดตั้ง กรุณาอ่าน ปัญหาการใช้ 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