Thoughts on setting class assessment boundaries

Knowing Where They Are

As we move towards linear assessment, in year marking and the awarding of grades is going to become increasing more important to guide students and have a gauge on progress. Here is an excel sheet that I have developed this year to help staff gain an overview of student progress within their department that can then be used within discussions with their line managers to address emerging themes across cohorts, departments and faculties.

I use this within the context of a large sixth form college where many courses have >150 students on and there are few with <40 students. This sheet comes with the following health warnings:

  1. This should not be used to make students grades match three year trends or experience extend grades.
  2. With small cohorts (<50) trends and patterns are less reliable.
  3. No-one knows what the profile of grade boundaries will look like under the linear system yet.

It can be a useful tool to review where a cohort is mid-year following assessments. I encourage departments to use this with each assessment to get any overview of the spread of results that they have given in comparison to expected outcomes and three-year trends to give a pulse measure. Further to this, I expect them to complete a cumulative version at each assessment point to a running measure of cumulative/average student achievement across the year.

How to Use the Tool 

On the first sheet you need to enter some information about your cohort and previous grade profiles. On the first sheet enter:

  • your departments historical grade profiles for the last three years.
  • the expected grade profile of your current students (referred to as MEG – minimum expected grade. You may use one of many measures to set this within your institution).
  • the maximum score for your assessment (this can be raw or percentage as long as it matches the scores that you enter in the left hand ‘student scores’ column).
  • the student scores for the current assessment / cumulative assessments.

Paste or enter your student assessment scores into the ‘student scores’ column – don’t worry about blanks if you’re pasting from a spreadsheet – these will be ignored.

Screen Shot 2016-01-17 at 10.05.45

Initial page to enter assessment grades on and grade profiles to match current assessment up against.

As soon as you have entered your trend profile, you can immediately get an visual overview of your historical data on the ‘Three Year Trend %‘ and ‘Three Year Trend (raw)‘ sheets. It will also show you summary statistics, in both raw and percentage form, of the current assessment such as maximum score, minimum score, average score (mean), as well as measures of dispersion such as range and SD. This is a useful summary sheet and I encourage staff to print this out (along with the boundaries sheet) for each standardised assessment and have this available in their departmental folders.

 

At this point, you can go to the ‘% boundaries’ and ‘Raw boundaries’ sheets and see how the scores in your current assessment compare to your three year trend and expected profile of grades. You are able to change the green cells to alter the boundaries – either by percent or by raw score depending on the sheet. As you change the grade boundaries you will see the graph update to show the new profile.

Spread of grades against three year trends and expected grade profile of cohort.

Spread of grades against three year trends and expected grade profile of cohort.

This can be used to see how the students on your current assessment, or cumulative assessments, are achieving compared to three year trends and against their expected outcome as a cohort. It can also be used to ‘award‘ grade boundaries so that they produce a spread of results that you would be comfortable with – if you are doing this though, it should not just be a case of making the current assessment ‘fit’ the shape of the expected or expected profiles.

You can download the spreadsheet below – within the zip file is a blank sheet and one with some sample data so that you can see what it can do straight away. I’d be interested in any comments, changes or additions that people make to the sheet – so if you do, please share and let me know about it.

ghani-tricks-download-button

Vanilla forum: MySQL sockets installation

