Volleyball Player Efficiency Rating, Part 1: Introduction
Statistics: a formal science that applies numerical data to a group of individuals or experiments. Volleyball, like many other sports, has a severe disconnect between media stats and the actual performance level of the players in the game. As coaches we must find a way to bridge this gap if we want to effectively measure our players skills and help them stay focused to achieve their goals. Box scores alone will not give you the empirical information you need to measure the output from your players.
Jim Coleman is credited with the invention of the modern volleyball statistics system. His final contribution "Scouting Opponents and Evaluating Team Performance" in The Volleyball Coaching Bible describes in detail his system of measuring the performance of individual volleyball skills. His methods have been proven to work by coaches at all levels. Case in point, Penn State who has won the last three ('07 - '09) NCAA Division I championships. How did they do it? Talent and a coach (Russ Rose) who lives by statistics.
Russ Rose attended George Williams College in Downers Grove, IL, with the intentions of becoming a basketball coach. He took two courses, Volleyball I taught by Jim Coleman and Volleyball II taught by Terry Liskveych, and proceeded to play three years on the men's volleyball team who won the NAIA national championship in 1974. Rose became immersed with volleyball writing his master's thesis at Nebraska on volleyball statistics. Now he spends his time on the bench charting performance ratings for his players during a match. He focuses mainly on his teams primary contacts and transition plays while his assistants chart the opponents. He may also have someone chart points by rotation with another person working the Data Volley computer statistics program. With these rigorous statistical methods he knows everything about his players.
Rod Schall learned these statistics methods from Jim Coleman early in his career and began development on the first computer program to chart live statistics. After writing an article on "Volleyball Statistics" in 1976 he was contacted by Doug Beal to chart live stats for the USA men's national team using this program. Sportistics is still used today by schools at various levels. Rod Schall received the 2010 USA Volleyball Medallion of Merit for his contributions.
The system of rating the performance of players in various skills works by assigning a numerical value to the result of a particular skill. The scale most known by volleyball coaches and players is the one for passing which assigns a 3 to mean three hitters available, 2 for two hitters, 1 for one hitter, and 0 for an ace or missed pass. For these statistics to be valid there must be a direct correlation between the skill rating and the probability of scoring a point. The difference in probability of scoring a point when one or two attackers are available is statistically insignificant. With this in mind, Sportistics uses a (0-4) point scale to rate passing with a 3 representing either one or two hitters available:
| 0 | = when the opponent scores a point on serving. |
|---|---|
| 1 | = when the pass is only good enough to return a free ball. |
| 2 | (There is no 2) |
| 3 | = when there is a limited attack advantage. |
| 4 | = ideal for multiple attack advantage. |
The sportistics comprehensive system apples a similar (0-4) scale to all six volleyball skills including serve, pass, set, attack, block, and dig. Since all skills are based on the same rating scale, a composite value can be computed based on all six skills that generalizes a players overall contribution to the team. A sort of PER (Player Efficiency Rating) which is used in basketball that combines a player's contributions into one number with Michael Jordan at the top of the list.
What is missing is an easy method to record and calculate Volleyball Player Efficiency Ratings. In this three part series I will describe the methods we use at Concordia University Texas to record skill based performance statistics and a simple spreadsheet you can use for your calculations.
Comet with Nginx and jQuery
This is an introduction into a basic Comet setup with Nginx and jQuery. You will have to recompile Nginx with NGiNX_HTTP_Push_Module to enable the HTTP Push/Comet functionality. "NHPM" is based on the Basic HTTP Push Relay Protocol and turns Nginx into a very efficient Comet server. This simple recipe will enable you to create live asynchronous web applications utilizing long polling without the complexity of the Bayeux protocol.
First you will need to recompile Nginx with NHPM. If you run into dependency problems please review the Nginx Install Options.
Compiling Nginx with Nginx_HTTP_Push_Module:NGINX_NAME=nginx-0.7.67
cd /usr/local/src/archive
wget http://pushmodule.slact.net/downloads/$NGINX_PUSH_NAME.tar.gz
wget http://nginx.org/download/$NGINX_NAME.tar.gz
cd ..
tar zxvf archive/$NGINX_PUSH_NAME.tar.gz
tar zxvf archive/$NGINX_NAME.tar.gz
cd $NGINX_NAME
./configure --prefix=/usr/local/$NGINX_NAME \
--add-module=/usr/local/src/$NGINX_PUSH_NAME
make
sudo make install
Next we will configure a virtual host in Nginx to enable our publisher and subscriber on a single channel called "cheetah". This configuration allows the queue to hold up to 10 items, and those items will timeout after 5 seconds.
Configuration: (/usr/local/nginx-0.7.67/conf/nginx.conf)listen 81;
server_name cheetah.example.com;
root /var/www/cheetah.example.com;
location /cheetah {
push_channel_group pushmodule_cheetah;
location /cheetah/pub {
set $push_channel_id cheetah;
push_publisher;
push_message_timeout 5s; # Give the clients time
push_message_buffer_length 10; # to catch up
}
location /cheetah/sub {
set $push_channel_id cheetah;
push_subscriber;
send_timeout 3600;
}
}
}
Here is the code for the subscriber that will listen for incoming messages and simply display them. Notice the the use of "If-None-Match" and "If-Modified-Since". These headers are used to traverse the messages in the queue. The ETAG header is used to uniquely identify messages with the same modification time.
Listen.html: (/var/www/cheetah.example.com/listen.html)"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Listen</title>
<script type="text/javascript" language="javascript"
charset="utf-8" src="/jquery/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript">
<![CDATA[
function listen(last_modified, etag) {
$.ajax({
'beforeSend': function(xhr) {
xhr.setRequestHeader("If-None-Match", etag);
xhr.setRequestHeader("If-Modified-Since", last_modified);
},
url: '/cheetah/sub',
dataType: 'text',
type: 'get',
cache: 'false',
success: function(data, textStatus, xhr) {
etag = xhr.getResponseHeader('Etag');
last_modified = xhr.getResponseHeader('Last-Modified');
div = $('<div class="msg">').text(data);
info = $('<div class="info">').text('Last-Modified: ' + last_modified + ' | Etag: ' + etag);
$('#data').prepend(div);
$('#data').prepend(info);
/* Start the next long poll. */
listen(last_modified, etag);
},
error: function(xhr, textStatus, errorThrown) {
$('#data').prepend(textStatus + ' | ' + errorThrown);
}
});
};
$(function() {
/* Start the first long poll. */
/* setTimeout is required to let the browser know
the page is finished loading. */
setTimeout(function() {
listen('', '');
}, 500);
});
]]>
</script>
<style type="text/css">
#data {
margin: .5em;
}
#data .info {
font-weight: bold;
font-size: 14px;
}
#data .msg {
white-space: pre;
font-family: courier;
font-size: 14px;
margin-bottom: .5em;
margin-left: .5em;
}
</style>
</head>
<body>
<div id="data"></div>
</body>
</html>
This is the publisher that will put messages into the queue.
Send.html: (/var/www/cheetah.example.com/send.html)"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Send</title>
<script type="text/javascript" language="javascript"
charset="utf-8" src="/jquery/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript">
<![CDATA[
function showResult(status, response) {
$('#result').html('<strong>status:</strong> ' + status +
'<br /><strong>response:</strong><br />' + response);
};
$(function() {
$('#pub').submit(function() {
message = $('#message').val();
/* Do not send empty message */
if (message == '') {
return false;
}
$.ajax({
url: '/cheetah/pub',
data: message,
dataType: 'text',
type: 'post',
success: function(responseText, textStatus, xhr) {
showResult(textStatus, responseText);
},
error: function(xhr, textStatus, errorThrown) {
showResult(textStatus, errorThrown);
}
});
return false;
});
});
]]>
</script>
</head>
<body>
<form id="pub" method="post" action="/_istat/pub">
<input type="text" class="message" name="message" id="message" />
<input class="submit" type="submit" value="send" />
</form>
<div id="result"></div></div>
</body>
</html>
(http://cheetah.example.com:81/send.html)
(http://cheetah.example.com:81/listen.html)
PHP Publish
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $msg);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($ch);
curl_close($ch);
Linux Pipe Viewer – MySQL
How long does it take to backup/restore a MySQL database?
This is a common question I used to ask myself at least once a month. It would always be crunch time, and a database table needed to be copied to another server. This is an easy task when the table only has 100 rows... but of course the one in question is 12GB on disk. How do we measure this? How long will this take?
Again I use pipe viewer to answer this. Lets go over a basic example working with a full database including all the tables. The raw InnoDB and MyISAM data files consume 1.3GB. We will assume the most basic mysqldump command ignoring triggers and routines. The task at hand is to perform a backup, and to reload from this backup all while giving good estimates on the time required.
First, we need the initial backup size. This means we have to perform a full backup without knowing how long it will take.
real 0m21.370s
user 0m13.107s
sys 0m5.603s
[user@server ~]$ ls -lh db.sql
-rw-rw-r-- 1 user user 882M Jan 17 14:35 db.sql
Already we can see this backup took 21 seconds and uses 882MB. The problem is that we did not know anything while the backup was taking place. Now that we know the backup size we can use this value in pipe viewer.
Here is the example again using pipe viewer to estimate the backup size...
881MB 0:00:19 [45.3MB/s] [=========================> ] 99%
Notice this does not reach 100%. Lets fix this by using the actual byte size..
-rw-rw-r-- 1 user user 924259742 Jan 17 15:31 db.sql
[user@server ~]$ mysqldump -h dbserver database | pv -s 924259742 > db.sql
881MB 0:00:17 [ 49MB/s] [=================================>] 100%
Score! If we know the end size of a backup, we can estimate how long it will take. In this case it took 17 seconds.
Now lets restore from this backup. This time I will show you an example of the progress bar early in the process showing a percentage complete and an estimated time to completion of 4 minutes and 12 seconds to go.
136MB 0:00:46 [2.85MB/s] [===> ] 15% ETA 0:04:12
881MB 0:06:12 [2.37MB/s] [===========================>] 100%
Notice that we do not need to put in the size of the backup to get an accurate estimate. Here pipe viewer works like the cat utility to send the contents to stdout and into the mysql command to execute the statements. We always knew that reloading a MySQL database is slower due to calculating indexes and other I/O nonsense. Now we can start a copy or restore and know the progress and an estimated time to completion. Finally!
Linux Pipe Viewer – Network speed test
How fast is your network?
So you have that new gigabit switch and think you are going to achieve 1 Gbps? We all know that you are not going to get 100% throughput due to limitations I will not go into. There could also be a 10/100 patch panel involved that is not rated for gigabit... but, I digress. I use pipe viewer and netcat to answer this question. To start you will need to install both of these programs and open an available port on the server firewall. I used tcp port 2222 in this example. First, this command will wait for the client to connect.
Next, this command will tell you the speed in MB/s after a couple of seconds.
<strong>1.09GB 0:00:10 [ 113MB/s] [ <=> ]</strong>
Now we do some math and get this value (I like to use google for this):
113 (megabytes / second) = 904 Mbps
Roughly 90% throughput on a gigabit switch isn't too shabby! I did some more testing and have seen variances from 480 Mbps (60 MB/s) up to 912 Mbps (114 MB/s).So the question still remains... How fast is your network?
AVP Houston 2009
Here is some footage of the AVP tournament in Houston. Ticket prices were $20 per day, and due to the rain late Saturday we got in free on Sunday. I'm positive if they would have priced tickets at $10 per day, the turnout would have been greater. The product tents had t-shirts and other items priced at $20 - $25 each, and I watched as tons of people walked in and out of that area without purchasing anything. Other than the overpriced nonsense, the venue at the Westside Tennis Center was great! I really hope they decide to come to Austin, TX next year.
I got Hans Stolfus getting a nice dome shot off Dalhausser, and Casey Jennings decided to kick the ball into my camera in their match. During the semifinal match, Jake Gibb tried to rip down the net and got a yellow card twice. Be sure to watch these in 720p by clicking on the YouTube HD button!