OPENECLASS & HACKEREARTH API Μονάδα Αριστείας ΕΛ/ΛΑΚ ΤΕΙ Αθήνας Δημοσθένης Νικούδης Κύκλος Εκπαίδευσης «Συστήματα Ηλεκτρονικής Μάθησης & Ηλεκτρονική Αξιολόγηση»
Στόχος Θα δημιουργήσουμε μια διασύνδεση του Openeclass με το API του hackerearth.com έτσι ώστε όταν ανεβαίνει μια εργασία με κατάληξη.py, αυτή να εκτελείται και το output να προστίθεται ως σχόλιο βαθμολογητή. Στη συνέχεια θα τροποποιήσουμε το interface του εργαλείου εισαγωγής εργασίας, ώστε να υπάρχει ένα checkbox που θα επιτρέπει στον καθηγητή να ενεργοποιεί ή να απενεργοποιεί αυτή τη λειτουργία σε επίπεδο εργασίας.
Βήμα 1: Προετοιμασία Προσθέτουμε το API key του hackerearth στο αρχείο config/config.php $hackerEarthKey = 'ef34f0279e1af1fd967cbf7bd6562bece9e05041'; Δημιουργούμε τη στήλη auto_judge (INT(1) ή αλλιώς TINYINT) στον πίνακα assignments στη βάση δεδομένων του openeclass
Βήμα 2: Εύρεση κώδικα υποβολής νέας εργασίας Στο αρχείο modules/work/index.php βρίσκουμε τη συνάρτηση submit_work στη γραμμή 392: function submit_work($id, $on_behalf_of = null) { Στη συνέχεια βρίσκουμε το τέλος του if($submit_ok) { στη γραμμή 525
Βήμα 3: Προσθήκη λειτουργικότητας // Auto-judge: Send file to hackearth global $hackerEarthKey; $content = file_get_contents("$workPath/$filename"); //set POST variables $url = ' $fields = array('client_secret' => $hackerEarthKey, 'source' => $content, 'lang' => 'PYTHON'); //url-ify the data for the POST foreach($fields as $key=>$value) { $fields_string.= $key.'='.$value.'&'; } rtrim($fields_string, '&'); //open connection $ch = curl_init(); //set the url, number of POST vars, POST data curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //execute post $result = curl_exec($ch); $result = json_decode($result, true); $result['run_status']['output'] = trim($result['run_status']['output']); // Add the output as a comment submit_grade_comments($id, $sid, 10, 'Output: '.$result['run_status']['output'], false); // End Auto-judge
Βήμα 4: Εύρεση κώδικα φόρμας δημιουργίας εργασίας Στο αρχείο modules/work/index.php βρίσκουμε τη συνάρτηση new_assignment στη γραμμή 554: function new_assignment() { Η μεταβλητή $tool_content περιέχει τον κώδικα html που εμφανίζεται μέσα στο εργαλείο Βρίσκουμε τον παρακάτω κώδικα στη γραμμή 596: $m[WorkAssignTo]: Όλους $m[WorkToUser]
Βήμα 5: Τροποποίηση φόρμας Προσθέτουμε τα παρακάτω: Auto-judge:
Βήμα 6: Εύρεση κώδικα δημιουργίας εργασίας Στο αρχείο modules/work/index.php βρίσκουμε τη συνάρτηση add_assignment στη γραμμή 318: function add_assignment() { Οι μεταβλητές από τη φόρμα ανακτώνονται και φιλτράρονται στις γραμμές
Βήμα 7: Προσθήκη κώδικα δημιουργίας εργασίας Στη γραμμή 329 προσθέστε: $auto_judge = filter_input(INPUT_POST, 'auto_judge', FILTER_VALIDATE_INT); Τροποποιούμε τη γραμμή 337 προσθέτοντας το νέο πεδίο auto_judge ώστε να καταχωρείται στη βάση
Βήμα 8: Προσθήκη ελέγχου στον κώδικα υποβολής εργασίας Τροποποιούμε τη γραμμή 425 $row = Database::get()->querySingle("SELECT title, group_submissions FROM assignment WHERE course_id = ?d AND id = ?d", $course_id, $id); Προσθέτουμε στο select το πεδίο auto_judge, δηλαδή SELECT title, group_submissions, auto_judge 2 γραμμές παρακάτω δημιουργούμε τη μεταβλητή: $auto_judge = $row->auto_judge;
Βήμα 8: Προσθήκη ελέγχου στον κώδικα υποβολής εργασίας Επιστρέφουμε τον κώδικα του βήματος 3 και βάζουμε όλο το block μέσα σε ένα if if($auto_judge) { … }
Ασκήσεις 1. Βελτιώστε τον κώδικα ώστε να λειτουργεί όχι μόνο για αρχεία Python αλλά για όλες τις γλώσσες που υποστηρίζει το hackerearth. Hint: Οι υποστηριζόμενες γλώσσες βρίσκονται στο documentation developer.hackerearth.comdeveloper.hackerearth.com 2. Προσθέστε τη δυνατότητα ο καθηγητής να επιλέγει, σε επίπεδο εργασίας, για ποιες γλώσσες θα είναι ενεργοποιημένη/απενεργοποιημένη η παραπάνω λειτουργικότητα.
Σας ευχαριστώ πολύ Ερωτήσεις; Μονάδα Αριστείας ΕΛ/ΛΑΚ ΤΕΙ Αθήνας