ron santos simon fraser university ron santos simon fraser university stats all folks! extracting...
TRANSCRIPT
Ron SantosSimon Fraser University
Ron SantosSimon Fraser University
Stats all folks! Extracting usable statistics from Blackboard
Vista using the Powersight Module and a little elbow grease
Stats all folks! Extracting usable statistics from Blackboard
Vista using the Powersight Module and a little elbow grease
• Sample Graphs using the Powersight tables (e.g. course growth, student distribution, tool distribution)
• Sample SQL used to generate the reports
• Other uses (beyond graphs and stats)
• Perl modules
• Google Analytics
Presentation available at http://get.sfu.ca/bbworld09
What will you learn in this session?
• Named after famous explorer• Opened on September 9, 1965• Located on British Columbia, Canada• One University - Three campuses
– Burnaby– Vancouver– Surrey
• 900 faculty• 1600 staff• 100,000 alumni
Simon Fraser1776 -1862
Simon Fraser University
• Student Enrollments (Fall2008)
• Products used: Peoplesoft, LDAP/CAS3, Blackboard Vista 8.0.2• Blackboard/WebCT history
CE3 CE4 CE6 Vista4 Vista8
2000 2003 2006 2007 2008
• Blackboard Vista setup– 6 Managed nodes (1 protected JMS server)– Oracle 10g (~500GB)– Sun Sparc Solaris 10
Simon Fraser University
Unique students in at least 1 class
Total student enrollments in courses
Undergraduates 22,822 73,535
Graduates 4,258 7,726
Course Growth GraphSELECT
source_name, source_id
FROM
rpt_learning_context
WHERE
ims_value = 'SECTION'
AND
source_id LIKE '<semCode>-%'
sourced.id = <semCode>-<courseName>-<courseNumber>-<courseSection> (e.g. 1094-math-100-d100)
Number of Unique StudentsSELECT
COUNT (DISTINCT p.person_id)
FROM
rpt_learning_context lc, rpt_member m, rpt_person p
WHERE lc.learning_context_id = m.learning_context_id
AND p.person_id = m.person_id
AND m.active = 1
AND m.role = 'SSTU'
AND p.demo_user = 0
AND lc.source_id LIKE '$semCode-%'
sourced.id = <semCode>-<courseName>-<courseNumber>-<courseSection> (e.g. 1094-math-100-d100)
Course Levels GraphSELECT
COUNT(*)
FROM
rpt_learning_context
WHERE
ims_value = 'SECTION'
AND
source_id LIKE '$semCode-%-d1%'
sourced.id = <semCode>-<courseName>-<courseNumber>-<courseSection> (e.g. 1094-math-100-d100)
Student Levels GraphSELECT
COUNT(DISTINCT p.person_id)
FROM
rpt_learning_context lc, rpt_member m, rpt_person p
WHERE lc.learning_context_id = m.learning_context_id
AND p.person_id = m.person_id
AND m.active = 1
AND p.demo_user = 0
AND m.role = 'SSTU'
AND lc.source_id LIKE '$semCode-%-d1%'
sourced.id = <semCode>-<courseName>-<courseNumber>-<courseSection> (e.g. 1094-math-100-d100)
SELECT
(SELECT lc2.name FROM rpt_learning_context lc2 WHERE b.learning_context_id = lc.parent_learning_context_id) as Parent,
lc.name,
lc.source_name,
lc.source_id
FROM rpt_learning_context lc, rpt_member m, rpt_person p
WHERE lc.learning_context_id = m.learning_context_id
AND p.person_id = m.person_id
AND m.role = 'SDES'
AND lc.ims_value = 'SECTION'
AND m.active = 1
AND p.source_name = '<sourced.id_source>'
AND p.source_id = ’<sourced.id_id>'
Other uses
• Application level– DBI - http://dbi.perl.org/
• DBI stands for database interface• Allows Perl of running SQL queries
– Text::CSV::Simple - http://search.cpan.org/~tmtm/Text-CSV-Simple-1.00/lib/Text/CSV/Simple.pm
• Parser for CSV files
– GD::Graph - http://search.cpan.org/~bwarfield/GDGraph-1.44/Graph.pm
• Graphing module for Perl5
Perl modules
• Database level– DBD::Proxy driver
-http://search.cpan.org/~timb/DBI-1.609/lib/DBI/ProxyServer.pm http://docstore.mik.ua/orelly/linux/dbi/ch08_02.htm
• Module for implementing a proxy for the DBI proxy driver• Allows PERL access to a database over the network• DBI proxy architecture allows for on-the-fly compression of query and result
data, and also encryption of that data. These two facilities make DBI a powerful tool for pulling large results sets of data over the network
– dbiproxy • A proxy server for the DBD::Proxy driver
• This tool is just a front end for the DBI::ProxyServer package
• /usr/local/bin/dbiproxy --configfile /etc/dbiproxy.cfg
– Perl DBD::Oracle - http://search.cpan.org/~pythian/DBD-Oracle-1.23/Oracle.pm
• Oracle database driver for the DBI module
Perl modules
{
facility => 'daemon',
pidfile => '/var/dbiproxy/dbiproxy.pid',
user => 'nobody',
group => 'nobody',
localport => '3333',
mode => 'fork',
user => 'nobody',
group => 'nobody',
# Access control
clients => [
# Accept the local LAN ( 192.168.1.* )
{
mask => '^192\.168\.1\.\d+$',
accept => 1,
users => [ 'wctsupport' ],
},
Perl modules
# Accept our off-site machines ( 192.168.2.* ) but with a cipher
{
mask => '^192\.168\.2\.\d+$',
accept => 1,
users => [ 'wctsupport' ],,
cipher => Crypt::IDEA->new( 'be39893df23f98a2' )
},
# Deny everything else
{
# any IP-address is meant here
mask => '^(\d+)\.(\d+)\.(\d+)\.(\d+)$',
accept => 0,
}
]
}
• Sample access configuration for the DBI proxy server (/etc/dbiproxy.cfg)
• Basic Perl script
1. Connect to DB (via DBI Proxy) $dsn = "DBI:Proxy:hostname=$hostname;port=$port;dsn=DBI:Oracle:$sid";
$dbh = DBI -> connect($dsn, $user, $passwd) || die ("Database connection failed.");
2. Run SQL my $sth = $dbh -> prepare( $sql);
$sth -> execute();
while ( @row = $sth -> fetchrow_array ) {
push ( @return, @row);
}
3. Store SQL results into a CSV file
4. Parse CSV file using Text::CSV::Simplemy $parser = Text::CSV::Simple->new();
my @data = $parser->read_file($file);
Perl modules
5. Graph CSV using GD::Graphmy $graph = GD::Graph::linespoints->new(600, 500);
$graph->set(
x_label => 'Year',
x_label_position => 0.5,
y_label => 'Course Per Semester',
title => 'WebCT Course Growth',
y_max_value => 700,
y_tick_number => 7,
zero_axis_only => 0,
zero_axis => 0,
show_values => 1,
markers => [1, 5, 8],
marker_size => 3,
skip_undef => 1,
transparent => 0,
) or die $graph->error;
my $format = $graph->export_format;
open (IMG, ">$image") or die ("Error creating $image\n");;
binmode IMG;
print IMG $graph->plot(\@data)->$format();
close IMG;
Perl modules
• Require Google account• Need custom entry page for Blackboard• Simply put the tracking code (JavaScript) immediately before the
</body> tag of each page you want to track (entry page, login, logout)– Example tracking code
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try{
var pageTracker = _gat._getTracker("UA-xxxxxx-x");
pageTracker._trackPageview();
} catch(err) {}
</script>
• Does not track SSO logins (e.g. logins from portals)• Personally identifiable info are not tracked (username and IP address)• Provides nice graphs and reports that can be exported & emailed
Google Analytics
• Email: [email protected]
• Who wants to print out a handout? Instead, check out my presentation on http://get.sfu.ca/bbworld09
Questions?