Teacher Reporting
Description
A custom Moodle quiz module which, in addition to the standard Moodle quiz features, analyzes the questions posed to the student for various qualities, such as compliance with Curriculum Standards.
The modified Moodle modules will run on a customized XS School Server operating system. Our goal is to allow results and / or grades, from student activities to be readily available to teachers. Based on their wants and needs, the teachers can then generate custom reports on a class or student and have the ability to determine what types of problems students are finding most difficult. In the end we imagine the XS environment running on an XO itself, allowing the teachers the same portability as the students.
Group Members
- Project Manager: Wesley Dillingham
- Additional Group Members: Jeremiah Green
Data Flow Diagram
Goals
- Expand upon the PHP of the Moodle Quiz Module to parse questions involving mathematical operations for characteristics contained in the Massachusetts Curriculum Framework for Mathematics.
- Have Moodle's latest stable release functioning on an XO running XS using the techniques outlined here.
- Have PHP calls successfully querying mock student results from Moodle's MySQL database running on XS.
- Parse mathematical-operation-based and tally percentage of success with each individual operation (+,-,/,* etc).
- Run Moodle with the modified quiz module on an XO running XS, The XO school Server.
- Create Moodle data flow diagram to give an understanding of how the Moodle Server and corresponding database interact with Student and Teachers machines.
- Have Moodle's latest stable release functioning in an XS School Server VirtualBox OSE Virtual Machine
"How to Play/Use" for end user
Jeremiah to add for his component - put xs on xo directions here, or in subsection.
Teachers guide
Jeremiah to add either additional information or a note to see the above section for directions.
After Class Plans
Jeremiah to add information here.
Documentation & Resources
Post XS School Server Installation Configuration:
yum groupinstall "GNOME Desktop Environment" edit /etc/inittab and change runlevel from 3 to 5 to startup in Gnome yum install mysql-server php php-mysql php-mbstring php-gd php-xmlrpc php-imap cvs service mysqld start mysqladmin -u root password 'mySecurePassword' mysql -u root -p mysql> CREATE DATABASE moodle CHARSET 'utf8'; mysql> exit; chkconfig mysqld on --starts sql server; adds root admin user; logs into server and creates DB; --turns the service on on boot. cd /var/www cvs -z3 -d:pserver:anonymous@eu.cvs.moodle.org:/cvsroot/moodle co -r MOODLE_19_STABLE moodle --download and install/update with the latest version of moodle mkdir moodledata chown -R apache:apache moodle chown -R apache:apache moodledata --make directory in /var/www/ and change permissions. edit the file /etc/httpd/conf/httpd.conf change DocumentRoot "/var/www/html" to DocumentRoot "/var/www/moodle" change <Directory "/var/www/html"> to <Directory "/var/www/moodle"> then you must restart the apache server by issuing the command: service httpd restart
Code
BEGIN{ printf("%-11s%-8s%-11s%-8s%-11s%-8s%-11s%-8s%-11s%-11s\n", "Student", "Only +", "Contains +", "Only -", "Contains -", "Only *", "Contains *", "Only /", "Contains /", "Understands OoO?") } { #*****Field Reference ************* #MAC=$1 #NAME=$2 #OPERATION=$3 #SUCCESS=$4 #************************************ #Because in the end statement we will have to loop through one of the arrays, which will be localized according #to specific aritmetic operations (- + / *). We need to account for the fact that some students may not answer a #question with one of these operations, and if we looped through that particular operation, we would not represent #that student in any of the logic containted within that loop in the END{} statment. Therefore an associative array #which absolutely, accounts for any student, contained in the .dat, the CLASS[] array. CLASS[$2] #any line that has division, but not necessarily just. if ( match($3, /\//) ) { #How many division problem student $2 encounters = divison[$2] division[$2]++ if ( $4 == "1" ) { division_correct[$2]++ } } #any line with multiplication but not neccearily just multiplication if ( match($3, /\*/) ) { #How many multiplication problem student $2 encounters = multiplication[$2] multiplication[$2]++ if ( $4 == "1" ) { multiplication_correct[$2]++ } } #any line with addition but not necessarily just addition if ( match($3, /\+/) ) { #How many addition problem student $2 encounters = addition[$2] addition[$2]++ if ( $4 == "1" ) { addition_correct[$2]++ } } #contains subtractions, excludes negative numbers, as it only matches expressions with a "-" sandwiched b/w two digits if ( match($3, /[0-9]\-[0-9]/) ) { #How many subtraction problem student $2 encounters = subtraction[$2] subtraction[$2]++ if ( $4 == "1" ) { subtraction_correct[$2]++ } } # Matches operations with ONLY DIVISION if ( match($3, /\//) && !match($3, /[0-9]\-[0-9]/) && !match($3, /\+/) && !match($3, /\*/) ) { #How many ONLY division problem student $2 encounters = 0_divison[$2] o_division[$2]++ if ( $4 == "1" ) { o_division_correct[$2]++ } } # Matches operations with ONLY SUBTRACTION if ( !match($3, /\//) && match($3, /[0-9]\-[0-9]/) && !match($3, /\+/) && !match($3, /\*/) ) { #How many ONLY subtraction problem student $2 encounters = o_subtraction[$2] o_subtraction[$2]++ if ( $4 == "1" ) { o_subtraction_correct[$2]++ } } # Matches operations with ONLY ADDITION if ( !match($3, /\//) && !match($3, /[0-9]\-[0-9]/) && match($3, /\+/) && !match($3, /\*/) ) { #How many ONLY Addition problem student $2 encounters = o_addition[$2] o_addition[$2]++ if ( $4 == "1" ) { o_addition_correct[$2]++ } } # Matches operations with ONLY MULTIPLICATION if ( !match($3, /\//) && !match($3, /[0-9]\-[0-9]/) && !match($3, /\+/) && match($3, /\*/) ) { #How many ONLY MULTIPLICATION problem student $2 encounters = o_multiplication[$2] o_multiplication[$2]++ if ( $4 == "1" ) { o_multiplication_correct[$2]++ } } #How many problems an individual student faced: for classwide statistics we simply use the built-in var NR numproblems[$2]++ #Determine if it is a compound operation if so increment by one, this requires 4 if's as we have to check if each of them exists in # conjuntion with another. #Keep track of total compounds and compounds correct. #Else-if structure required because if stringed If's were used each compound match would register twice. if ( match($3, /\//) && ( match($3, /[0-9]\-[0-9]/) || match($3, /\+/) || match($3, /\*/) ) ) { compound[$2]++ if ($4 == "1") #if correct { compound_correct[$2]++ } } else if ( match($3, /[0-9]\-[0-9]/) && (match($3, /\//) || match($3, /\+/) || match($3, /\*/) ) ) { compound[$2]++ if ($4 == "1") #if correct { compound_correct[$2]++ } } else if ( match($3, /\+/) && ( match($3, /[0-9]\-[0-9]/) || match($3, /\//) || match($3, /\*/) ) ) { compound[$2]++ if ($4 == "1") #if correct { compound_correct[$2]++ } } else if ( match($3, /\*/) && ( match($3, /\+/) || match($3, /[0-9]\-[0-9]/) || match($3, /\//) ) ) { compound[$2]++ if ($4 == "1") #if correct { compound_correct[$2]++ } } else # This allows for easy way to harness non compound statements, instead of going through a whole new slew of logic statements. { non_compound[$2]++ if ($4 == "1") #if correct { non_compound_correct[$2]++ } } if ( $4 == "1" ) {totalcorrect[$2]++} }#end of AWK_MAIN END{ #loops through all of the elements in the array CLASS[] #Here We will print out the students for (student in CLASS) { # A student doesnt understand order of operations if their is a greater than 20% difference in between compound # operations and single operation instructions, but only if lower on the compound instruction side. if ( ( (non_compound_correct[student] / non_compound[student]) - (compound_correct[student] / compound[student]) > .2 ) || ( (non_compound_correct[student] / non_compound[student]) ) < .7) { understands= "no" } else { understands= "yes" } #need to address divide by 0 issue printf("%-11s%-8s%-11s%-8s%-11s%-8s%-11s%-8s%-11s%-11s\n", student, int(o_addition_correct[student]*100/o_addition[student]), int(addition_correct[student]*100/addition[student]), int(o_subtraction_correct[student]*100/o_addition[student]), int(subtraction_correct[student]*100/subtraction[student]), int(o_multiplication_correct[student]*100/o_multiplication[student]), int(multiplication_correct[student]*100/multiplication[student]), int(o_division_correct[student]*100/o_division[student]), int(division_correct[student]*100/division[student]), understands) } } #end of AWK_END