This morning I wanted to hack around with Vanilla forums and convert a phpBB 3 installation over to it. After several attempts at the installer I found that I couldn’t run it ‘as is’ on my 1&1 managed server. The issue is that Vanilla’s PDO connection method has been written to only work with host access (such as localhost, or 127.0.0.1) rather than socket access (see http://www.php.net/manual/en/ref.pdo-mysql.connection.php). To get it working using a socket like: localhost:/tmp/mysql5.sock took a little hacking around in the code. Here is a wee how-to for anyone else that might come across the same problem.

There are two files that you need to be edit before you start the install:

library/core/functions.general.php
library/database/class.database.php

First open library/core/functions.general.php and find the function called GetConnectionString (I found it on line 680). It looks like this:

if (!function_exists('GetConnectionString')) {
   function GetConnectionString($DatabaseName, $HostName = 'localhost', $ServerType = 'mysql') {
      $HostName = explode(':', $HostName);
      $Port = count($HostName) == 2 ? $HostName[1] : '';
      $HostName = $HostName[0];
      $String = $ServerType.':host='.$HostName;
      if ($Port != '')
         $String .= ';port='.$Port;
      return $String .= ';dbname='.$DatabaseName;
   }
}

A simple change to the code here is to change the line:

      $String = $ServerType.':host='.$HostName;

to:

      $String = $ServerType.':unix_socket='.$HostName;

Save the file. This will ensure that you can run the install. Now you need to make sure that following the install you can point to the right database.

Moving on to the library/database/class.database.php file open this and look for the following code (line 183-195):

if(!isset($Dbname)) {
  $Dsn = $DefaultConfig['Dsn'];
} else {
  if(empty($Port)) {
    // Was the port explicitly defined with the host name? (ie. 127.0.0.1:3306)
    $Host = explode(':', $Host);
    $Port = count($Host) == 2 ? $Host[1] : '';
    $Host = $Host[0];
  }
 
  if(empty($Port)) {
    $Dsn = sprintf('host=%s;dbname=%s;', $Host, $Dbname);
  } else {
    $Dsn = sprintf('host=%s;port=%s;dbname=%s;', $Host, $Port, $Dbname);
  }
}

The initial if(!$Port) conditional needs to be commented out (or removed) and the second one needs the host changing to unix_socket. When you’re done it will look like this:

if(!isset($Dbname)) {
  $Dsn = $DefaultConfig['Dsn'];
} else {
  /* **This could be deleted**  if(empty($Port)) {
    // Was the port explicitly defined with the host name? (ie. 127.0.0.1:3306)
    $Host = explode(':', $Host);
    $Port = count($Host) == 2 ? $Host[1] : '';
    $Host = $Host[0];
  }  ** Stop deleting here */
 
  if(empty($Port)) {
    $Dsn = sprintf('unix_socket=%s;dbname=%s;', $Host, $Dbname);
  } else {
    $Dsn = sprintf('unix_socket=%s;port=%s;dbname=%s;', $Host, $Port, $Dbname);
  }
}

When this is done go to the install page and complete all your database access details as normal, until you come to the host. You need to remove localhost from your host; it should look something like /tmp/mysql5.sock rather than localhost:/tmp/mysql5.sock.

The possible issue with this is that you will not be able use this hack if you’re running MySQL on a non-default port (anything other than 3306) as we have just removed the code that Vanilla uses to strip the port number from the host.

Enjoy!

Disclaimer: This worked for me. I can’t guarantee that it will for you. It’s never a great idea to start playing around with code so if you break anything it’s not my fault!

SlideShare API without url_file_open

Recently while writing some code that utilised the SlideShare API I found myself on a server which had url_file_open turned off in the php.ini and this couldn’t be over-ridden with a .htaccess file either. So I had to re-write the code which used file_get_contents using the cURL library.

I needed to replace the get_data function within the SSUtil.php file (part of the SlideShare PHP kit). Initially it looked like this:

private function get_data($call,$params) {
	$ts=time();
	$hash=sha1($this-&gt;secret.$ts);
	try {
		$res=file_get_contents($this-&gt;apiurl.$call."?api_key=$this-&gt;key&amp;ts=$ts&amp;hash=$hash".$params);
	} catch (Exception $e) {
	// Log the exception and return $res as blank
	}
	return utf8_encode($res);
}

Following some time spent with google and a bit or trial-and-error I came up with this which seems to work in its place:

private function get_data($call,$params) {
	$timeout=0;
	$ts=time();
	$hash=sha1($this-&gt;secret.$ts);
	# use CURL library to fetch remote file
	try {
		$ch = curl_init();
		$url = $this-&gt;apiurl.$call."?api_key=$this-&gt;key&amp;ts=$ts&amp;hash=$hash".$params;
		curl_setopt ($ch, CURLOPT_URL, $url);
		curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
		$this-&gt;file_contents = curl_exec($ch);
		$res = $this-&gt;file_contents;	
	} catch (Exception $e) {
		// Log the exception and return $res as blank
	}
	return utf8_encode($res);
}

So, for any other unlucky souls who find themselves on a server which doesn’t support url_file_open then there you are.